Xamarin.Auth OAuth Google API для аутентификации пользователей для Android - PullRequest
0 голосов
/ 03 января 2019

Я пытался пройти аутентификацию через Google OAuth 2.0.Следующая эта ссылка.Удалось открыть страницу авторизации Google и успешно войти в систему.Проблема после входа в систему, я перенаправлен на страницу поиска Google.Если я закрываю приложение, то в методе OnAuthCompleted OAuth2Authenticator я получаю e.IsAuthenticated в false и не могу получить какую-либо информацию о пользователе.

Код библиотеки Xamarin Share:

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;
}

Метод OnAuthCompleted

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

Основной код активности

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>

Когда я явно закрываю пользовательскую вкладку, я возвращаюсь обратно к приложению с приведенным ниже сообщением.On Google Auth CustomTabs close message

Я бы хотел, чтобы после аутентификации пользователя с помощью Google OAuth они перенаправлялись обратно в приложение, и я мог получить маркер доступа и другую информацию по мере необходимости.Я был на много ссылок по этому поводу, но не смог найти решение.Пожалуйста, помогите

1 Ответ

0 голосов
/ 20 апреля 2019

@ kinder-cappy Я заметил, что у вас в манифесте приложения есть активность перехватчика схемы URL, а также класс активности.Вам нужно будет выбрать одно, иначе у вас будет несколько намерений при запуске.

Чтобы удалить сообщение «customtabs login screen ....», добавьте его в свой MainActivity (не класс перехватчика) после Xamarin.Auth инициализация:

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

Также используйте Xamarin.Auth версии 1.5.0.3 на данный момент в Android.Это работает.

Если текущая схема URL перенаправления, которую вы указали, не работает, попробуйте получить правильный URL перенаправления из документации вашего провайдера.В моем случае я использовал Google, поэтому я использую перевернутый URL (идентификатор клиента).

...