微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin OpenId.AppAuth 回调适用于 iOS,但不适用于 Android

如何解决Xamarin OpenId.AppAuth 回调适用于 iOS,但不适用于 Android

我的 Xamarin.OpenId.AppAuth.Android 基于 openid 的登录过程有问题。当登录过程结束时,不会调用回调 uri 并且 webview 保持打开状态。这仅在 Android 上发生,而在 iOS 上我没有问题。

我按照这篇文章第一次实现

https://developer.okta.com/blog/2018/05/01/add-authentication-xamarin-openid-connect

这是我的代码

清单

<application android:theme="@style/MainTheme" android:usesCleartextTraffic="true" android:label="My App" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round">
    <activity android:name="net.openid.appauth.RedirectUriReceiverActivity" tools:node="replace">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="my.app" android:host="openid" />
        </intent-filter>
    </activity>
</application>
<queries>
    <intent>
        <action android:name="android.support.customtabs.action.CustomTabsService" />
    </intent>
</queries>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

方法

public async Task<AuthInfo> LoginAsync()
    {
        try
        {
            var serviceConfiguration = await AuthorizationServiceConfiguration.FetchFromUrlAsync(
                Android.Net.Uri.Parse(Constants.discoveryEndpoint));

            MakeAuthRequest(serviceConfiguration,new AuthState());
            await _loginResultWaitHandle.WaitAsync();
        }
        catch (AuthorizationException ex)
        {
            Console.WriteLine("Failed to retrieve configuration:" + ex);
        }

        return new AuthInfo()
        {
            IsAuthorized = _authState?.IsAuthorized ?? false,Accesstoken = _authState?.Accesstoken,IdToken = _authState?.IdToken,RefreshToken = _authState?.RefreshToken,Scope = _authState?.Scope
        };
    }

    private void MakeAuthRequest(
        AuthorizationServiceConfiguration serviceConfig,AuthState authState)
    {

        var authRequest = new AuthorizationRequest.Builder(
                serviceConfig,Constants.ClientId,ResponseTypeValues.Code,Android.Net.Uri.Parse(Constants.RedirectUri))
            .SetScope(string.Join(" ",Constants.Scopes))
            .Build();

        var postAuthorizationIntent = CreatePostAuthorizationIntent(
            MainActivity.Instance,authRequest,serviceConfig.discoveryDoc,authState,Constants.ClientSecret);

        _authService.PerformAuthorizationRequest(
            authRequest,postAuthorizationIntent);
    }


    private PendingIntent CreatePostAuthorizationIntent(
        Context context,AuthorizationRequest request,AuthorizationServicediscovery discoveryDoc,AuthState authState,string clientSecret)
    {

        var intent = new Intent(context,typeof(MainActivity));
        intent.PutExtra(Constants.AuthStateKey,authState.JsonSerializeString());

        if (discoveryDoc != null)
        {
            intent.PutExtra(
                Constants.AuthServicediscoveryKey,discoveryDoc.DocJson.ToString());
        }

        if (clientSecret != null)
        {
            intent.PutExtra("clientSecret",clientSecret);
        }


        return PendingIntent.GetActivity(context,request.GetHashCode(),intent,0);
    }

回调

protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);

        if (intent != null && LoginProvider.Current != null)
        {
            LoginProvider.Current.NotifyOfCallback(intent);
        }
    }

我用这个 adb 命令测试了回调 uri 并工作

adb shell am start -d my.app://openid

我的错误在哪里? ?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。