我有一个与YouTube直播API集成的程序。它运行在计时器上,所以我相对容易编程,每50分钟用一个刷新令牌获取一个新的访问令牌。我的问题是,为什么?
当我使用 YouTube 进行身份验证时,它给了我一个刷新令牌。然后,我使用此刷新令牌大约每小时获取一次新的访问令牌。如果我有刷新令牌,我可以随时使用它来获取新的访问令牌,因为它永远不会过期。因此,我认为这比从一开始就给我一个访问令牌而不打扰整个刷新令牌系统更安全。
@Teyam提了这么一个帖子为什么OAuth v2既有访问令牌又有刷新令牌?但我更喜欢另一个答案:https://stackoverflow.com/a/12885823/254109
TL;DR refresh_token
不会带来更高的安全性。这是为了提高可伸缩性和性能。然后,< code>access_token可以存储在某个快速的临时存储器中(如内存)。它也允许授权和资源服务器分离。
刷新令牌至少有两个目的。首先,刷新令牌是一种“证据”,表明OAuth2客户端已经从用户处获得了访问其数据的许可,因此可以再次请求新的访问令牌,而无需用户经历整个OAuth2html" target="_blank">流程。其次,与长期存在的访问令牌相比,它有助于提高整体安全性。我会更详细地讨论这两点。
让我们用一个例子来谈谈第一个目的。假设您(用户)正在使用想要与您的 YouTube 帐户数据进行交互的第三方客户端网络应用程序。向客户端应用程序授予使用 YouTube 数据的权限后,您是否希望客户端应用程序在其 YouTube 令牌过期时再次提示您授予权限?如果 YouTube 代币的到期时间非常低,比如 5 分钟,会发生什么情况。让客户端应用程序至少每 5 分钟提示您一次权限会有点烦人!OAuth2 针对此“问题”提出的解决方案是刷新令牌。通过使用刷新令牌,访问令牌可以保持短期生存期(如果访问令牌以某种方式泄露或被盗,这是可取的),并且刷新令牌可以保持长(er)生存期,从而允许客户端在访问令牌过期时获取新的访问令牌,而无需用户许可(再次)。
但为什么要刷新令牌呢?如果重点是不让用户使用权限请求,那么为什么客户端不能简单地说“嘿,授权服务器,我想要另一个访问令牌。现在!”?或者,“嘿,授权服务器,这是我过期的令牌,给我一个新的!”。嗯,刷新令牌可以作为一种“证据”,证明客户端在某个原始时间点被用户授予访问权限。这个“证明”是由授权服务器进行数字签名的刷新令牌的形式。通过客户端呈现刷新令牌,授权服务器可以验证客户端是否在过去的某个时间点收到了用户的许可,并且客户端不必再次提示用户。
然而,这就提出了一个问题,“那么,如果刷新令牌被泄漏或窃取,或者只是被恶意的客户端应用程序保存,而该应用程序没有按照用户的请求删除它,会发生什么情况呢?攻击者难道不能继续使用刷新令牌来无限期地获得有效的访问令牌吗(或者直到它过期)?这个问题引出了我提到的第二个目的,刷新令牌有助于更安全的流。
访问令牌带来的问题是,一旦获得,它们只会呈现给资源服务器(例如YouTube)。因此,如果一个访问令牌被盗或遭到破坏,如何告诉资源服务器不要信任这个令牌呢?你真的不能。唯一的方法是更改授权服务器上的私有签名密钥(首先对令牌进行签名的密钥)。我想这样做不太方便,而且在某些情况下(比如Auth0)不被支持。
另一方面,刷新令牌需要频繁地呈现给授权服务器,因此,如果一个令牌被破坏,那么撤销或拒绝整个刷新令牌是很容易的,并且不必改变任何签名密钥。
基本上,刷新令牌用于获取新的访问令牌。
为了清楚地区分这两个令牌并避免混淆,OAuth 2.0授权框架中给出了它们的功能:
现在,为了回答您关于为什么仍然向您颁发刷新令牌而不仅仅是保护访问令牌的问题,Internet 工程任务组在刷新令牌中提供的主要原因是:
出于安全原因,< code>refresh_token仅与授权服务器交换,而< code>access_token则与资源服务器交换。这降低了在“一个访问令牌一小时有效,一个刷新令牌一年有效或有效直至被撤销”与“一个访问令牌有效直至被撤销但没有刷新令牌”中长期访问令牌泄漏的风险
有关OAuth 2.0 Flow的更详细和完整的信息,请尝试阅读以下参考:
我在自己的Web API上使用Oauth2,在Web应用程序上使用ASP.NET C#来使用该API。在我的web应用程序上,我正在进行HttpWebRequests。当我的访问令牌过期时,我调用一个方法“refreshToken”,该方法发出请求以获取新的访问令牌。这工作很好,没有问题...除了我得到的响应包含一个新的刷新令牌???我在等新的访问令牌。我甚至认为在没有再次传递凭据的情况下这是不可
当我通过YouTube认证时,它给了我一个刷新令牌。然后,我大约每小时使用这个刷新令牌获取一个新的访问令牌。如果我有刷新令牌,我总是可以使用它来获得一个新的访问令牌,因为它永远不会过期。所以我看不出这样做比从一开始就给我一个访问令牌,而不麻烦整个刷新令牌系统更安全。
我正在努力围绕JWT身份验证进行思考。我读了很多文章和SO问题,但是其中一些已经过时了,我仍然没有得到满意的答案。 我读过这个SO问题,从JoséF.Romaniello的回答中我明白: 使用刷新令牌,客户端在旧的访问令牌过期之前请求新的访问令牌(这是正常的,预期行为) 在移动应用上,代币永不过期 同样在 auth0 上它说: 您可以请求新的访问令牌,直到刷新令牌在DenyList上。应用程序必须
我有一个基于OAuth2的授权服务器。与访问令牌一起发送的还有刷新令牌。 我可以使用访问令牌获得一个资源,当它过期时,我使用刷新令牌请求一个新的资源。 不过,我也可以用刷新令牌获取资源...是Oauth2的典型行为吗?我以为这个刷新令牌只用于请求新的访问令牌,而不是用于获取受保护的资源。 多谢了。
刷新令牌有什么用处?按照我的理解,当访问令牌过期时使用刷新令牌,发送刷新令牌生成另一个刷新令牌和另一个访问令牌。这是因为如果访问令牌由于其持续时间短而被劫持,恶意用户实际上什么都不能做,但如果具有较长持续时间的刷新令牌被劫持,则用户将无法再受到保护。那么刷新令牌应该存储在哪里,这样才不会被人劫持呢?或者在后端应该采取哪些安全措施?
授权服务器可以给Web应用客户端和本机应用程序客户端颁发刷新令牌。 刷新令牌在传输和储存时必须保持机密性,并只与授权服务器和刷新令牌被颁发的客户端共享。授权服务器必须维护刷新令牌和它被颁发给的客户端之间的绑定。刷新令牌必须只能使用带有RFC2818定义的服务器身份验证的1.6所述的TLS 传输。 授权服务器必须验证刷新令牌和客户端身份之间的绑定,无论客户端身份是否能被验证。当无法进行客户端身份验证