为什么 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)。因此,如果访问令牌被盗或泄露,您如何告诉资源服务器不要信任该令牌?好吧,你真的不能。唯一的方法是更改​​授权服务器上的私有签名密钥(首先对令牌进行签名的密钥)。

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

access token (the one that expires soonest) is stored in local storage
refresh token only stored in memory for security reasons
that is why if you refresh after first time period, you have to log in

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