我有一个与YouTube Live Streaming API集成的程序。它运行在计时器上,因此我编程起来相对容易,每隔50分钟使用刷新令牌来获取一个新的访问令牌。我的问题是,为什么?
当我通过YouTube认证时,它给了我一个刷新令牌。然后,我使用此刷新令牌大约每小时获取一次新的访问令牌。如果我有刷新令牌,因为它永不过期,所以我总是可以使用它来获取新的访问令牌。因此,除了从一开始就给我访问令牌并且不打扰整个“刷新令牌”系统,我看不出这有什么安全性。
我有一个与YouTube Live Streaming API集成的程序。它运行在计时器上,因此我编程起来相对容易,每隔50分钟使用刷新令牌来获取一个新的访问令牌。我的问题是,为什么?
当我通过YouTube认证时,它给了我一个刷新令牌。然后,我使用此刷新令牌大约每小时获取一次新的访问令牌。如果我有刷新令牌,因为它永不过期,所以我总是可以使用它来获取新的访问令牌。因此,除了从一开始就给我访问令牌并且不打扰整个“刷新令牌”系统,我看不出这有什么安全性。
Answers:
基本上,刷新令牌用于获取新的访问令牌。
为了清楚地区分这两个标记并避免混淆,以下是OAuth 2.0授权框架中提供的功能:
- 访问令牌是由授权服务器在资源所有者的批准下颁发给第三方客户端的。客户端使用访问令牌访问资源服务器托管的受保护资源。
- 刷新令牌是用于获取访问令牌的凭据。授权服务器将刷新令牌发布给客户端,当当前访问令牌无效或过期时,刷新令牌将用于获取新的访问令牌,或者用于获取范围相同或更窄的其他访问令牌。
现在,要回答有关为何仍向您颁发刷新令牌而不只是保护访问令牌的问题,Internet工程任务组在“刷新令牌”中提供的主要原因是:
有一个安全原因,
refresh_token
仅与授权服务器交换,而access_token
与资源服务器交换。这样可以减轻“ access-token长期泄漏”在“一个小时的访问令牌有效,刷新令牌为一年或有效期已到期”与“不经过刷新的有效令牌访问中”泄漏的风险。令牌。”
有关OAuth 2.0 Flow的更详细和完整的信息,请尝试阅读以下参考资料:
@Teyam提及SO post为什么OAuth v2既具有访问令牌又具有刷新令牌?但我更喜欢那里的另一个答案:https : //stackoverflow.com/a/12885823/254109
TL; DR refresh_token
不会带来更高的安全性。目的是提高可伸缩性和性能。然后,access_token
可能只是存储在一些快速的临时存储(如内存)中。它还允许授权和资源服务器分离。
刷新令牌至少有两个作用。首先,刷新令牌是OAuth2客户端已经获得用户访问其数据的权限的“证明”,因此可以再次请求新的访问令牌而无需用户经历整个OAuth2流程。其次,与寿命长的访问令牌相比,它有助于增加整体安全性。我将更详细地讨论这两个方面。
让我们用一个例子来讨论第一个目的。假设您(一个用户)正在使用一个第三方Client Web应用程序,该应用程序想与您的YouTube帐户数据进行交互。一旦授予权限的客户端应用程序使用YouTube的数据,你会希望客户端应用程序提示您输入您的许可,再次YouTube令牌何时过期?如果YouTube令牌的有效时间很短(例如5分钟),会发生什么情况。让Client应用程序至少每5分钟提示您一次许可会有点烦人!OAuth2针对此“问题”提出的解决方案是刷新令牌。通过使用刷新令牌,访问令牌可以保持短命(如果访问令牌因某种原因泄漏或被盗,这是理想的),并且刷新令牌可以保持长命(更长时间),从而允许客户端获得新的访问权限令牌过期而无需用户许可(再次)。
但是为什么要刷新令牌?如果不是要用权限请求来打扰用户,那么客户端为什么不能简单地说“嘿,授权服务器,我想要另一个访问令牌。现在!”?或者,“嘿授权服务器,这是我已过期的令牌,给我一个新的令牌!”。好吧,刷新令牌是一种“证明”,即用户在某个原始时间点已授予客户端访问权限。这种“证明”是由授权服务器进行数字签名的刷新令牌的形式。通过客户端提供刷新令牌,授权服务器可以验证客户端在过去的某个时刻是否已从用户那里获得许可,并且客户端不必再次提示用户。
但是,这引发了一个问题:“好吧,如果刷新令牌被泄漏或被盗,或者只是被恶意的客户端应用程序保存而没有根据用户的请求将其清除,将会发生什么?攻击者不能继续使用刷新令牌来无限期地获取有效的访问令牌(或直到它到期)?这个问题导致讨论了我提到的第二个目的,即刷新令牌有助于更安全的流程。
访问令牌引起的问题是,一旦获得访问令牌,它们只会被呈现给资源服务器(例如YouTube)。因此,如果访问令牌被盗或被泄露,您如何告诉资源服务器不信任该令牌?好吧,你真的不能。唯一的方法是更改授权服务器上的私有签名密钥(首先对令牌进行签名的密钥)。我认为这样做不方便,并且在某些情况下(例如Auth0)不受支持。
另一方面,刷新令牌需要频繁地呈现给授权服务器,因此,如果一个泄露了,则从整体上撤消或拒绝刷新令牌是很简单的,而不必更改任何签名密钥。
“因此,除了从一开始就给我访问令牌并且不打扰整个刷新令牌系统之外,我没有什么比这更安全的了。” 我在同一个问题上挣扎。简短的答案是刷新令牌对于确保凭据未过期是必需的。
一个示例可能会有所帮助:我有一个存储您的病历的数据库。您同意与配偶分享您的病历。您的配偶使用他们的访问令牌从我的数据库中读取您的记录。从现在起的两周内,您的配偶再次检查您的病历,并且使用刷新令牌来确保他们仍然(从身份验证服务器)有权查看您的病历。刷新令牌绕过了您的配偶将其凭据(用户名和密码)重新输入到身份验证服务器的需求,但是它确实确保了他们仍然具有访问资源的合法性。永不过期的访问令牌不会知道您是否已撤销了配偶访问医疗记录的权利。