使用 Spring oAuth2 impl,是否可以在刷新令牌授予期间 "downgrade" 访问令牌的范围?

Using Spring oAuth2 impl, is it possible to "downgrade" the scopes of an access token during a refresh-token grant?

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

不允许 Public 客户端 授予管理员权限。 Access Token 是短暂的,Refresh Token 是无限期的。

机密客户 被允许发布管理范围。访问令牌是短暂的,刷新令牌是 24 小时。

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

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

... the user is not totally logged out, but on the next login he gets two new JWT's, one Access Token for regular user access and one matching Refresh Token for that access level.

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

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

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

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