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