Quantcast
Channel: Recent Threads — Xamarin Community Forums
Viewing all articles
Browse latest Browse all 204402

Google OAuth 2 - How to get refresh token using Xamarin.Auth?

$
0
0

0
down vote
favorite
I'm using Xamarin.Auth to authenticate the user and have access to the Google Calendar API. I'm able to get an access token and do whatever I need. The problem is the access_token I receive expires after one hour. I looked for examples and information about this in several posts but I'm still not able to ask for new tokens. Here is the code I'm using in my Xamarin.Droid Project:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

    global::Xamarin.Forms.Forms.Init(this, bundle);
    LoadApplication(new App());

    #region [GoogleAuthentication]

    if (App.auth == null)
    {
        App.auth = new GoogleAuthenticator(App.WebApplicationClientID,
        new Uri("https://www.googleapis.com/plus/v1/people/me"),
        CalendarService.Scope.Calendar);
    }

    // We don't want to have to login every time, so we'll use the Xamarin.Auth AccountStore
    AccountStore store = AccountStore.Create(this);
    Account savedAccount = store.FindAccountsForService("google").FirstOrDefault();
    if (savedAccount != null)
    {
        App.auth.Account = savedAccount;
    }
    else
    {
        App.auth.Completed += (sender, args) =>
        {
            if (args.IsAuthenticated)
            {
                // Save the account for the future
                store.Save(args.Account, "google");
            }
        };

        Intent loginIntent = App.auth.GetUI(this);
        StartActivity(loginIntent);
    }

    #endregion [GoogleAuthentication]
}

The GoogleAuthenticator class implements OAuth2Authenticator as seen below:

public class GoogleAuthenticator
: OAuth2Authenticator
{
public GoogleAuthenticator(string clientId, Uri callbackUri, params string[] scopes)
: base(
clientId,
(scopes ?? Enumerable.Empty()).Aggregate(string.Empty, (o, s) => o + " " + s),
new Uri("https://accounts.google.com/o/oauth2/auth"),
callbackUri,
null)
{
Completed += (sender, args) =>
{
Account = args.Account;
};
}

public Account Account
{
    get;
    set;
}

public void ApplyAuthenticationToRequest(HttpWebRequest request)
{
    if (Account == null)
        throw new InvalidOperationException("You must be authenticated to make requests");

    string token = Account.Properties["access_token"];
    string type = Account.Properties["token_type"];
    request.Headers[HttpRequestHeader.Authorization] = String.Format("{0} {1}", type, token);
}

}

I tried changing the authorizationUrl adding the parameters approval_prompt=force and access_type=offline but it didn't work too.

How can I get the refresh_token using Xamarin.Auth?

Thanks.


Viewing all articles
Browse latest Browse all 204402

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>