我的iOS移动应用程序消耗使用OAuth2.0协议实现的服务。 OAuth访问令牌附带刷新令牌和expires_in
字段。我在我的应用程序中保存了刷新令牌和访问令牌到期时间,但不知道何时使用它们。
expires_in
的常用和最佳做法是什么?答案 0 :(得分:53)
以下有关OAuth 2.0令牌刷新的信息。
在定义中过期
OAuth 2.0标准RFC 6749将expires_in
字段定义为到期秒数:
expires_in:推荐。访问令牌的生命周期(以秒为单位)。例如,值" 3600"表示访问令牌将在生成响应后的一小时内到期。如果省略,授权服务器应该通过其他方式提供到期时间或记录默认值。
令牌刷新处理:方法1
收到有效的access_token
,expires_in
值,refresh_token
等后,客户端可以通过存储到期时间并在每个请求上进行检查来处理此问题。这可以使用以下步骤完成:
expires_in
转换为过期时间(纪元,RFC-3339 / ISO-8601日期时间等)access_token
已过期示例实现是Go oauth2
库,它将expires_in
值转换为令牌expiry
property中的RFC 3339日期时间。 expiry
并未由OAuth 2.0标准定义,但在此处非常有用。
检查时间时,请确保您是同一时间,例如,通过将所有时间转换为纪元或UTC时区来使用相同的时区。
除了收到新的access_token
之外,您还可能会收到一个新的refresh_token
,其中包含未来的到期时间。如果您收到此消息,则应存储新的refresh_token
以延长会话的使用期限。
令牌刷新处理:方法2
处理令牌刷新的另一种方法是在收到无效令牌错误后手动刷新。这可以通过以前的方法或单独完成。
如果您尝试使用过期的access_token
并且收到无效的令牌错误,则应执行令牌刷新(如果您的刷新令牌仍然有效)。由于不同的服务可以对过期的令牌使用不同的错误代码,因此您可以跟踪每个服务的代码,或者跨服务刷新令牌的简单方法是在遇到4xx错误时尝试单次刷新。
无效的访问令牌错误
以下是热门服务的一些错误代码:
刷新令牌过期
如果您的refresh_token
也已过期,则需要再次完成授权流程。
OAuth 2.0 spec没有定义刷新令牌到期或如何处理它,但是,当刷新令牌到期时,许多API将返回refresh_token_expires_in
属性。不同的API会以不同的方式处理刷新令牌过期,因此查看每个API的文档非常重要,但通常在刷新访问令牌时可能会收到新的刷新令牌。应以类似的方式处理到期,例如将refresh_token_expires_in
转换为RFC 3339日期时间refresh_token_expiry
值。
一些示例包括LinkedIn,eBay和RingCentral。在LinkedIn API中,当您刷新访问令牌时,您将收到一个刷新令牌,其{1}属性递减,目标是原始刷新令牌到期时间,直到您需要再次进行身份验证。 RingCentral API将返回具有静态时间的刷新令牌,因此如果令牌刷新并且刷新令牌更新一致,则用户无需再次进行身份验证。
答案 1 :(得分:0)
建议使用上面的方法2,因为401可能由于多种原因而发生,例如更新令牌签名证书或时钟差异:
我已经实现了许多成功的OAuth客户端,并且一直使用这种技术-并避免读取客户端代码中的expires_in字段