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

时间:2018-06-06 17:56:09

标签: authentication xamarin xamarin.forms azure-web-sites azure-mobile-services

我在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:刷新失败,出现400 Bad Request错误。身份提供程序不支持刷新,或者用户未以足够的权限登录。

有没有办法测试这个? (因为令牌到期时间是3个月。)感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:刷新失败,出现400 Bad Request错误。身份提供程序不支持刷新,或者用户未以足够的权限登录。

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

  

有没有办法测试这个? (因为令牌到期时间是3个月。)感谢您的帮助!

AFAIK,默认情况下MobileServiceAuthenticationToken到期时间为一小时,您可以使用https://jwt.io/对令牌进行解码并检查exp属性,然后使用https://www.epochconverter.com/转换您的时间戳到人类约会。

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

根据我的理解,有两种方法可以实现您的目的:

您需要在移动客户端缓存facebook access_token,手动检查authenticationToken并发现它已过期后,您可以手动执行以下代码以续订令牌并显式更新本地缓存

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

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

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