public Task<IDictionary<string, string>> AuthorizeAsync(Uri serviceUri, Uri authorizeUri, Uri callbackUri)
{
// If the TaskCompletionSource is not null, authorization is in progress
if (_taskCompletionSource != null)
{
// Allow only one authorization process at a time
throw new Exception();
}
// Create a task completion source
_taskCompletionSource = new TaskCompletionSource<IDictionary<string, string>>();
// Create a new Xamarin.Auth.OAuth2Authenticator using the information passed in
Xamarin.Auth.OAuth2Authenticator auth = new OAuth2Authenticator(
clientId: OAuthPage.AppClientId,
scope: "",
authorizeUrl: new Uri(OAuthPage.AuthorizeUrl),
redirectUrl: new Uri(OAuthPage.OAuthRedirectUrl));
// Allow the user to cancel the OAuth attempt
auth.AllowCancel = true;
// Define a handler for the OAuth2Authenticator.Completed event
auth.Completed += (sender, authArgs) =>
{
try
{
// Dismiss the OAuth UI when complete
this.DismissViewController(true, null);
// Throw an exception if the user could not be authenticated
if (!authArgs.IsAuthenticated)
{
throw new Exception("Unable to authenticate user.");
}
// If authorization was successful, get the user's account
Xamarin.Auth.Account authenticatedAccount = authArgs.Account;
// Set the result (Credential) for the TaskCompletionSource
_taskCompletionSource.SetResult(authenticatedAccount.Properties);
}
catch (Exception ex)
{
// If authentication failed, set the exception on the TaskCompletionSource
_taskCompletionSource.SetException(ex);
}
};
// If an error was encountered when authenticating, set the exception on the TaskCompletionSource
auth.Error += (sndr, errArgs) =>
{
if (errArgs.Exception != null)
{
_taskCompletionSource.TrySetException(errArgs.Exception);
}
else
{
_taskCompletionSource.TrySetException(new Exception(errArgs.Message));
}
};
// Present the OAuth UI (on the app's UI thread) so the user can enter user name and password
InvokeOnMainThread(() =>
{
this.PresentViewController(auth.GetUI(), true, null);
});
// Return completion source task so the caller can await completion
return _taskCompletionSource.Task;
}
#endregion