带有 JWT 的 Spring Security Oauth2 真的是无状态的吗?
Posted
技术标签:
【中文标题】带有 JWT 的 Spring Security Oauth2 真的是无状态的吗?【英文标题】:Is Spring Security Oauth2 with JWT really stateless? 【发布时间】:2016-06-09 19:10:41 【问题描述】:我正在尝试使用 Spring 设置 REST-API。为了保护它,我目前使用带有 JWT 令牌的 Spring Security oAuth2。我的 REST-API 应用程序将 AuthorizationServer 和 ResourceServer 合二为一。
我现在的问题是,一旦生成了令牌,在我的 REST-API 应用程序重新启动后就不再有效。当我运行它的 2 个实例时也是如此。在其中一个上生成并有效的令牌在另一个上无效。
我发现 JwtAccessTokenConverter 的实现是在启动时随机生成一个signingKey/verifierKey。这当然解释了我的观察,但给我留下了一个问题:这怎么可能是无状态的?
如果我的想法有误,或者我错过了一些重要的细节,请纠正我。但现在对我来说,这种行为似乎违背了 JWT 的目的。
【问题讨论】:
您确定您的 JwtAccessTokenConverter 实现在启动时会随机生成一个密钥吗?您的 spring 配置中没有私钥/公钥吗? 感谢您的回答。是的,我敢肯定。我正在使用你可以在这里找到的 spring 实现github.com/spring-projects/spring-security-oauth/blob/master/… 你可以在第 81 行和第 85 行看到它是如何生成的。 【参考方案1】:到目前为止,感谢您的回答,但我只是自己想通了。
随机生成的签名/验证者密钥只是一个默认值,可能不应该使用。不幸的是,这并没有真正记录在案。 我现在在启动时手动设置这些键。结果是,我的令牌在我的所有 REST-API 实例上都有效,并且在重新启动后仍然有效。
我猜随机值更像是一个“安全默认值”,这样人们就不会意外使用相同的已知密钥。
【讨论】:
以上是关于带有 JWT 的 Spring Security Oauth2 真的是无状态的吗?的主要内容,如果未能解决你的问题,请参考以下文章
带有 JWT 令牌的 Spring Security 在每个请求上加载 spring UserDetails 对象
带有 JWT 令牌的 Spring Security 和 Websocket
带有 JWT 的 Spring Security Oauth2 真的是无状态的吗?
带有 JWT 的 Spring Security OAuth2 重定向到登录页面