“刷新令牌”的目的是什么?


110

我有一个与YouTube Live Streaming API集成的程序。它运行在计时器上,因此我编程起来相对容易,每隔50分钟使用刷新令牌来获取一个新的访问令牌。我的问题是,为什么?

当我通过YouTube认证时,它给了我一个刷新令牌。然后,我使用此刷新令牌大约每小时获取一次新的访问令牌。如果我有刷新令牌,因为它永不过期,所以我总是可以使用它来获取新的访问令牌。因此,除了从一开始就给我访问令牌并且不打扰整个“刷新令牌”系统,我看不出这有什么安全性。



3
访问令牌是承载令牌。意味着不需要其他身份证明,并且访问令牌就是模拟您所需要的全部。因此,它们应始终保持短暂寿命。另一方面,刷新令牌不是承载令牌。当您向YouTube发送刷新令牌以获取新的访问令牌时,还必须发送client_id和client_secret。因此,刷新令牌可以保留更长的寿命,因为刷新令牌和client_secret都不会受到损害。
jrahhali '20

Answers:


96

基本上,刷新令牌用于获取新的访问令牌。

为了清楚地区分这两个标记并避免混淆,以下是OAuth 2.0授权框架中提供的功能

  • 访问令牌是由授权服务器在资源所有者的批准下颁发给第三方客户端的。客户端使用访问令牌访问资源服务器托管的受保护资源。
  • 刷新令牌是用于获取访问令牌的凭据。授权服务器将刷新令牌发布给客户端,当当前访问令牌无效或过期时,刷新令牌将用于获取新的访问令牌,或者用于获取范围相同或更窄的其他访问令牌。

现在,要回答有关为何仍向您颁发刷新令牌而不只是保护访问令牌的问题,Internet工程任务组在“刷新令牌”中提供的主要原因是:

有一个安全原因,refresh_token仅与授权服务器交换,而access_token与资源服务器交换。这样可以减轻“ access-token长期泄漏”在“一个小时的访问令牌有效,刷新令牌为一年或有效​​期已到期”与“不经过刷新的有效令牌访问中”泄漏的风险。令牌。”

有关OAuth 2.0 Flow的更详细和完整的信息,请尝试阅读以下参考资料:


5
刷新令牌还应该有助于获得新的刷新令牌吗?
Gherman

6
为什么在到期后不获取新的短暂的access_token?如果仍然需要向服务器请求新的access_token,为什么还要使用长寿的refresh_token?还是确实如此,使用refresh_token我不需要维护活动的身份提供程序cookie,即使cookie消失了很长时间,它也将基于refresh_token发出新的access_tokens,如果用户想要获取一个cookie,就必须输入其凭据。新的access_token?
JustAMartin

2
@JustAMartin作为OAuth2客户端,没有刷新令牌,我将需要再次启动整个授权流程(让用户“登录”并再次给我权限),以便获得另一个访问令牌。刷新令牌绕过此要求,因为这是我(作为客户端)已经获得用户请求访问令牌许可的“证明”。
jrahhali'5

刷新令牌可以与访问令牌具有相同或相同的数据吗?因为刷新令牌的主要用途是减轻用户体验并限制黑客对资源的访问时间。
DaviesTobi alex

10

@Teyam提及SO post为什么OAuth v2既具有访问令牌又具有刷新令牌?但我更喜欢那里的另一个答案:https : //stackoverflow.com/a/12885823/254109

TL; DR refresh_token不会带来更高的安全性。目的是提高可伸缩性和性能。然后,access_token可能只是存储在一些快速的临时存储(如内存)中。它还允许授权和资源服务器分离。


3
除非有安全原因,如@Teyam所述:“ refresh_token仅与授权服务器交换,而access_token与资源服务器交换”
huyz

1
仅当我们假设授权服务器作为资源服务器得到更好的保护时,这才更加安全。如果不是这种情况,则实际上安全性较低。如果刷新令牌遭到破坏,我可以使用它来获取新的访问令牌。
Arno van Lieshout

TL; DR ?? 真假的啊 ?
Hos Mercury

10

刷新令牌至少有两个作用。首先,刷新令牌是OAuth2客户端已经获得用户访问其数据的权限的“证明”,因此可以再次请求新的访问令牌而无需用户经历整个OAuth2流程。其次,与寿命长的访问令牌相比,它有助于增加整体安全性。我将更详细地讨论这两个方面。

刷新令牌是一种不会惹恼用户的方法

让我们用一个例子来讨论第一个目的。假设您(一个用户)正在使用一个第三方Client Web应用程序,该应用程序想与您的YouTube帐户数据进行交互。一旦授予权限的客户端应用程序使用YouTube的数据,你会希望客户端应用程序提示您输入您的许可,再次YouTube令牌何时过期?如果YouTube令牌的有效时间很短(例如5分钟),会发生什么情况。让Client应用程序至少每5分钟提示您一次许可会有点烦人!OAuth2针对此“问题”提出的解决方案是刷新令牌。通过使用刷新令牌,访问令牌可以保持短命(如果访问令牌因某种原因泄漏或被盗,这是理想的),并且刷新令牌可以保持长命(更长时间),从而允许客户端获得新的访问权限令牌过期而无需用户许可(再次)。

但是为什么要刷新令牌?如果不是要用权限请求来打扰用户,那么客户端为什么不能简单地说“嘿,授权服务器,我想要另一个访问令牌。现在!”?或者,“嘿授权服务器,这是我已过期的令牌,给我一个新的令牌!”。好吧,刷新令牌是一种“证明”,即用户在某个原始时间点已授予客户端访问权限。这种“证明”是由授权服务器进行数字签名的刷新令牌的形式。通过客户端提供刷新令牌,授权服务器可以验证客户端在过去的某个时刻是否已从用户那里获得许可,并且客户端不必再次提示用户。

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

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

访问令牌引起的问题是,一旦获得访问令牌,它们只会被呈现给资源服务器(例如YouTube)。因此,如果访问令牌被盗或被泄露,您如何告诉资源服务器不信任该令牌?好吧,你真的不能。唯一的方法是更改​​授权服务器上的私有签名密钥(首先对令牌进行签名的密钥)。我认为这样做不方便,并且在某些情况下(例如Auth0)不受支持。

另一方面,刷新令牌需要频繁地呈现给授权服务器,因此,如果一个泄露了,则从整体上撤消或拒绝刷新令牌是很简单的,而不必更改任何签名密钥。


9

“因此,除了从一开始就给我访问令牌并且不打扰整个刷新令牌系统之外,我没有什么比这更安全的了。” 我在同一个问题上挣扎。简短的答案是刷新令牌对于确保凭据未过期是必需的。

一个示例可能会有所帮助:我有一个存储您的病历的数据库。您同意与配偶分享您的病历。您的配偶使用他们的访问令牌从我的数据库中读取您的记录。从现在起的两周内,您的配偶再次检查您的病历,并且使用刷新令牌来确保他们仍然(从身份验证服务器)有权查看您的病历。刷新令牌绕过了您的配偶将其凭据(用户名和密码)重新输入到身份验证服务器的需求,但是它确实确保了他们仍然具有访问资源的合法性。永不过期的访问令牌不会知道您是否已撤销了配偶访问医疗记录的权利。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.