gpt4 book ai didi

android - 适用于 Android 的 AzureAD 抛出 ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:18 26 4
gpt4 key购买 nike

我有一个应用程序,用户在 Office365 中使用 AzureAD library for Android 进行身份验证.

它运作良好,用户可以验证并使用该应用程序。不幸的是,过了一会儿,他们开始使用 ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED 作为错误代码命中 AuthenticationException

我检查了 source code AzurelAD。唯一解决这个问题的地方是 acquireTokenAfterValidation() 方法:

private AuthenticationResult acquireTokenAfterValidation(CallbackHandler callbackHandle,
final IWindowComponent activity, final boolean useDialog,
final AuthenticationRequest request) {
Logger.v(TAG, "Token request started");

// BROKER flow intercepts here
// cache and refresh call happens through the authenticator service
if (mBrokerProxy.canSwitchToBroker()
&& mBrokerProxy.verifyUser(request.getLoginHint(),
request.getUserId())) {
.......
Logger.v(TAG, "Token is not returned from backgroud call");
if (!request.isSilent() && callbackHandle.callback != null && activity != null) {
....
} else {
// User does not want to launch activity
String msg = "Prompt is not allowed and failed to get token:";
Logger.e(TAG, msg, "", ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED);
callbackHandle.onError(new AuthenticationException(
ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED, msg));
}

// It will start activity if callback is provided. Return null here.
return null;
} else {
return localFlow(callbackHandle, activity, useDialog, request);
}
}

我的源代码:

authenticator.getAccessTokenSilentSync(getMailService());

public class Authenticator {
..............
public String getAccessTokenSilentSync(ServiceInfo serviceInfo) {
throwIfNotInitialized();
return getAuthenticationResultSilentSync(serviceInfo).getAccessToken();
}

private AuthenticationResult getAuthenticationResultSilentSync(ServiceInfo serviceInfo) {
try {
return authenticationContext.acquireTokenSilentSync(
serviceInfo.ServiceResourceId,
Client.ID,
userIdentity.getAdUserId());
} catch (AuthenticationException ex) {
// HERE THE EXCEPTION IS HANDLED.
}
}
..............
}

我得到的堆栈跟踪:

    <package name>.data_access.error_handler.AuthenticationExceptionWithServiceInfo: Refresh token is failed and prompt is not allowed
at com.microsoft.aad.adal.AuthenticationContext.localFlow(AuthenticationContext.java:1294)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenAfterValidation(AuthenticationContext.java:1229)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenLocalCall(AuthenticationContext.java:1123)
at com.microsoft.aad.adal.AuthenticationContext.refreshToken(AuthenticationContext.java:1609)
at com.microsoft.aad.adal.AuthenticationContext.localFlow(AuthenticationContext.java:1261)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenAfterValidation(AuthenticationContext.java:1229)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenLocalCall(AuthenticationContext.java:1123)
at com.microsoft.aad.adal.AuthenticationContext.refreshToken(AuthenticationContext.java:1609)
at com.microsoft.aad.adal.AuthenticationContext.localFlow(AuthenticationContext.java:1261)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenAfterValidation(AuthenticationContext.java:1229)
at com.microsoft.aad.adal.AuthenticationContext.acquireTokenLocalCall(AuthenticationContext.java:1123)
at com.microsoft.aad.adal.AuthenticationContext.access$600(AuthenticationContext.java:58)
at com.microsoft.aad.adal.AuthenticationContext$4.call(AuthenticationContext.java:1072)
at com.microsoft.aad.adal.AuthenticationContext$4.call(AuthenticationContext.java:1067)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)

我正在使用的 AzureAD 库版本:1.1.7(为了防止指责太旧的版本 - 我检查了从 1.1.7 到 1.1.11 的变更列表,但没有发现任何与问题相关的内容)

问题:现在,我正在处理这个错误,作为让用户进入登录屏幕的信号。在我看来,这会给用户带来糟糕的体验。事实上,它非常经常发生并影响许多用户,这使情况变得更糟。

问题:我是否可以做任何不同的事情来避免此 AuthenticationException 或以某种方式解决它(即避免用户再次输入凭据)。

最佳答案

您是否已验证 AuthenticationContext.acquireTokenSilentSync() 确实是您希望调用的方法?

文档表明此方法将明确不显示提示。来自文档:

This is sync function. It will first look at the cache and automatically checks for the token expiration. Additionally, if no suitable access token is found in the cache, but refresh token is available, the function will use the refresh token automatically. This method will not show UI for the user. If prompt is needed, the method will return an exception.

根据此 AAD book,您获得的刷新 token 应持续两周.刷新 token 过期后,用户需要重新进行身份验证。你能用 Fiddler 或 Charles 检查网络流量并检查 token 的到期时间吗?如果您可以验证 token 在到期前未能刷新,则可能表示 AD 库中存在错误。

澄清 AuthenticationContext 方法的区别 - 有两类方法:“静默”方法(在用户需要重新验证时不会向用户显示对话框),以及非沉默。如果需要用户重新验证(或同意),非静默方法将启动包含 AAD 登录的新 Activity 。此时身份验证流程将重新启动。

此外,如果您更改应用程序在 Azure 中的注册,例如添加新的权限范围,您的用户将需要重新同意应用程序继续处理他们的数据。

关于android - 适用于 Android 的 AzureAD 抛出 ADALError.AUTH_REFRESH_FAILED_PROMPT_NOT_ALLOWED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com