我一直在撰写一篇可能对您有所帮助的文章:
https://www.baeldung.com/spring-security-oauth2-jws-jwk
所以,要配置一个 Spring Security OAuth 授权服务器来添加一个 JWT kid 头,你可以按照 4.9 节的步骤:
- 创建一个扩展 JwtAccessTokenConverter 的新类
- 在构造函数中:
- 使用您一直使用的相同方法配置父类
- 使用您正在使用的签名密钥获取 Signer 对象
- 覆盖编码方法。实现将与父实现相同,唯一的区别是您还将在创建字符串令牌时传递自定义标头
public class JwtCustomHeadersAccessTokenConverter extends JwtAccessTokenConverter {
private JsonParser objectMapper = JsonParserFactory.create();
final RsaSigner signer;
public JwtCustomHeadersAccessTokenConverter(KeyPair keyPair) {
super();
super.setKeyPair(keyPair);
this.signer = new RsaSigner((RSAPrivateKey) keyPair.getPrivate());
}
@Override
protected String encode(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
String content;
try {
content = this.objectMapper.formatMap(getAccessTokenConverter().convertAccessToken(accessToken, authentication));
} catch (Exception ex) {
throw new IllegalStateException("Cannot convert access token to JSON", ex);
}
Map<String, String> customHeaders = Collections.singletonMap("kid", "my_kid");
String token = JwtHelper.encode(content, this.signer, this.customHeaders)
.getEncoded();
return token;
}
}
- 然后,当然,使用这个转换器创建一个 bean:
@Bean
public JwtAccessTokenConverter accessTokenConverter(KeyPair keyPair) {
return new JwtCustomHeadersAccessTokenConverter(keyPair);
}
这里我使用了一个 KeyPair 实例来获取签名密钥并配置转换器(基于文章的示例),但您可以根据自己的配置进行调整。
在文章中我还解释了 Spring Security OAuth Authentication Server 提供的相关端点。
另外,关于@Ortomala Lokni 的评论,我不希望 Spring Security OAuth 在这一点上添加任何新功能。作为替代方案,您可能可以等待查看 Spring Security 的 Authorization Server 功能,计划在 5.3.0 发布。