Click here to Skip to main content
15,885,366 members
Articles / Mobile Apps / Xamarin
Tip/Trick

Using Xamarin.Auth.OAuth2Authenticator with async/await

Rate me:
Please Sign up or sign in to vote.
3.50/5 (3 votes)
30 Jun 2014CPOL 21.3K   8   1
Using Xamarin.Auth.OAuth2Authenticator with async/await

Since Xamarin published the Xamarin 3 I have been playing with this.

Normally I develop apps for Windows Phone and Windows Store, and when i started to use some libraries related with Xamarin, I found some that libraries don´t use the async/awaitconcept, and for me is a fundamental.

One library that I think should use async/await but that I saw don´t use is the Xamarin.Auth!

For how that uses Xamarin.Auth.OAuth2Authenticator for authentication I recommend this solution:

For Xamarin.Android

C#
public async Task<AuthenticatorCompletedEventArgs> LoginAsync(Activity activity, bool allowCancel)
        {
             var auth = new OAuth2Authenticator(
               clientId: "<scopes here>",
               scope: "<scopes here>",
               authorizeUrl: new Uri("<url here>"),
               redirectUrl: new Uri("<url here>"))
            {
                AllowCancel = allowCancel
            };

            // If authorization succeeds or is canceled, .Completed will be fired.
             var tcs1 = new TaskCompletionSource<AuthenticatorCompletedEventArgs>();
            EventHandler<AuthenticatorCompletedEventArgs> d1 =
                (o, e) =>
                {
                    try
                    {
                        tcs1.TrySetResult(e);
                    }
                    catch (Exception ex)
                    {
                        tcs1.TrySetResult(new AuthenticatorCompletedEventArgs(null));
                    }
                };
            auth.Completed += d1;
            var intent = auth.GetUI(activity);
            activity.StartActivity(intent);
            var result = await tcs1.Task;
            auth.Completed -= d1;
            return result;
        }

And then we need to call it this way:

C#
var authService = new AuthService();
var result = await authService.LoginAsync(this, allowCancel);

For Xamarin.IOS

C#
public async Task<Account> LoginAsync(DialogViewController dialog, bool allowCancel)
        {

            var auth = new OAuth2Authenticator(
               clientId: "<scopes here>",
               scope: "<scopes here>",
               authorizeUrl: new Uri("<url here>"),
               redirectUrl: new Uri("<url here>"))
            {
                AllowCancel = allowCancel
            };

            // If authorization succeeds or is canceled, .Completed will be fired.
            var tcs1 = new TaskCompletionSource<AuthenticatorCompletedEventArgs>();
            EventHandler<AuthenticatorCompletedEventArgs> d1 =
                (o, e) =>
                {
                    try
                    {
                        tcs1.TrySetResult(e);
                    }
                    catch (Exception ex)
                    {
                       tcs1.TrySetResult(new AuthenticatorCompletedEventArgs(null));
                    }
                };

            try
            {
                auth.Completed += d1;
                var vc = auth.GetUI();
                dialog.PresentViewController(vc, true, null);
                var result= await tcs1.Task;
                return result.Account;
            }
            catch (Exception)
            {
               // todo handle the exception
                return null;
            }
            finally
            {
                auth.Completed -= d1;
            }
        }

And then we need to call it this way:

C#
var authService = new AuthService();
var result = await authService.LoginAsync(dialog, allowCancel);

In conclusion, i think it is very simple to use and i think it should be add to the Xamarin.Auth.

I added the sample to:
https://github.com/saramgsilva/Xamarin.Auth/tree/master/samples

and will do a pull request for the original repository.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Comments and Discussions

 
QuestionLogin by google account Pin
suchithm5-Sep-14 2:31
suchithm5-Sep-14 2:31 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.