为啥要撤销访问令牌?

Posted

技术标签:

【中文标题】为啥要撤销访问令牌?【英文标题】:Why should you revoke access token?为什么要撤销访问令牌? 【发布时间】:2021-07-29 18:23:45 【问题描述】:

我不明白您为什么要在注销时撤销访问令牌。我的意思是你应该从安全角度获得什么,而当你浏览到应用程序时,有一个刷新令牌用于获取新的访问令牌? 从安全的角度来看,我看不到任何使用计算机的人都可以使用的刷新令牌并浏览到应用程序的好处。

【问题讨论】:

【参考方案1】:

我不明白你为什么要在注销时撤销访问令牌。

访问令牌不能被撤销。它们用于授权,并在令牌未过期的情况下授予访问令牌的持有者访问数据的权限。

注销是身份验证,这是两个截然不同的概念。

我的意思是,从安全角度来看,当您浏览应用程序时有一个刷新令牌用于获取新的访问令牌时,您应该获得什么?

您再次将授权(OAuth 2.0 访问令牌刷新令牌)与身份验证(打开 id 连接,登录用户)混合在一起。

使用 OAuth 2.0,应用程序被授予访问用户数据的权限,他们被授予访问令牌和刷新令牌。应用程序可以在需要时访问用户数据,而无需用户在场。

从安全角度看,当任何使用计算机的人都可以使用刷新令牌并浏览到应用程序时,我看不到任何好处。

这是 OAuth 2.0 的确切点,它可以在用户不存在时授予应用程序访问用户数据的权限。这不是身份验证。

【讨论】:

你的意思是你撤销刷新令牌,而不是访问令牌?当您注销时,这两个令牌会发生什么? Nothing 这两个令牌与登录或注销无关。当用户未登录时,刷新令牌用于离线访问用户数据。如果您使用表示用户已登录的开放 Id 连接,您应该有一个 IdToken。 "刷新令牌携带获取新访问令牌所需的信息。换句话说,每当需要访问令牌来访问特定资源时,客户端都可以使用刷新令牌来获取新访问权限身份验证服务器颁发的令牌。” 这与登录身份验证无关,因为用户不需要在那里 是的,但我的问题是,如果我注销并离开计算机,然后其他人来使用我的计算机浏览应用程序,会发生什么情况?刷新令牌是否使入侵者能够使用我的计算机浏览应用程序并使用它访问我的数据?因为刷新令牌在那里,因为他不需要再次登录并获得新的访问令牌。【参考方案2】:

虽然 OAuth 2.0 的概念基于未撤销的短期访问令牌,但该规则也有例外,并且有一个协议规范适用于令牌撤销,RFC 7009 OAuth 2.0 令牌撤销https://datatracker.ietf.org/doc/html/rfc7009。

在撤销访问令牌时,还应确保同时撤销刷新令牌(规范规定撤销刷新令牌也会撤销关联的访问令牌)。当令牌长期存在并且怀疑存在某些违规、未经授权的第三方令牌访问或其他令牌泄漏时,这一点变得更加重要。

【讨论】:

【参考方案3】:

当用户从基于 OAuth2 的会话中注销时,他们可能希望确保同一台计算机上的每个应用程序都不能再代表用户执行操作。

例如,也许您的组织有一个跨多个应用程序的单点登录系统,有些甚至是第三方应用程序。当用户注销时,您不能依赖应用程序“自行注销”。也许他们得到的只是一个会话 cookie,位于浏览器的 cookie jar 中等待下一个请求。

如果我在一台机器上注销,我希望保证没有任何东西可以代表我采取行动,哪怕是一分钟。

【讨论】:

以上是关于为啥要撤销访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2 中的访问令牌撤销实现

如何以管理员用户身份撤销用户的访问令牌和刷新令牌?在 Oauth2 中使用 JWT

撤销 Keycloak 访问令牌

Oauth2/Openid 连接。如何撤销未知的访问/刷新令牌

为啥要在服务器端保存刷新令牌?

JWT, 为啥需要刷新令牌?