如何处理 Xamarin MobileServiceClient 中过期的身份验证令牌?

How to handle expired auth tokens in Xamarin MobileServiceClient?

我在 Xamarin.Forms 中使用客户端流身份验证,并且正在尝试找出身份验证令牌过期时的处理方式。

我的代码:

初始登录时,用户使用本机 Facebook SDK 登录,我将 access_token 传递给 MobileServiceClient 以取回经过身份验证的用户。

var user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token).ConfigureAwait(false);

然后我将用户的 UserIdMobileServiceAuthenticationToken 保存在本地设置中(使用 Xam.Plugins.Settings 插件)。 下次用户打开应用程序时,我从设置中设置用户并跳过手动登录:

if (!string.IsNullOrWhiteSpace(Settings.AuthToken) && !string.IsNullOrWhiteSpace(Settings.UserId))
{
    client.CurrentUser = new MobileServiceUser(Settings.UserId);
    client.CurrentUser.MobileServiceAuthenticationToken = Settings.AuthToken;
}

我的问题:

效果很好。但是,我知道 MobileServiceAuthenticationToken 已经过期了。当达到到期日期时,我的应用程序会发生什么?如何在不要求用户重新登录 Facebook 的情况下刷新令牌?我尝试了 MobileServiceClient 的 RefreshUserAsync() 方法,但出现以下异常:

Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: Refresh failed with a 400 Bad Request error. The identity provider does not support refresh, or the user is not logged in with sufficient permission.

有没有办法测试这个? (因为令牌从现在起 3 个月后到期。)感谢您的帮助!

Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: Refresh failed with a 400 Bad Request error. The identity provider does not support refresh, or the user is not logged in with sufficient permission.

由于您使用的是客户端流身份验证,因此无法使用 RefreshUserAsync() 刷新 MobileServiceAuthenticationToken。您的移动后端未缓存用于更新身份验证令牌的相关 access_tokenrefresh_token

Is there a way to test this? (since the token expiration is 3 months from now.) Thanks for the help!

AFAIK,MobileServiceAuthenticationToken 默认过期时间为一小时,您可以使用 https://jwt.io/ to decode your token and check the exp property, then use https://www.epochconverter.com/ 将时间戳转换为人类日期。

根据您的要求,您可以关注 adrian hall 的博客 Caching Tokens 并参考 IsTokenExpired 方法解码您的 authenticationToken 并检查 exp,然后手动更新 authenticationToken。

据我了解,您可以通过两种方法实现您的目的:

你需要在手机客户端缓存facebookaccess_token,当你手动查看authenticationToken发现过期后,你可以手动执行以下代码更新token,显式更新你的本地缓存。

var user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token).ConfigureAwait(false);

注意:您的 facebook access_token 有到期日期,因此如果您的 access_token 已过期,那么您需要强制用户登录 Facebook在获取新的 authenticationToken 之前再次。

或者您可以构建自定义端点以刷新 authenticationToken 并为新的 authenticationToken 显式设置较长的生命周期,您可以遵循类似的详细信息 注意:对于您的客户端过期处理,您需要在本地authenticationToken 即将过期之前更新令牌。