如果有人能帮我找到一个最好或最简单的方法,我将不胜感激。
我需要在我的应用程序和JWT令牌的合作伙伴之间进行通信
这些步骤如下:
我的主要疑问如下:
a.我需要使用spring-oauth2授权服务器吗?或者我可以只使用一些spring-security组件来生成令牌并公开jwksendpoint吗?b.如果我使用spring-oauth2授权服务器,我如何定制/oauth2/token以接收用户信息以生成令牌?c.如果我使用spring-oauth2授权服务器,我如何根化我的公钥?d.如果我只使用Spring安全组件,你能分享一些生成JWT的教程吗?e.如果我只使用Spring Security组件,那么在endpoint中生成jwks informatino是否简单?
关于项目a)
不需要像客户端凭据流这样的授权服务器,我的应用程序可以通过它自己生成JWT令牌,我使用Spring授权服务器只是为了获得生成令牌的所有结构的好处。利用Spring Boot结构真的有必要还是最好的方法,或者使用一些Spring Security组件来生成令牌是最简单的吗?
关于项目b)
如果最好的决定是使用Spring Oaut2授权服务器,我的想法是将 /oauth2/token与客户端凭据一起使用,但问题是,如果我在POST /oauth2/token请求中没有用户信息,我如何生成带有一些用户特定信息的JWT令牌?是否可以自定义授权服务器请求以在正文或标题中接收我需要的信息?我在谷歌中搜索了一下,似乎这是可能的。我只是想确认这样做是可以的。
关于项目c)
是否可以在 Spring oauth2 授权服务器中在不停机的情况下轮换公钥?
进程是否只是生成一个新的 jks,在服务器指向的路径中更改它并像授权服务器中的 POST /refresh 一样调用?
关于B项,我想出了一个解决方案。
您可以在请求中设置任何其他值
然后可以自定义令牌JWT恢复请求中发送的custom_value
@Bean
public OAuth2TokenCustomizer<JwtEncodingContext> jwtEncodingContextOAuth2TokenCustomizer(UserRepository userRepository){
return (context -> {
Authentication authentication = context.getPrincipal();
if (authentication.getPrincipal() instanceof String) {
OAuth2AuthorizationGrantAuthenticationToken tok = (OAuth2AuthorizationGrantAuthenticationToken) context.getAuthorizationGrant();
context.getClaims().claim("custom_clain", tok.getAdditionalParameters().get("custom_value"));
}
});
}
然后输出令牌将具有声明自定义值
JWT是签名的,您必须公开公钥,所以是的,使用授权服务器来发布令牌和公开密钥,但您不必使用Spring的:任何严肃的授权服务器都有设置私有声明的机制。
您可以使用任何OAuth2授权服务器,但OIDC实现将更容易用于其他参与者。
spring-security authorization-server的内置特性非常有限。在做出选择之前,你应该看看其他的解决方案。有很多是本地的(比如Keycloak)或者SaaS的(比如Auth0或者任何你的云提供商提议的,如果你被托管在云中的话)。
与内部安全相比,OAuth2有许多优势(这可能是您的合作伙伴要求它的原因)。我建议您实际上将所有安全性切换到OAuth2。选择授权服务器并将其配置为使用存量用户数据库后,配置: