我一直在尝试通过Google OAuth 2.0进行身份验证。关注this链接。已经能够打开Google Auth页面并成功登录。问题是登录后我被重定向到谷歌搜索页面。如果我关闭应用程序然后在OAuth2Authenticator的OnAuthCompleted方法中,我将e.IsAuthenticated设置为false并且无法获取用户的任何信息。
Xamarin共享库代码:
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类
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>
当我明确关闭自定义选项卡时,我会使用以下Toast消息导航回应用程序。
我想要的是在用户使用Google OAuth进行身份验证后,他们会被重定向回应用程序,我可以根据需要获取访问令牌和其他信息。我已经有很多关于此的链接,但还没有找到解决方案。请帮助
@ kinder-cappy我注意到你的应用程序清单中有一个URL方案拦截器活动以及一个活动类。您将不得不选择一个,否则您将有多个触发意图。
要删除“customtabs登录屏幕....”消息,请在MainActivity
初始化后将其添加到Xamarin.Auth
(不是拦截器类):
global::Xamarin.Auth.CustomTabsConfiguration.CustomTabsClosingMessage = null;
现在也在Android中使用Xamarin.Auth版本1.5.0.3。有用。
如果您指定的当前重定向URL方案不起作用,请尝试从提供商文档中获取正确的重定向URL。在我的情况下,我使用谷歌,所以我使用倒置的URL(客户端ID)。