我正在尝试使用此guide作为参考,通过SpringBoot实现Oauth2授权服务器。
我的密钥库只有一个密钥。我已经成功地创建了一个JWToken(可以在jwt.io上进行检查)。
我还有一个测试资源服务器。当我尝试访问任何端点时,都会收到以下消息:
{
"error": "invalid_token",
"error_description": "Invalid JWT/JWS: kid is a required JOSE Header"
}
该令牌确实没有孩子头,但是我不知道如何添加它。我只能使用TokenEnchancer将数据添加到其有效负载中。看来我还不是第一个with this issue。
是否可以添加此标头,或者至少在资源服务器上忽略它?
答案 0 :(得分:1)
我设法解决了这一问题,更改了用于标识客户端将在其中检索公共密钥的URL的参数。
在application.properties上,而不是:
security.oauth2.resource.jwk.key-set-uri=http://{auth_server}/.well-known/jwks.json
我用过:
security.oauth2.resource.jwt.key-uri=http://{auth_server}/oauth/token_key
如果我理解正确,那么 key-set-uri 配置会指向一个endpoitn,该endpoitn提供一组密钥,并且需要一个孩子。另一方面, key-uri 配置指向具有单个键的端点。
答案 1 :(得分:1)
我一直在写一篇可能对您有帮助的文章: https://www.baeldung.com/spring-security-oauth2-jws-jwk
因此,要配置Spring Security OAuth授权服务器以添加JWT kid 标头,可以按照4.9节的步骤进行操作:
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
public JwtAccessTokenConverter accessTokenConverter(KeyPair keyPair) {
return new JwtCustomHeadersAccessTokenConverter(keyPair);
}
在这里,我使用KeyPair实例获取签名密钥并配置转换器(基于本文的示例),但是您可以根据自己的配置进行修改。
在本文中,我还解释了Spring Security OAuth身份验证服务器提供的相关端点。
此外,关于@Ortomala Lokni的评论,我不希望Spring Security OAuth在这一点上添加任何新功能。或者,您可能需要等一下,看看计划在5.3.0
中发布的Spring Security的Authorization Server功能。