Xamarin.Auth OAuth Google API,用于Android的用户身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xamarin.Auth OAuth Google API,用于Android的用户身份验证相关的知识,希望对你有一定的参考价值。

我一直在尝试通过Google OAuth 2.0进行身份验证。关注this链接。已经能够打开Goog​​le 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消息导航回应用程序。 On Google Auth CustomTabs close message

我想要的是在用户使用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)。

以上是关于Xamarin.Auth OAuth Google API,用于Android的用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何从Xamarin Auth-Google获得访问令牌

Java.Lang.ClassNotFoundException WebAuthenticatorActivity

尝试在使用OAuth演示者时显示UINavigationController

Xamarin.Auth 或 IdentityModel + IdentityServer4

Xamarin.Auth:使用身份提供者对用户进行身份验证 [xamarin forms - Android]

使用 google-api-java-oauth 的 oauth1 示例 [关闭]