为什么 Google 身份验证令牌刷新最近在 Android 的 Azure 移动应用程序 SDK 中不断失败
Why Google authentication token refresh keeps failing recently in Azure Mobile Apps SDK for Android
我有一个 android 应用程序实现了 azure 移动 SDK (com.microsoft.azure: azure-mobile-android:3.5.1@aar)
在我的应用程序中,我使用带有刷新令牌的 Google 身份验证方法(如 Azure Mobile Apps documentation 中所述)。
身份验证已经运行了将近 2 年。在过去的 10 天里(未进行任何更改),如果上次刷新是在 60 分钟或更长时间之前进行的,我的用户将无法再刷新他们的身份验证令牌。只有在 1 小时内调用刷新才会成功。如果刷新失败(这种情况经常发生),我必须强制用户使用 Google 同意屏幕再次登录以获得新令牌。以前不会发生这种情况,因为即使在上次刷新几天后,令牌也可能会刷新。有什么问题吗?我的 Azure 服务计划类型为 D1:共享。
如果在上次刷新后超过 1 小时调用 refreshUser() 方法,用户会在其 android 设备中看到此错误消息:
Google authentication refresh failed.Refresh failed with a 401 Unauthorized error. Credentials are no longer valid.
在日志流中(在 portal.azure 中)我看到以下消息:
HTTP Error 401.83 - Unauthorized You do not have permission to view this directory or page.Most likely causes:The authenticated user does not have access to a resource needed to process the request.Things you can try:Create a tracing rule to track failed requests for this HTTP status code.
这是我的身份验证方法:
private void authenticate() {
// Sign in using the Google provider.
HashMap parameters = new HashMap<>();
parameters.put("access_type", "offline");
parameters.put("prompt", "consent");
mClient.login(MobileServiceAuthenticationProvider.Google, url_scheme_of_your_app, GOOGLE_LOGIN_REQUEST_CODE, parameters);
}
这是我遵循移动应用程序文档的刷新令牌方法:
private void refreshToken(){mClient.refreshUser(new UserAuthenticationCallback() {
@Override
public void onCompleted(MobileServiceUser user, Exception exception, ServiceFilterResponse response) {
if (user != null && exception == null) {
/*refresh succeeded*/
} else {
/*refresh failed*/
String message = "+"%s authentication refresh failed.Error: %s", "Google",exception.getMessage())";}}}); }
Azure 门户中的身份验证设置:
看起来 Azure 应用服务 Authentication/Authorization 功能在令牌刷新的默认值中有回归(以前是 72 小时,现在没有设置,所以默认为 1 小时).我们将在即将发布的版本(接下来的几周)中修复此问题。
同时,您可以通过以下步骤手动配置此值:
导航到订阅 > (subName) > resourceGroups > (resourceGroupName) > providers > Microsoft.Web > sites > (siteName) > config > authSettings.
点击编辑
将"tokenRefreshExtensionHours"设为72。
点击放置
这应该会恢复原来的行为,即使我们将默认值改回 72 小时,它仍然会起作用。
我有一个 android 应用程序实现了 azure 移动 SDK (com.microsoft.azure: azure-mobile-android:3.5.1@aar) 在我的应用程序中,我使用带有刷新令牌的 Google 身份验证方法(如 Azure Mobile Apps documentation 中所述)。 身份验证已经运行了将近 2 年。在过去的 10 天里(未进行任何更改),如果上次刷新是在 60 分钟或更长时间之前进行的,我的用户将无法再刷新他们的身份验证令牌。只有在 1 小时内调用刷新才会成功。如果刷新失败(这种情况经常发生),我必须强制用户使用 Google 同意屏幕再次登录以获得新令牌。以前不会发生这种情况,因为即使在上次刷新几天后,令牌也可能会刷新。有什么问题吗?我的 Azure 服务计划类型为 D1:共享。
如果在上次刷新后超过 1 小时调用 refreshUser() 方法,用户会在其 android 设备中看到此错误消息:
Google authentication refresh failed.Refresh failed with a 401 Unauthorized error. Credentials are no longer valid.
在日志流中(在 portal.azure 中)我看到以下消息:
HTTP Error 401.83 - Unauthorized You do not have permission to view this directory or page.Most likely causes:The authenticated user does not have access to a resource needed to process the request.Things you can try:Create a tracing rule to track failed requests for this HTTP status code.
这是我的身份验证方法:
private void authenticate() {
// Sign in using the Google provider.
HashMap parameters = new HashMap<>();
parameters.put("access_type", "offline");
parameters.put("prompt", "consent");
mClient.login(MobileServiceAuthenticationProvider.Google, url_scheme_of_your_app, GOOGLE_LOGIN_REQUEST_CODE, parameters);
}
这是我遵循移动应用程序文档的刷新令牌方法:
private void refreshToken(){mClient.refreshUser(new UserAuthenticationCallback() {
@Override
public void onCompleted(MobileServiceUser user, Exception exception, ServiceFilterResponse response) {
if (user != null && exception == null) {
/*refresh succeeded*/
} else {
/*refresh failed*/
String message = "+"%s authentication refresh failed.Error: %s", "Google",exception.getMessage())";}}}); }
Azure 门户中的身份验证设置:
看起来 Azure 应用服务 Authentication/Authorization 功能在令牌刷新的默认值中有回归(以前是 72 小时,现在没有设置,所以默认为 1 小时).我们将在即将发布的版本(接下来的几周)中修复此问题。
同时,您可以通过以下步骤手动配置此值:
导航到订阅 > (subName) > resourceGroups > (resourceGroupName) > providers > Microsoft.Web > sites > (siteName) > config > authSettings.
点击编辑
将"tokenRefreshExtensionHours"设为72。
点击放置
这应该会恢复原来的行为,即使我们将默认值改回 72 小时,它仍然会起作用。