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

2024-03-09

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

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

以下是有关 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等等,客户端可以通过存储过期时间并在每个请求上检查它来处理这个问题。这可以通过以下步骤完成:

  1. convert expires_in过期时间(纪元、RFC-3339/ISO-8601 日期时间等)
  2. 存储过期时间
  3. 在每个资源请求上,检查当前时间与过期时间,并在资源请求之前发出令牌刷新请求,如果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 错误时尝试单次刷新。

无效的访问令牌错误

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

  1. Facebook:错误 467 访问令牌无效 https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3#errors- 访问令牌已过期、被撤销或无效 - 处理过期的访问令牌。
  2. LinkedIn:错误 401 未经授权 https://developer.linkedin.com/docs/oauth2.
  3. 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 将返回具有静态时间的刷新令牌,因此如果令牌刷新和刷新令牌更新一致完成,则用户无需再次进行身份验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何识别 OAuth 令牌是否已过期? 的相关文章

随机推荐

  • Notepad++ 的整洁 CSS

    是否有某种 CSS 整洁可用于 Notepad 我已经尝试了 TEXTFX 中似乎每个菜单项 但似乎没有一个能做到这一点 我习惯使用 PSPAD 只需选择 CSS 并单击 重新格式化为结构化 CSS EDIT在问这个问题很长时间后发现了一个
  • 如何在NextJs中为Material UI的媒体查询实现SSR?

    我无法遵循文档 https material ui com components use media query server side rendering实现 Material UI 的媒体查询 因为它是为普通的 React 应用程序指定
  • 使用 PowerShell 重命名 FTP 上的文件

    有没有办法重命名 FTP 目录中的文件 我正在将实时图像从计算机流式传输到 FTP 但问题是当它将图像上传到 FTP 时 它会立即替换文件 我想先上传临时名称的图像 然后重命名为 live jpg 这就像缓存文件上传一样 while tru
  • ASP.NET MVC 中的 jQuery 与 MicrosoftAjax

    在什么情况下您会在 ASP NET MVC 应用程序中使用 MicrosoftAjax 而不是 jQuery 根据斯科特 凯特在此播客中的说法Scott Cate 的面向对象 AJAX http www hanselminutes com
  • 实现 jquery UI 自动完成以在您键入“@”时显示建议

    我正在使用 jquery UI AutoComplete 来允许用户使用 mentions 来标记朋友 默认情况下 当您将焦点放在文本框上时 就会出现自动完成建议 如何让建议仅在您输入 时出现 这是我到目前为止的代码 var availab
  • 为什么无法访问的代码在 C++ 中不是错误?

    无法访问的代码是 Java 等语言中的编译时错误 但为什么它在 C 和 C 中只是警告呢 考虑以下示例 include
  • 如何在跨平台 xamarin XAML 上从资产目录加载图像?

    这似乎是一件非常容易做的事情 而且理论上它看起来非常简单 创建资产目录 添加图像集并将其命名为 imageName 不带 png 添加图像 done 或者至少这是我到处读到的内容 但我仍然无法让它发挥作用 我的 XAML 看起来像这样
  • Android Gradle:javaMaxHeapSize“4g”是什么?

    在一个安卓项目中 构建 gradle文件 我已经经历过这一行 dexOptions javaMaxHeapSize 4g 我想知道这样做的确切目的java最大堆大小那是什么4g方法 我还能提供哪些其他价值 正如它在上面回答 https st
  • 从 NHibernate 映射生成数据库模式

    是否可以从 Nhibernate 映射 DLL 生成数据库模式 我的要求是MySQL 如果是这样 我该怎么做 有这方面的工具 脚本吗 开源 免费软件工具 此外 我可以使用这些工具将数据集插入 更新到数据库吗 你有没有尝试过使用NHibern
  • 打开导航抽屉时使片段可点击

    我的问题如下 我锁定了导航抽屉菜单setDrawerLockMode DrawerLayout LOCK MODE LOCKED OPEN 在平板电脑的横向模式下 但我需要右侧的片段处于活动状态 这样我就可以在导航始终打开的情况下单击它 但
  • 使用 RSpec,如何在加载时为数据库设定种子?

    我正在使用 rspec 来测试我的 Rails 3 应用程序 我需要在测试开始之前为数据库播种 如何使用以下内容为数据库播种 db seeds rb Admin Member each do role name Role find or c
  • 我可以更改脚本 src 并让 javascript 运行新代码吗?

    我有一个页面 实际上是一个演示文稿 很像幻灯片 这是一个无限循环 它使用 ajax 进行自我更新 以下载自上次以来的新演示内容 现在 当用户决定更改幻灯片中的过渡效果时 以下行将发生更改 然而 即使我用例如替换整个标签 它仍然执行与最初加载
  • GAE 云端点 - Api 在部署后未更新

    我开始在我的 GAE 项目中使用云端点 但遇到了 api 未在服务器上更新的问题 localhost 8888 ah api explorer 就可以了 但当我部署时 没有任何变化 myapp appspot com 8888 ah api
  • Symfony2:递归验证

    我有一个带有一些验证器的实体 不是一种形式 所以我用 validator gt validate entity 但它不会验证我的子对象 实体类还有一些其他实体类和一些验证器 有没有一种 自动 的方式来做到这一点 或者我必须这样做 error
  • 如何使用 eclipse android-junit 启动配置从测试应用程序中排除测试

    我有一个正在测试的应用程序项目和一个测试应用程序项目 在 Android 上 我的测试应用程序包含很多测试 但我想找到一种机制来从测试启动 从 eclipse 启动 中排除测试或测试类 我知道我可以根据注释排除命令行上的测试 或者使用 an
  • Windows Azure 是否有任何可用的方法来抵御拒绝服务攻击?

    我们正在开发一个托管在 Windows Azure 中的 Web 服务 我们预计坏人有时会尝试对其进行 DDOS 我用谷歌搜索并没有找到任何新的和明确的 this one http blogs blackmarble co uk blogs
  • Java中字符串的字符之间添加空格?

    我只想在字符串的每个字符之间添加一个空格 谁能帮我弄清楚如何做到这一点 例如 给定 JAYARAM 我需要 J A Y A R A M 作为结果 除非你想循环遍历字符串并 手动 执行它 否则你可以这样解决它 yourString repla
  • jQuery 圆角滑块

    我想做一个如下图所示的圆形滑块 jQuery 能做到这一点吗 I know how a straight slider works but I would like to make a HTML5 rounded slider Here i
  • 如何以非 root 身份进行 Docker COPY?

    在构建 Docker 镜像时 我该如何COPY一个文件到映像中 以便生成的文件归 root 以外的用户所有 适用于 v17 09 0 ce 及更高版本 使用可选标志 chown
  • 如何识别 OAuth 令牌是否已过期?

    我的 iOS 移动应用程序使用使用 OAuth2 0 协议实现的服务 OAuth 访问令牌附带刷新令牌和expires in场地 我在应用程序中保存了刷新令牌和访问令牌过期时间 但不知道何时使用它们 那么使用这个的通常和最佳实践是什么exp