我在Xamarin.Forms中使用客户端流认证,并试图弄清楚当认证令牌到期时如何处理。
首次登录时,用户使用本机Facebook SDK登录,然后将access_token
传递给MobileServiceClient以获取经过身份验证的用户。
var user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token).ConfigureAwait(false);
然后我将用户的UserId
和MobileServiceAuthenticationToken
保存在本地设置中(使用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个月。)感谢您的帮助!
答案 0 :(得分:1)
Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:刷新失败,出现400 Bad Request错误。身份提供程序不支持刷新,或者用户未以足够的权限登录。
由于您使用的是客户端流认证,因此无法使用RefreshUserAsync()
来刷新MobileServiceAuthenticationToken
。您的移动后端不会缓存相关的access_token
和refresh_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即将过期之前续订令牌。