Почему при авторизации в google не возвращает в приложение?

Пытаюсь добавить вход через Google в приложение с использованием Xamarin.Auth. В браузере авторизация проходит, все хорошо, через adb интент тоже вызывается, но в эмуляторе не возвращается в приложение, оставаясь на странице гугла. Что я делаю не так?

MainActivity.cs

global::Xamarin.Auth.Presenters.XamarinAndroid.AuthenticationConfiguration.Init(this, savedInstanceState);

MainPageViewModel

    public void Login()
    {
        string clientId;
        string redirectUrl;
    
        switch (Device.RuntimePlatform)
        {
            case Device.Android:
                clientId = googleId;
                redirectUrl = googleRedirectUrl;
                break;
            default:
                throw new System.NotImplementedException("Platform not supported: " + Device.RuntimePlatform);
        }
    
        var auth = new OAuth2Authenticator(
            clientId, 
            null,
            googleScope, 
            new Uri(googleAuth), 
            new Uri(redirectUrl),
            new Uri(accessTokenUrl),
            null,
            true);
        
        auth.Completed += OnAuthCompleted;
    
        AuthenticationState.auth = auth;
        
        var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
        presenter.Login(auth);
    }

CustomUrlSchemeInterceptorActivity.cs

[Activity(Label = "CustomUrlSchemeInterceptorActivity", NoHistory = true, LaunchMode = LaunchMode.SingleTop)]
[IntentFilter(
    new[] {Intent.ActionView},
    Categories = new[] {Intent.CategoryDefault, Intent.CategoryBrowsable},
    DataSchemes = new[]
    {
        "com.googleusercontent.apps.<id>:/oauth2redirect",
        "xamarin-auth",
        "urn:...:oob",
        "com.tn141.appname"
    },
    DataPath = "/oauth2redirect",
    AutoVerify = true)]
public class CustomUrlSchemeInterceptorActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        // До сюда не доходит
        Log.Info("[TAG]", "Auth completed fake");
    }
}

Constants

private const string googleId = "<id>";
private const string googleScope = "https://www.googleapis.com/auth/userinfo.email";
private const string googleAuth = "https://accounts.google.com/o/oauth2/v2/auth";
private const string googleRedirectUrl = "com.googleusercontent.apps.<id>:/oauth2redirect";
private const string accessTokenUrl = "https://accounts.google.com/o/oauth2/token";

UPDATE: В логах нашел "Navigation is unreachable: ..." и, при добавление в Interceptor Data Schemes просто <id>, "Navigation is blocked: ...".

UPDATE2: К сожалению, у меня не получилось решить эту проблему, поэтому я использовал Xamarin.GooglePlayServices:

  1. Поставьте соответствующие пакеты (не забудьте Xamarin.GooglePlayServices.Plus);
  2. Напишите примерно следующее в MainActivity.OnCreate:
var account = GoogleSignIn.GetLastSignedInAccount(this);
if (account != null)
{
    // В App можно передать данные о пользователе
    LoadApplication(new App());
    return;
}

var options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
    // IdToken опционален
    //.RequestIdToken("<id>")
    .RequestEmail()
    .Build();

signInClient = GoogleSignIn.GetClient(this, options);

SetContentView(Resource.Layout.MainActivity);

var signInButton = FindViewById<SignInButton>(Resource.Id.sign_in_button);
signInButton.SetSize(SignInButton.SizeStandard);

signInButton.SetOnClickListener(this);
  1. Обработчик клика OnClick:
    public void OnClick(View v)
    {
        switch (v.Id)
        {
            case Resource.Id.sign_in_button:
                var intent = signInClient.SignInIntent;
                StartActivityForResult(intent, 9001);
                break;
        }
    }
  1. Результат аутентификации:
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
    
        if (requestCode == 9001)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
            StartActivity(intent);
        }
    }

Это требует последней версии PlayServices на телефоне/эмуляторе и отображает нативное окно, а не в браузере, как в случае с Xamarin.Auth


Ответы (0 шт):