如何解决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 举报,一经查实,本站将立刻删除。