使用 Spring oAuth2 impl,是不是可以在刷新令牌授予期间“降级”访问令牌的范围?

Posted

技术标签:

【中文标题】使用 Spring oAuth2 impl,是不是可以在刷新令牌授予期间“降级”访问令牌的范围?【英文标题】:Using Spring oAuth2 impl, is it possible to "downgrade" the scopes of an access token during a refresh-token grant?使用 Spring oAuth2 impl,是否可以在刷新令牌授予期间“降级”访问令牌的范围? 【发布时间】:2017-02-18 22:12:46 【问题描述】:

我有两个客户端,一个是普通最终用户通过我们的网页或本地应用程序登录使用的公共客户端,另一个是我们的管理系统的机密客户端。两者都发出两个 JWT,一个访问令牌和一个刷新令牌。

公共客户不允许发布管理员权限。 Access Token 寿命短,Refresh Token 寿命无限。

机密客户可以发布管理范围。 Access Token 的生命周期很短,而 Refresh Token 的生命周期是 24 小时。

是否可以在刷新令牌过期后使用 Spring Security 及其 oAuth2 实现来降级管理员用户?也就是说,一旦用户登录 24 小时,用户并没有完全注销,但在下一次登录时,他会获得两个新的 JWT,一个用于常规用户访问的访问令牌和一个用于该访问级别的匹配刷新令牌。我想我正在 Spring Security 框架中寻找某种钩子,它允许我以自定义方式处理令牌过期。

【问题讨论】:

【参考方案1】:

关于你的问题有一句话让我有点困惑,但我想详细说明其他方面,所以这不适合评论。

...用户并未完全退出,但在下次登录时他获得了两个新的 JWT,一个用于常规用户访问的访问令牌和一个用于该访问级别的匹配刷新令牌。

下次登录到底是什么意思?我的困惑是,如果目标不是注销用户,那么 不会 进行下一次登录。我想这可能意味着在刷新令牌到期的几乎结束时,您会想要执行降级请求并使用仍然有效的刷新令牌来获得一对具有较少权限的新令牌。

根据 OAuth 规范,您可以执行刷新令牌请求并要求服务器提供范围小于您当前拥有的访问令牌的访问令牌。但是,它还规定,如果返回新的刷新令牌,则该令牌需要与请求中包含的刷新令牌具有完全相同的范围。

就个人而言,对于这种情况,我会考虑而不是降级令牌,只需确保为了执行任何与管理员相关的操作,用户必须是管理员并且在过去 24 小时内实际提供了他的凭据。您可以通过跟踪给定用户实际执行登录的日期和时间(通过提供他们的凭据)然后根据该值授权管理员操作来完成此操作。这样,您可以增加机密客户端的刷新令牌的生命周期,并且仅在管理员想要执行特权任务并且他们当前的令牌不够新鲜时才强制他们再次登录。

最后,仍然是refresh tokens 的主题(重点是安全注意事项部分)...当您说公共客户端的网络应用程序时,我假设它是基于浏览器的javascript 应用程序。如果这是正确的,通常不建议对这些应用程序使用刷新令牌,因为刷新令牌通常是长期存在的(在您的情况下,它们似乎永远不会过期)并且浏览器无法确保它们的安全存储。这增加了它们泄漏的可能性,这将使攻击者在令牌的生命周期内访问应用程序。您可能有其他限制因素导致此安全注意事项不适用,但我还是想提请您注意。

【讨论】:

对于“下次登录”,我实际上提到了“与后端的下一次交互”,抱歉。我想我无法更改刷新令牌的范围这一事实确实回答了我的问题。你的提议很好,除非我得到太多的管理员交互。然后我将失去分布式授权的好处,并且我的帐户服务的负载将增加。我可能会再次使用会话缓存...如果不使用刷新令牌模式,我如何让用户使用 JWT 登录并且仍然可以(模拟)撤销令牌?如何禁止使用 name+pw 登录的用户? 使用不记名令牌(自包含 JWT)的一个缺点是令牌撤销变得更加混乱,RFC 7009 通过声明在这些情况下授权服务器和资源服务器之间的后端交互来承认这一点可用于提供立即访问令牌撤销。我认为没有涵盖这种交互的标准。

以上是关于使用 Spring oAuth2 impl,是不是可以在刷新令牌授予期间“降级”访问令牌的范围?的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 中成功 Oauth2 登录后 Cookie 身份验证而不是 JWT Bearer Token

Spring oauth2 插入井号而不是 ?在使用令牌重定向到资源服务器时

使用带有 oauth2 的 spring 云网关

在 Spring Boot OAUTH2 中返回 RESTful/json 响应而不是登录表单

Spring Cloud:保护微服务 - OAuth2.0的介绍

使用 Spring Security 实现 OAuth2 隐式授权