/// <summary> /// Processes authentication result from the server. /// Method could return synchronously or asynchronously. /// </summary> private void ProcessAuthResponse(string responseData, Action <LiveLoginResult> callback) { if (string.IsNullOrEmpty(responseData)) { // non-connected user scenario. return status unknown. callback(new LiveLoginResult(LiveConnectSessionStatus.Unknown, null)); return; } Uri responseUrl; try { responseUrl = new Uri(responseData, UriKind.Absolute); } catch (FormatException) { callback(new LiveLoginResult( new LiveAuthException(AuthErrorCodes.ServerError, ResourceHelper.GetString("ServerError")))); return; } if (!string.IsNullOrEmpty(responseUrl.Fragment)) { callback(this.ParseResponseFragment(responseUrl.Fragment)); return; } if (!string.IsNullOrEmpty(responseUrl.Query)) { IDictionary <string, object> parameters = LiveAuthClient.ParseQueryString(responseUrl.Query); if (parameters.ContainsKey(AuthConstants.Code)) { var authCode = parameters[AuthConstants.Code] as string; if (!string.IsNullOrEmpty(authCode)) { var refreshOp = new RefreshTokenOperation( this, this.clientId, authCode, this.redirectUri, this.syncContext); refreshOp.OperationCompletedCallback = callback; refreshOp.Execute(); return; } } else if (parameters.ContainsKey(AuthConstants.Error)) { callback(GetErrorResult(parameters)); return; } } callback( new LiveLoginResult( new LiveAuthException(AuthErrorCodes.ServerError, ResourceHelper.GetString("ServerError")))); }
/// <summary> /// Parse the response data. /// </summary> private LiveLoginResult ParseResponseFragment(string fragment) { Debug.Assert(!string.IsNullOrEmpty(fragment)); LiveLoginResult loginResult = null; IDictionary <string, object> result = LiveAuthClient.ParseQueryString(fragment); if (result.ContainsKey(AuthConstants.AccessToken)) { LiveConnectSession sessionData = CreateSession(this, result); loginResult = new LiveLoginResult(LiveConnectSessionStatus.Connected, sessionData); } else if (result.ContainsKey(AuthConstants.Error)) { loginResult = GetErrorResult(result); } return(loginResult); }