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

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.

Posts

  • alberto.palberto.p ITMember ✭✭

    @dankern did you solve the problem ? I have the same problem me too.

  • dankerndankern BRMember

    Hi Alberto!

    I solved the problem using a WebView and requesting the information as a website. I couldn't find any other way.
    If you want I can send you some code.

    Good luck!

  • NinoPadrutt.7544NinoPadrutt.7544 CHMember ✭✭

    @dankern said:
    Hi Alberto!

    I solved the problem using a WebView and requesting the information as a website. I couldn't find any other way.
    If you want I can send you some code.

    Good luck!

    Hi

    I have the same issue. Is that offer with some code examples still available? :)

  • EncryptionEncryption USMember

    Hi,

    I plan to use Xamarin.Auth in my application as well. Is this a problem just when trying to reauthorize with the Googles? Or is this something that is an issue with using Xamarin.Auth?

    If so, what did you do for the work around? Can you provide a sample snippet?

    Thanks

  • ArnoHofmannArnoHofmann DEMember

    @dankern do you like to share your code?

  • hi i am facing problem in authenticating my google account in Xamarin.iOS using xamarin.Auth ,getting the error as shown in screen shot.can somebody help me?

    ss1.png 50.3K
  • D-DD-D USMember
    edited December 2016

    Did anyone solve the problem ? I have the same problem

    Thanks in Advance

  • For anyone looking for an answer, you should have a refresh token OAuth2Authenticator, example :

            var authenticator = new OAuth2Authenticator(
                clientId,
                null,
                Constants.Scope,
                new Uri(Constants.AuthorizeUrl),
                new Uri(redirectUri),
                new Uri(Constants.AccessTokenUrl),
                null,
                true);
    

    in Account.Properties["refresh_token"].

    Then you could do something like this to get a new access token based on refresh token :

                Dictionary<string, string> dictionary = new Dictionary<string, string>{ { "refresh_token", e.Account.Properties["refresh_token"] }, { "client_id", Constants.AndroidClientId }, {"grant_type", "refresh_token" } };
                var request = new OAuth2Request("POST", new Uri(Constants.AccessTokenUrl), dictionary, e.Account);
                var response = await request.GetResponseAsync();
    
Sign In or Register to comment.