如何识别OAuth令牌是否已过期?

XiO*_*iOS 34 ios oauth-2.0

我的iOS移动应用程序使用OAuth2.0协议实现的服务.OAuth访问令牌附带刷新令牌和expires_in字段.我在我的应用程序中保存了刷新令牌和访问令牌到期时间,但不知道何时使用它们.

  • 那么使用它的常用和最佳做法是expires_in什么?
  • 如何识别我的访问令牌已过期?
  • 是否存在常见的Web服务错误格式,表明我的访问令牌已过期?

Gro*_*ify 65

以下是有关OAuth 2.0令牌刷新的信息.

在定义中过期

OAuth 2.0标准RFC 6749expires_in字段定义为到期秒数:

expires_in:推荐.访问令牌的生命周期(以秒为单位).例如,值"3600"表示访问令牌将在生成响应之后的一小时内到期.如果省略,授权服务器应该通过其他方式提供到期时间或记录默认值.

令牌刷新处理:方法1

在接收到一个有效的access_token,expires_in值,refresh_token等等,客户端可以通过存储的到期时间,并检查它在每次请求处理此.这可以使用以下步骤完成:

  1. 转换expires_in为过期时间(epoch,RFC-3339/ISO-8601 datetime等)
  2. 存储过期时间
  3. 在每个资源请求上,检查当前时间与过期时间,并在资源请求之前发出令牌刷新请求(如果access_token已过期)

示例实现是Go oauth2库,它将expires_in值转换为Token expiry属性中的RFC 3339日期时间.expiry不是由OAuth 2.0标准定义,但在此处很有用.

在检查时间时,请确保您是同一时间,例如,通过将所有时间转换为纪元或UTC时区来使用相同的时区.

除了接收新内容之外access_token,您可能会refresh_token在将来收到新的过期时间.如果您收到此消息,则应存储新内容refresh_token以延长会话的使用期限.

令牌刷新处理:方法2

处理令牌刷新的另一种方法是在收到无效令牌错误后手动刷新.这可以通过先前的方法或单独完成.

如果您尝试使用过期access_token并且获得无效的令牌错误,则应执行令牌刷新(如果刷新令牌仍然有效).由于不同的服务可以对过期的令牌使用不同的错误代码,您可以跟踪每个服务的代码,或者跨服务刷新令牌的简单方法是在遇到4xx错误时简单地尝试单次刷新.

无效的访问令牌错误

以下是热门服务的一些错误代码:

  1. Facebook:错误467访问令牌无效 - 访问令牌已过期,已被撤销或无效 - 处理过期的访问令牌.
  2. LinkedIn:错误401未经授权.
  3. PayPal:错误401未经授权.

刷新令牌过期

如果您refresh_token已过期,则需要再次完成授权过程.

的OAuth 2.0规范没有定义刷新令牌到期或如何处理它,但是,许多API将返回一个refresh_token_expires_in属性当刷新令牌不会过期.不同的API将以不同的方式处理刷新令牌过期,因此查看每个API的文档非常重要,但通常在刷新访问令牌时可能会收到新的刷新令牌.应以类似的方式处理到期,例如转换refresh_token_expires_in为RFC 3339日期时间refresh_token_expiry值.

一些例子包括LinkedIn,eBayRingCentral.在LinkedIn API中,当您刷新访问令牌时,您将收到一个刷新令牌,其具有refresh_token_expires_in针对原始刷新令牌到期时间的递减属性,直到您需要再次进行身份验证.RingCentral API将返回具有静态时间的刷新令牌,因此如果令牌刷新并且刷新令牌更新一致地完成,则用户不必再次进行身份验证.


Gar*_*her 12

建议使用上面的方法 2,因为 401 可能因多种原因而发生,例如更新令牌签名证书或时钟差异:

  • 每次 API 请求后检查 401
  • 获取新令牌 - 仅限一次
  • 重试 API 请求 - 仅一次

我已经实现了大量成功的 OAuth 客户端,并且一直使用这种技术 - 并且避免阅读客户端代码中的 expires_in 字段

  • 令牌发行者返回的过期时间不应该与用户时区无关吗?我希望它是 UTC。 (5认同)
  • 我打算在我的应用程序中实现代码来检查 expires_in 字段,但遇到了很多时区和用户更改设备时间的问题。所以我将按照您上面所说的方式实现我的 NetworkingClient 。 (3认同)