【问题标题】:How to handle expired auth tokens in Xamarin MobileServiceClient?如何在 Xamarin MobileServiceClient 中处理过期的身份验证令牌?
【发布时间】:2018-06-06 17:56:08
【问题描述】:

我在 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 错误请求错误。身份提供者不支持刷新,或者用户没有足够的权限登录。

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

【问题讨论】:

  • Client-Flow 身份验证不允许刷新令牌,请阅读此 https://auth0.com/docs/api-auth/which-oauth-flow-to-use digitalocean.com/community/tutorials/an-introduction-to-oauth-2
  • @Johannes,感谢您提供的信息链接。我没有意识到 Facebook SDK 在幕后发生了这么多事情!因此,如果无法刷新访问令牌,如何防止我的用户不得不多次登录(令牌过期时)?我使用的大多数应用程序只要求我进行一次身份验证。

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


【解决方案1】:

Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:刷新失败,出现 400 错误请求错误。身份提供者不支持刷新,或者用户没有足够的权限登录。

由于您使用的是客户端流身份验证,因此您不能使用RefreshUserAsync() 来刷新MobileServiceAuthenticationToken。您的移动后端没有缓存相关的access_tokenrefresh_token 用于更新认证Token。

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

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

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

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

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

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

注意:您的 facebook access_token 有过期日期,所以如果您的 access_token 已过期,那么您需要强制用户重新登录 Facebook,然后才能获取新的 authenticationToken。

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

【讨论】:

  • 谢谢。我跟着 Adrian Hall 的书走开了,对我应该如何处理访问令牌有了更好的理解。我还开始使用 Facebook 强制客户端流身份验证以定期提示用户同意。
猜你喜欢
  • 1970-01-01
  • 2017-03-18
  • 2018-02-19
  • 2021-01-10
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多