OAuth 2.0协议草案的第4.2节指出,授权服务器可以返回access_token(用于通过资源验证自己)和refresh_token,refresh_taken纯粹用于创建新的access_token:

https://www.rfc-editor.org/rfc/rfc6749#section-4.2

为什么两者都有?为什么不让access_token和refresh_token一样长,而不设置refresh_taken?


当前回答

为什么不让access_token和refresh_token一样长不吃点心吗?

除了其他人提供的出色答案之外,我们使用刷新令牌还有另一个原因,这与声明有关。

每个令牌都包含声明,这些声明可以包括用户名、用户角色或创建声明的提供者等任何内容。当刷新令牌时,这些声明将被更新。

如果我们更频繁地刷新令牌,显然会给我们的身份服务带来更大的压力;然而,我们正在获得更准确和最新的声明。

其他回答

这个答案来自Justin Richer通过OAuth 2标准正文电子邮件列表。这是在他的许可下发布的。


刷新令牌的生命周期取决于(AS)授权服务器-它们可以过期、被撤销等。刷新令牌和访问令牌的区别在于受众:刷新令牌只返回授权服务器,访问令牌返回(RS)资源服务器。

此外,仅仅获得访问令牌并不意味着用户已经登录。事实上,用户可能已经不在那里了,这实际上是刷新令牌的预期用例。刷新访问令牌将允许您代表用户访问API,但不会告诉您用户是否在那里。

OpenIDConnect不仅从访问令牌提供用户信息,还提供ID令牌。这是一个单独的数据块,指向客户端本身,而不是AS或RS。在OIDC中,如果您可以获得一个新的ID令牌,您应该只考虑某人实际通过协议“登录”。刷新它可能还不够。

有关更多信息,请阅读http://oauth.net/articles/authentication/

尽管上面的答案很好,但我作为一名安全硕士生和程序员,在研究买家保护和欺诈时,曾在eBay工作过,可以说,将访问令牌和刷新令牌分开,在骚扰频繁输入用户名/密码的用户和保留撤销对可能滥用您服务的访问权限之间取得了最佳平衡。

想象一下这样的情景。您向用户发出3600秒的访问令牌,刷新令牌的时间长达一天。

用户是一个好用户,他在家里,上下你的网站,在他的iPhone上购物和搜索。他的IP地址不会改变,并且服务器负载很低。像每分钟3-5页的请求。当他在访问令牌上的3600秒结束时,他需要一个具有刷新令牌的新令牌。在服务器端,我们检查他的活动历史和IP地址,认为他是一个人,行为举止得体。我们授予他一个新的访问令牌以继续使用我们的服务。用户不需要再次输入用户名/密码,直到达到刷新令牌本身的一天寿命。用户是一个粗心大意的用户。他住在美国纽约,病毒程序被关闭,在波兰被黑客入侵。当黑客获得访问令牌和刷新令牌时,他试图模拟用户并使用我们的服务。但是,在短暂的实时访问令牌过期后,当黑客试图刷新访问令牌时,我们在服务器上注意到用户行为历史中的IP发生了巨大变化(嘿,这家伙在美国登录,现在在波兰仅3600秒后刷新访问)。我们终止刷新过程,使刷新令牌本身无效,并提示再次输入用户名/密码。该用户是恶意用户。他打算通过使用机器人每分钟调用1000次我们的API来滥用我们的服务。直到3600秒后,当他试图刷新访问令牌时,我们注意到他的行为,认为他可能不是人类。我们拒绝并终止刷新过程,并要求他再次输入用户名/密码。这可能会破坏他的机器人的自动流动。至少让他不舒服。

当我们试图平衡我们的工作、用户体验和被盗令牌的潜在风险时,您可以看到刷新令牌的表现非常完美。服务器端的看门狗不仅可以检查IP更改,还可以检查api调用的频率,以确定用户是否应该是一个好用户。

另一个词是,您还可以尝试通过在每个api调用上实现基本IP看门狗或任何其他措施来限制被盗令牌/滥用服务的损害控制。但这很昂贵,因为您必须读取和写入有关用户的记录,并且会降低服务器响应速度。

为了消除一些混淆,您必须了解客户机密码和用户密码的角色,这两个角色非常不同。

客户端是应用程序/网站/程序/。。。,该服务器希望通过使用第三方身份验证服务对用户进行身份验证。客户端机密是一个(随机)字符串,该字符串对此客户端和身份验证服务器都是已知的。使用这个秘密,客户端可以通过身份验证服务器识别自己,从而获得请求访问令牌的授权。

要获取初始访问令牌和刷新令牌,需要:

用户ID用户密码客户端ID客户机密

要获取刷新的访问令牌,客户端使用以下信息:

客户端ID客户机密刷新令牌

这清楚地表明了区别:在刷新时,客户端通过使用其客户端密钥来获得刷新访问令牌的授权,因此可以使用刷新令牌而不是用户ID+密码来重新验证用户。这有效地防止了用户必须重新输入他/她的密码。

这也表明,丢失刷新令牌是没有问题的,因为客户机ID和机密是未知的。它还表明,保持客户机ID和客户机机密是至关重要的。

由于刷新和访问令牌是加载了大量语义的术语,因此术语转换可能会有所帮助?

可撤销令牌-必须通过授权服务器检查的令牌可以链接(请参阅RTR-刷新令牌循环)可以用于创建不可撤销的令牌,但也可以直接使用(当卷很小且检查不会成为负担时)可以使用很长时间,但这取决于用户需要多久才能获得新的凭据(用户名/密码)可以在RTR或任何其他可疑行为上无效不可撤销令牌-自包含的令牌,不需要通过授权服务器进行检查适用于大数据、分布式服务器/api调用的横向扩展应该是短暂的(因为是不可撤销的)


2020年,浏览器中也可以存在刷新令牌(最初为后端系统提供),这一点已被接受-请参见https://pragmaticwebsecurity.com/articles/oauthoidc/refresh-token-protection-implications.因此,焦点从“可刷新性”(在没有用户的情况下,后端如何延长对api的访问)转向了“可撤销性”。

因此,在我看来,将刷新令牌读取为可撤销令牌并将访问令牌读取为不可撤销令牌(可能是快速过期不可撤销的令牌)看起来更安全。

作为2021良好实践的附带说明,系统始终可以从可撤销的令牌开始,并在授权服务器压力增加时转向不可撤销的。

为了进一步简化B T的答案:当您通常不希望用户再次输入凭据,但仍然希望能够撤销权限(通过撤销刷新令牌)时,请使用刷新令牌

您不能撤销访问令牌,只能撤销刷新令牌。