为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?

What is the purpose of a “Refresh Token”?

问题:我有一个与 YouTube Live Streaming API 集成的程序。我以每 50 分钟的时间间隔,使用刷新令牌(refresh token)获取一个新的访问令牌(Access Token)。 我的问题是,为什么 OAuth 要设计双重 token?

当我通过 YouTube 进行身份验证时,它给了我一个刷新令牌。然后我使用这个刷新令牌大约每小时获取一个新的访问令牌。 如果我有刷新令牌,我总是可以使用它来获取新的访问令牌,因为它永远不会过期。所以我不认为这比从一开始就给我一个访问令牌更安全。

回答

简单地说,刷新令牌用于获取新的访问令牌。

为了清楚地区分这两个令牌并避免混淆,以下是 OAuth 2.0 授权框架中给出的功能:

  • 访问令牌由授权服务器在资源所有者的批准下颁发给第三方客户端。客户端使用访问令牌访问由资源服务器托管的受保护资源。刷新令牌是用于获取访问令牌的凭据。

  • 刷新令牌由授权服务器颁发给客户端,用于在当前访问令牌失效或过期时获取新的访问令牌,或者获取具有相同或更窄范围的附加访问令牌。

出于安全原因,refresh_token 只与授权服务器交换,而 access_token 与资源服务器交换。这降低了“访问令牌有效期为一小时,刷新令牌有效期为一年或撤销前有效”与“访问令牌有效直至撤销而无需刷新”中长期存在的 access_token 泄漏的风险。

刷新令牌至少有两个用途。首先,刷新令牌是一种“证明”,表明 OAuth2 客户端已经从用户那里获得了访问其数据的许可,因此可以再次请求新的访问令牌,而无需用户通过整个 OAuth2 流程。其次,与长期访问令牌相比,它有助于增加整个安全流程。

刷新令牌作为不影响用户体验的一种方式

让我们用一个例子来谈谈第一个目的。假设您是一名用户,正在使用想要与您的 YouTube 帐户数据进行交互的第三方客户端网络应用程序。一旦您授予客户端应用程序使用您的 YouTube 数据的权限,您是否希望客户端应用程序在其 YouTube 令牌过期时再次提示您获得许可?如果 YouTube 令牌到期时间非常短(例如 5 分钟),会发生什么?

如果客户端应用程序至少每 5 分钟提示您一次许可,那会有点烦人! OAuth2 针对这个“问题”提出的解决方案是刷新令牌。通过使用刷新令牌,访问令牌可以保持短暂的生命周期(这在访问令牌以某种方式泄露或被盗的情况下是可取的),并且刷新令牌可以保持长期(更)生命周期,从而允许客户端获得新的访问权限令牌过期时无需用户再次许可。

但是为什么要刷新令牌呢?如果重点是不让用户使用权限请求,那么为什么客户端不能简单地说“嘿,授权服务器,我想要另一个访问令牌。而是,“嘿授权服务器,这是我过期的令牌,给我一个新的!”。刷新令牌作为一种“证明”,证明客户端在某个原始时间点被用户授予访问权限。该“证明”采用由授权服务器数字签名的刷新令牌的形式。通过客户端提供刷新令牌,授权服务器可以验证客户端在过去的某个时间点收到了用户的许可,并且客户端不必再次提示用户。

刷新令牌作为提高安全性的一种手段

然而,这提出了一个问题,“好吧,如果刷新令牌被泄露或被盗,或者只是被恶意客户端应用程序保留而没有应用户的要求将其删除,会发生什么?攻击者能不能继续使用刷新令牌无限期地(或直到它过期)获得有效的访问令牌?这个问题导致讨论我提到的第二个目的,刷新令牌有助于更安全的流程。

访问令牌出现的问题是,一旦获得,它们只会呈现给资源服务器(例如 YouTube)。因此,如果访问令牌被盗或泄露,您如何告诉资源服务器不要信任该令牌?好吧,你真的不能。唯一的方法是更改授权服务器上的私有签名密钥(首先对令牌进行签名的密钥)。

另一方面,刷新令牌需要频繁地提交给授权服务器,因此如果一个令牌被泄露,那么撤销或拒绝整个刷新令牌是微不足道的,而不必更改任何签名密钥。

你可能感兴趣的:(为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?)