OAuth 服务器如何处理多次请求的“refresh_token”?

OAuth 服务器如何处理多次请求的“refresh_token”?

在 OAuth2 身份验证过程中,刷新令牌应仅使用一次。refresh_token使用时,它将返回一个新的access_token 一个新的refresh_token

这也是RFC6819 规范

5.2.2.3. 刷新令牌轮换

刷新令牌轮换旨在自动检测并阻止尝试从不同的应用/设备并行使用同一刷新令牌。如果令牌从客户端被盗,随后被攻击者和合法客户端使用,就会发生这种情况。基本思想是每次刷新请求时更改刷新令牌值,以检测使用旧刷新令牌获取访问令牌的尝试。由于授权服务器无法确定攻击者还是合法客户端正在尝试访问,因此如果有此类访问尝试,则有效刷新令牌和与其关联的访问授权都将被撤销。

OAuth 规范支持这一措施,因为令牌的响应允许授权服务器返回新的刷新令牌,即使对于授权类型为“refresh_token”的请求也是如此。

笔记:此措施在集群环境中可能会造成问题,因为必须确保使用当前有效的刷新令牌。在这样的环境中,其他措施可能更合适。

这也允许身份验证服务器识别出已refresh_token被盗用,因为它只能使用一次。如果refresh_token收到具有相同内容的新续订请求,身份验证服务器就会知道其中有蹊跷。

我想知道服务器处理这种情况的正确方法是什么?我的猜测是,至少access_tokens应该直接使该特定客户端的所有内容失效。

OAuth2 服务器通常如何使用相同的方式处理多个请求refresh_token

答案1

访问令牌失效

您无法使特定 的所有访问令牌失效client_id。client_id 通常绑定到一个应用程序,但此应用程序由更多用户使用。甚至一个用户也可能从不同的设备使用同一个应用程序。刷新令牌会创建一种会话 - 它必须对特定应用程序、用户和设备是唯一的。此外,客户端可能会以较窄的范围调用刷新令牌,在这种情况下,您不想使具有更宽范围的旧访问令牌失效 - 客户端可能仍会使用它。

就我有限的经验而言,OAuth 服务器不会在刷新令牌调用时使访问令牌无效。访问令牌的寿命很短,它们会随着时间而过期。

刷新令牌多个请求

RFC6819 第 6 节授权服务器可以颁发新的刷新令牌...授权服务器可以在向客户端颁发新的刷新令牌后撤销旧的刷新令牌。 规范允许一定的自由度,因此实现方式各不相同。最安全的实现方式是每次发出一个新的刷新令牌并使旧令牌无效。但这会给并发调用(例如多线程应用程序)带来麻烦。因此,有些服务器只有一个持久的刷新令牌(实现简单,安全性较低)。其他服务器在发出新刷新令牌后,会在短时间内(例如 2 分钟)保持旧刷新令牌有效。

相关内容