Почему при авторизации в 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:
- Поставьте соответствующие пакеты (не забудьте Xamarin.GooglePlayServices.Plus);
- Напишите примерно следующее в 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);
- Обработчик клика OnClick:
public void OnClick(View v)
{
switch (v.Id)
{
case Resource.Id.sign_in_button:
var intent = signInClient.SignInIntent;
StartActivityForResult(intent, 9001);
break;
}
}
- Результат аутентификации:
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