刷新令牌是不是过期,如果过期,何时过期?

Posted

技术标签:

【中文标题】刷新令牌是不是过期,如果过期,何时过期?【英文标题】:Does the refresh token expire and if so when?刷新令牌是否过期,如果过期,何时过期? 【发布时间】:2017-03-26 03:34:28 【问题描述】:

我已阅读PODIO documentation。我特别考虑了以下关于使用refresh_token 的声明:

这个请求返回的数据和上面一样,你可以继续 一遍又一遍地这样做,以保持您的应用程序经过身份验证 无需要求用户重新进行身份验证。

这是否意味着refresh_token 将无限期有效还是会过期:

    发出后 X 天;或 在最后一次使用它后 X 天获得一个新的access_token

编辑:请参阅此PODIO Thread,它提出了相同的问题,但似乎没有给出有关 Oauth2.0 协议的 PODIO 实现的任何结论性答案。

【问题讨论】:

【参考方案1】:

你的问题的答案:

这是否意味着 refresh_token 将无限期有效还是会过期?

...可以从 OAuth 2.0 规范的section 1.5 和section 10.4 得出结论。

第 1.5 节 refresh_token 状态介绍:

刷新令牌由授权服务器下发给客户端,用于在当前访问令牌失效或过期时获取新的访问令牌,或者获取范围相同或更窄的额外访问令牌(访问令牌可能有一个比资源所有者授权的生命周期更短,权限更少)

第 10.4 节 refresh_token 状态的安全注意事项:

只要可以验证客户端身份,授权服务器必须验证刷新令牌和客户端身份之间的绑定。当无法进行客户端身份验证时,授权服务器应该部署其他方法来检测刷新令牌滥用。

例如,授权服务器可以使用刷新令牌轮换,其中每次访问令牌刷新响应都会发出一个新的刷新令牌。先前的刷新令牌已失效,但由授权服务器保留。如果刷新令牌被破坏并随后被攻击者和合法客户端使用,其中一个将提供一个无效的刷新令牌,这将通知授权服务器违规行为。

可以得出结论,如果authorization_server能够验证refresh_token和它所发给的客户端之间的绑定,那么refresh_token可以用来获取多个access_token并且永远不会过期。否则,授权服务器将使旧的refresh_token 失效,并在每次访问令牌刷新响应时生成新的refresh_token

【讨论】:

@Sureaj:我想答案最终取决于 Podio 对 oath2.0 协议的实现。该实现确实需要与使用refresh_token 相关的身份验证,因此我看不到他们如何验证refresh_token 和客户端之间的绑定。它也不会应用轮换原则,因为refresh_token 在收到新的access_token 时保持不变。请参阅此线程,我认为该线程对我的问题没有任何决定性的答案:Podio thread @rabbitco,是的,它完全取决于授权服务器的实现。我的回答是关于标准实现 RFC-6749。在您的情况下,作为 Andreas Garnæs cmets,数据库中不存在刷新令牌是问题所在。看起来有问题。 我没有从上面得出同样的结论。我看到了很多带有过期刷新令牌的 OAuth 实现,我怀疑它们都违反了合同 @JanZyka Oath 2.0 规范说“当无法进行客户端身份验证时,授权服务器应该部署其他方法来检测刷新令牌滥用。”实施刷新令牌轮换策略可以通过使旧刷新令牌过期来避免刷新令牌滥用。如果身份验证服务器能够识别刷新令牌和客户端之间的绑定,则无需使访问令牌过期。最终它取决于实现,例如 facebook SDK 在您发出请求时自动刷新您的访问令牌。【参考方案2】:

刷新令牌将在创建后 X 天(或小时)过期。根据您的安全要求,此到期时间为 1 个月或 1 小时。

您必须在做出决定时注意功能和安全性等某些方面。

如果您决定优先考虑安全性,那么短暂的过期时间可能会让您的应用程序对用户感到厌烦。 如果您决定优先考虑功能,您的应用程序可能更容易受到攻击。

【讨论】:

所以你的意思是我应该自己使refresh_token无效并要求一个新的? @rabbitco 您存储在数据库中的 refresh_token 将在其创建时确定到期日期。在此到期后,refresh_token 将无用。所以用户必须再次登录应用程序才能创建一个新应用程序。 你现在知道有效期是多少吗? 好的,但你还想说的是,如果我不“配置”refresh_token 过期,那么它无限期有效吗? @rabbitco 是的,您可以拥有长期存在的刷新令牌,甚至可以拥有永不过期的刷新令牌。但在这种情况下,有办法撤销它们变得更加强制性。在 Google 中查看有关刷新令牌过期的链接:***.com/questions/8953983/…【参考方案3】:

TL;博士

刷新令牌最终过期或失效,您应该做好准备。

两种情况:

    面向用户的服务(例如:授权授予流程)- 忽略这个问题也许没问题,因为人们善于关闭它并再次打开,也就是刷新页面:-)

    服务器端长期运行服务(例如:客户端凭据流) - 您应该准备好应对访问或刷新令牌都不起作用并从头开始重新启动身份验证的情况。

现实生活

刷新令牌可能有也可能没有到期时间,具体取决于您的提供商,它们永远不会过期,只要它们最近被使用过,以月或以小时为单位。依靠您将收到带有刷新访问令牌的新刷新令牌这一事实可能会很棘手。

超时并不是令牌失效的唯一方式。考虑oauth0 中描述的以下场景:

虽然刷新令牌通常是长期存在的,但授权服务器 可以使它们无效。刷新令牌可能不再存在的一些原因 有效包括:

授权服务器已撤销刷新令牌 用户已撤销对授权的同意 刷新令牌已过期 资源的身份验证策略已更改(例如, 最初该资源仅使用用户名和密码,但现在它 需要 MFA)

此外,令牌(访问、刷新)可以存储在身份验证提供程序服务的非持久存储中,因此如果服务重新启动(崩溃、更新),您的令牌可能会消失。

结论

如果您正在编写需要可靠的长期运行服务,请不要依赖于能够通过刷新令牌永远刷新已授予的身份验证。

【讨论】:

以上是关于刷新令牌是不是过期,如果过期,何时过期?的主要内容,如果未能解决你的问题,请参考以下文章

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

OAuth 2.0 刷新令牌是不是完全过期?

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

refresh_token 是不是应该刷新未过期的访问令牌

腾讯先锋怎么解决token过期

刷新令牌过期时间谷歌日历