以下是有关 OAuth 2.0 令牌刷新的信息。
定义中过期
OAuth 2.0 标准,RFC 6749 https://www.rfc-editor.org/rfc/rfc6749#section-4.2.2,定义了expires_in
字段作为到期的秒数:
expires_in:推荐。访问令牌的生命周期(以秒为单位)。例如,值“3600”表示访问令牌将在生成响应后一小时内过期。如果省略,授权服务器应该通过其他方式提供过期时间或记录默认值。
令牌刷新处理:方法 1
收到有效的access_token
, expires_in
value, refresh_token
等等,客户端可以通过存储过期时间并在每个请求上检查它来处理这个问题。这可以通过以下步骤完成:
- convert
expires_in
过期时间(纪元、RFC-3339/ISO-8601 日期时间等)
- 存储过期时间
- 在每个资源请求上,检查当前时间与过期时间,并在资源请求之前发出令牌刷新请求,如果
access_token
已过期
一个示例实现是 Gooauth2
转换的库expires_in
令牌中 RFC 3339 日期时间的值expiry财产 https://godoc.org/golang.org/x/oauth2#Token. expiry
不是由 OAuth 2.0 标准定义的,但在这里很有用。
检查时间时,请确保时间相同,例如,通过将所有时间转换为纪元或 UTC 时区来使用相同的时区。
除了收到新的access_token
,您可能会收到一个新的refresh_token
且过期时间在未来更远。如果您收到此信息,您应该存储新的refresh_token
延长您的会话寿命。
令牌刷新处理:方法 2
处理令牌刷新的另一种方法是在收到无效令牌授权错误后手动刷新。这可以通过之前的方法或单独完成。
如果您尝试使用过期的access_token
并且您收到无效令牌错误,您应该执行令牌刷新(如果您的刷新令牌仍然有效)。由于不同的服务可以对过期令牌使用不同的错误代码,因此您可以跟踪每个服务的代码,或者跨服务刷新令牌的简单方法是在遇到 4xx 错误时尝试单次刷新。
无效的访问令牌错误
以下是来自热门服务的一些错误代码:
-
Facebook:错误 467 访问令牌无效 https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3#errors- 访问令牌已过期、被撤销或无效 - 处理过期的访问令牌。
-
LinkedIn:错误 401 未经授权 https://developer.linkedin.com/docs/oauth2.
-
PayPal:错误 401 未经授权 https://developer.paypal.com/docs/integration/direct/paypal-oauth2/.
实施
Zapier服务是一种实现授权错误重试后刷新的服务。
刷新令牌过期
If your refresh_token
也已过期,您需要重新办理授权流程。
The OAuth 2.0 规范 https://www.rfc-editor.org/rfc/rfc6749没有定义刷新令牌过期或如何处理它,但是,许多 API 将返回refresh_token_expires_in
刷新令牌过期时的属性。不同的 API 会以不同的方式处理刷新令牌过期,因此查看每个 API 的文档非常重要,但通常您在刷新访问令牌时可能会收到新的刷新令牌。过期应该以类似的方式处理,例如转换refresh_token_expires_in
到 RFC 3339 日期时间refresh_token_expiry
value.
一些例子包括LinkedIn https://developer.linkedin.com/docs/Refresh-Tokens-with-OAuth-2, eBay https://developer.ebay.com/api-docs/static/oauth-qref-auth-code-grant.html, and 环中心 https://developers.ringcentral.com/api-reference。在 LinkedIn API 中,当您刷新访问令牌时,您将收到一个带有递减的刷新令牌refresh_token_expires_in
属性针对原始刷新令牌到期时间,直到您需要再次进行身份验证。 RingCentral API 将返回具有静态时间的刷新令牌,因此如果令牌刷新和刷新令牌更新一致完成,则用户无需再次进行身份验证。