为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?

上一篇:用 Arthas 定位 Spring Boot 接口的超时问题,让应用起飞~

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

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

作者:JerryWang_汪子熙

链接:https://www.jianshu.com/p/bf017aa3fb84

全文完,感谢你的耐心阅读。如果你还想看到我的文章,请一定给本文“在看”、“点赞”,新文章推送才会第一时间出现在你的微信里。

END - 

热门推荐:
字节面试:说说零拷贝,成功上岸!
不要把公司当成家,被通知裁员时会变得不幸...
公务员工作8年升职到正科,发完工资后感叹:公积金首次过万
用 Arthas 定位 Spring Boot 接口的超时问题,让应用起飞~

7行代码让B站崩溃3小时,竟因“一个诡计多端的0”
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值