ios - 如何识别 OAuth token 是否已过期?

标签 ios oauth-2.0

我的 iOS 移动应用使用使用 OAuth2.0 协议(protocol)实现的服务。 OAuth 访问 token 带有一个刷新 token 和一个 expires_in 字段。我在我的应用程序中保存了刷新 token 和访问 token 过期时间,但不知道何时使用它们。

  • 那么使用这个 expires_in 的通常和最佳实践是什么?
  • 如何确定我的访问 token 已过期?
  • 是否有一种常见的网络服务错误格式表明我的访问 token 已过期?

最佳答案

这里是关于 OAuth 2.0 token 刷新的信息。

在定义中过期

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

expires_in: RECOMMENDED. The lifetime in seconds of the access token. For example, the value "3600" denotes that the access token will expire in one hour from the time the response was generated. If omitted, the authorization server SHOULD provide the expiration time via other means or document the default value.

token 刷新处理:方法 1

在收到有效的access_tokenexpires_in 值、refresh_token 等后,客户端可以通过存储过期时间并检查它来进行处理在每个请求上。这可以通过以下步骤完成:

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

一个示例实现是 Go oauth2 库,它将 expires_in 值转换为 token 中的 RFC 3339 日期时间 expiry property . expiry 未由 OAuth 2.0 标准定义,但在这里很有用。

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

除了收到一个新的 access_token 之外,您还可能会收到一个新的 refresh_token,其到期时间会在未来进一步延长。如果收到此消息,则应存储新的 refresh_token 以延长 session 的生命周期。

token 刷新处理:方法 2

处理 token 刷新的另一种方法是在收到无效 token 授权错误后手动刷新。这可以使用以前的方法或单独完成。

如果您尝试使用过期的 access_token 并且收到无效 token 错误,您应该执行 token 刷新(如果您的刷新 token 仍然有效)。由于不同的服务可以对过期 token 使用不同的错误代码,因此您可以跟踪每个服务的代码,或者跨服务刷新 token 的一种简单方法是在遇到 4xx 错误时尝试一次刷新。

无效访问 token 错误

以下是一些流行服务的错误代码:

  1. Facebook: Error 467 Invalid access token - 访问 token 已过期、被撤销或无效 - 处理过期的访问 token 。
  2. LinkedIn: Error 401 Unauthorized .
  3. PayPal: Error 401 Unauthorized .

实现

Zapier服务是一种实现授权错误重试后刷新的服务。

enter image description here

刷新 token 过期

如果您的refresh_token也已过期,则需要重新进行授权。

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

一些示例包括 LinkedIn , eBay , 和 RingCentral .在 LinkedIn API 中,当您刷新访问 token 时,您将收到一个刷新 token ,该 token 具有递减的 refresh_token_expires_in 属性,目标是原始刷新 token 的到期时间,直到您需要再次进行身份验证。 RingCentral API 将返回具有静态时间的刷新 token ,因此如果 token 刷新和刷新 token 更新一致完成,用户无需再次授权。

关于ios - 如何识别 OAuth token 是否已过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30826726/

相关文章:

ios - CGDataProvider 在 Swift 4 中返回 null

oauth-2.0 - 帐户与 Google 上的操作关联

oauth-2.0 - Apache Syncope 与 OAuth 2

ios - 如何知道 UIVIewController 是否显示为 Peek Preview Controller

ios - 有没有办法在 Apple Watch 中制作类似 iPhone 的进度条?

ios - 错误 : removing the root node of a scene from its scene is not allowed

ios - iOS 7 何时关闭我的应用程序?

java - 用于访问授权服务器的 oAuth 2 资源服务器配置

oauth - 使用 Google OAuth2.0 在文档中针对 refresh_token 进行精确 POST 时出现 400 错误请求错误

oauth-2.0 - 跳过用户同意屏幕 oauth2