Kinder Cappy
Kinder Cappy

Reputation: 563

Xamarin.Auth OAuth Google API for user authentication for Android

I have been trying to authenticate via Google OAuth 2.0. Following this link. Have been able to open the Google Auth page and login successfully. The problem is after logging in i am redirected to the google search page. If i close the application then in the OnAuthCompleted method of the OAuth2Authenticator i get the e.IsAuthenticated to false and not able to get any information of the user.

Xamarin Share Library code:

var authenticator = new OAuth2Authenticator(
                                "somekey-somekey1.apps.googleusercontent.com",
                                null,
                                "email",
                                new Uri("https://accounts.google.com/o/oauth2/v2/auth"),
                                new Uri("com.companyname.somenameofapp:/oauth2redirect"),
                                new Uri("https://www.googleapis.com/oauth2/v4/"),
                                null,
                                true);
        var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
        presenter.Login(authenticator);
        authenticator.Completed += OnAuthCompleted;
        AuthenticationState.Authenticator = authenticator;

AuthenticationState Class

public class AuthenticationState
{
    public static OAuth2Authenticator Authenticator;
}

The OnAuthCompleted method

private async void OnAuthCompleted(object sender, AuthenticatorCompletedEventArgs e)
{
    if (e.IsAuthenticated)
    {
        await Navigation.PushAsync(new GoogleLoginSuccess());
    }
}

Main Activity Code

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;
    base.OnCreate(savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    global::Xamarin.Auth.Presenters.XamarinAndroid.AuthenticationConfiguration.Init(this, savedInstanceState);
    LoadApplication(new App());
}

CustomUrlSchemeInterceptorActivity

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace XamAppGoogleAuth.Droid
{
    [Activity(Label = "CustomUrlSchemeInterceptorActivity")]
    [IntentFilter(
        new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
        DataSchemes = new[] { "com.companyname.somenameofapp" },
        DataPath = ":/oauth2redirect",
        DataHost = "com.companyname.somenameofapp")]
    public class CustomUrlSchemeInterceptorActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            global::Android.Net.Uri uri_android = Intent.Data;

            Uri uri_netfx = new Uri(uri_android.ToString());

            // load redirect_url Page
            AuthenticationState.Authenticator.OnPageLoading(uri_netfx);

            var intent = new Intent(this, typeof(MainActivity));
            intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
            StartActivity(intent);

            this.Finish();

            return;
        }
    }
}

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.somenameofapp">
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
  <application android:label="somenameofapp.Android"></application>
  <activity android:name="somenameofapp.Android.MainActivity" android:label="MainActivity">
    <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="com.companyname.somenameofapp" android:host="com.companyname.somenameofapp" />
    </intent-filter>
  </activity>
</manifest>

When i close the Custom Tab explicitly i am navigated back to the application with the below toast message. On Google Auth CustomTabs close message

What i would want is after the user authenticates with Google OAuth, they are redirected back to the application and I can get the access token and other information as needed. I have been to a lot of links regarding this but havent been able to find a solution. Kindly help

Upvotes: 2

Views: 1674

Answers (2)

Roshan Gupta
Roshan Gupta

Reputation: 1

If the current redirect URL scheme you specified does not work, try to get the correct redirect URL from your provider documentation. In my case, I used Google so I am using the inverted URL (client id).

In your CustomUrlSchemeInterceptorActivity DataSchemes and in Redirect URI you need to put inverted URL (ie. client ID) which you can get from the developer console.

client-id : "somekey-somekey1.apps.googleusercontent.com" Redirect URI looks like : com.googleusercontent.apps.somekey-somekey1:/oauth2redirect DataSchemes = new[] { "com.googleusercontent.apps.somekey-somekey1" } at your CustomUrlSchemeInterceptorActivity

Upvotes: 0

Microwales
Microwales

Reputation: 11

@kinder-cappy I noticed you have the URL scheme interceptor activity in your application manifest as well as an activity class. You will have to choose one or else you will have multiple intent on trigger.

To remove the "customtabs login screen ...." message add this to your MainActivity (not interceptor class) after Xamarin.Auth initialization:

global::Xamarin.Auth.CustomTabsConfiguration.CustomTabsClosingMessage = null;

Also use Xamarin.Auth version 1.5.0.3 for now in android. It works.

If the current redirect URL scheme you specified does not works, try to get the correct redirect URL from your provider documentations. In my case, I used Google so I am using the inverted URL (client id).

Upvotes: 0

Related Questions