"Refresh Token"的目的是什么?
"Refresh Token"的目的是什么?
Refresh Token的目的至少有两个。首先,Refresh Token是一种“证明”,证明OAuth2 Client已经获得用户的许可来访问他们的数据,因此可以再次请求新的访问令牌,而无需用户再次完成整个OAuth2流程。其次,与长期访问令牌相比,它有助于提高整个流程的安全性。我将详细介绍这两个观点。
刷新令牌作为不烦扰用户的手段
让我们用一个例子来讨论第一个目的。假设你作为用户正在使用一个第三方客户端网站应用程序,该应用程序想要与你的YouTube帐户数据进行交互。一旦你授予客户端应用程序使用你的YouTube数据的权限,当其YouTube令牌过期时,你希望客户端应用程序再次要求你的许可吗?如果YouTube令牌的过期时间很短,比如5分钟,每5分钟客户端应用程序都要求你的许可会有点烦人!OAuth2提出的解决方案是使用刷新令牌。通过使用刷新令牌,访问令牌可以保持短期有效(这在访问令牌泄露或被盗的情况下是可取的),而刷新令牌可以保持较长有效期,让客户端在访问令牌过期时获取新的访问令牌,而无需再次请求用户的许可。
但是为什么需要刷新令牌?如果目的是不烦扰用户进行许可请求,为什么客户端不能简单地说“嘿,授权服务器,我想要另一个访问令牌。现在!”或者“嘿,授权服务器,这是我的过期令牌,请给我一个新的!”?嗯,刷新令牌作为一种“证明”,证明客户端在过去的某个时间点上已经被用户授予访问权限。这种“证明”是通过刷新令牌由授权服务器进行数字签名来实现的。通过客户端呈现刷新令牌,授权服务器可以验证客户端在过去某个时间点上已经从用户那里获得了许可,而客户端无需再次请求用户的许可。
刷新令牌作为增加安全性的手段
然而,这引出了一个问题:“如果刷新令牌被泄露、盗用,或者被恶意客户端应用程序保留而不满足用户的请求,会发生什么?攻击者不能继续使用刷新令牌无限期地获得有效的访问令牌(或直到过期)吗?”这个问题引发了我提到的第二个目的,即刷新令牌对更安全的流程的贡献。
访问令牌的问题在于,一旦获得,它们只会被呈现给资源服务器(例如YouTube)。因此,如果访问令牌被盗用或泄露,如何告诉资源服务器不要信任该令牌?嗯,实际上无法做到。唯一的方法是更改授权服务器上的私钥(用于对令牌进行签名的密钥)。我想这样做可能会很麻烦,在某些情况下(如Auth0),可能不支持。
另一方面,刷新令牌需要经常提交给授权服务器,因此如果刷新令牌被泄露,撤销或拒绝刷新令牌是非常简单的,而无需更改任何签名密钥。
不烦扰用户的方法对我来说很有启发。在我的环境中,我从Web后端访问API,因此不需要手动输入凭据,它们在应用程序中可用。我一直在想,为什么不只是使用我的凭据每次获取一个新的令牌,为什么要存储刷新令牌并跟踪其到期时间。我从未想过,在手动输入凭据的用户工作流程中,这可能会非常烦人。
在登录用户名和密码的简单登录场景中,你是对的,但在更复杂的场景中,比如使用一次性密码(OTP)或OAuth2流程的登录,刷新令牌是必需的。
根据你发布的答案,可以说如果资源服务器和授权服务器是相同的(我的意思是例如一个既提供资源又进行自身授权的网站),使用刷新令牌就不是很有意义了吗?
"刷新令牌"的目的是什么?
刷新令牌的目的是获取新的访问令牌。为了清楚区分这两个令牌并避免混淆,RFC 6749中给出了它们的功能:
- "访问令牌"由授权服务器与资源所有者的批准向第三方客户端发放。客户端使用访问令牌来访问资源服务器上托管的受保护资源。
- "刷新令牌"是用于获取访问令牌的凭据。刷新令牌由授权服务器发放给客户端,用于在当前访问令牌无效或过期时获取新的访问令牌,或者获取具有相同或更窄范围的附加访问令牌。
那么,为什么您仍然会收到刷新令牌而不是仅获取一个访问令牌呢?根据Internet Engineering Task Force在"刷新令牌"中提供的主要原因是:
- 这是出于安全考虑,"刷新令牌"只与授权服务器交换,而"访问令牌"与资源服务器交换。这可以减轻"访问令牌有效一个小时,刷新令牌有效一年或有效直至撤销"与"访问令牌有效直至撤销,没有刷新令牌"之间的长期访问令牌泄漏的风险。
作为OAuth2客户端,如果没有刷新令牌,我需要重新启动整个授权流程(让用户"登录"并再次授予权限),以获取另一个访问令牌。刷新令牌绕过了这个要求,作为一种"证明",即作为客户端,我已经获得了用户的权限来请求访问令牌。
刷新令牌是否可以具有与访问令牌相同的数据?因为刷新令牌的主要用途是简化用户体验并限制黑客对资源的访问时间。
这个回答更侧重于"什么",而很少涉及"为什么"。我认为一个真实的例子会有助于读者的理解。
完全同意Taylor的观点。我简直不敢相信我读了整篇无关紧要的文字。
抱歉,我只是回答了最初的问题。您可能想看看其他答案。
使用客户端凭据授予流程时,不需要使用刷新令牌。只需重新请求访问令牌即可。
“刷新令牌”的目的是什么?
根据OAuth 2.0文档,刷新令牌用于在当前访问令牌失效或过期时获取新的访问令牌,或者获取具有相同或更窄范围的附加访问令牌(访问令牌的生命周期可能更短,权限也可能比资源所有者授权的权限少)。
下面是一个示例流程图,展示了如何使用刷新令牌获取新的访问令牌:
(A) 客户端通过认证服务器进行身份验证并提供授权授予,请求访问令牌。
(B) 授权服务器对客户端进行身份验证并验证授权授予,如果有效,则发放访问令牌和刷新令牌。
(C) 客户端通过提供访问令牌向资源服务器发起受保护资源请求。
(D) 资源服务器验证访问令牌,如果有效,则提供请求的资源。
(E) 步骤(C)和(D)重复直到访问令牌过期。如果客户端知道访问令牌已过期,则跳至步骤(G);否则,它会发起另一个受保护资源请求。
(F) 由于访问令牌无效,资源服务器返回无效令牌错误。
(G) 客户端通过认证服务器进行身份验证并提供刷新令牌,请求新的访问令牌。客户端身份验证要求基于客户端类型和授权服务器策略。
(H) 授权服务器对客户端进行身份验证并验证刷新令牌,如果有效,则发放新的访问令牌(以及可选的新刷新令牌)。
根据上述流程,刷新令牌的目的是为了在访问令牌过期时获取新的访问令牌,并且它是一种安全合规的做法。
文章内容结束。