问题描述
我的 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 (将#修改为@)