乐趣区

关于oauth:为什么-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

退出移动版