spring-boot - 无效的 JWToken:kid 是必需的 JOSE 标头
问题描述
我正在尝试使用本指南作为参考使用 SpringBoot 实现 Oauth2 授权服务器。
我的密钥库只有一个密钥。我已经成功地创建了一个 JWToken(我可以在 jwt.io 上查看)。
我还有一个测试资源服务器。当我尝试访问任何端点时,我收到以下消息:
{
"error": "invalid_token",
"error_description": "Invalid JWT/JWS: kid is a required JOSE Header"
}
该令牌确实没有孩子标题,但我不知道如何添加它。我只能使用 TokenEnchancer 将数据添加到其有效负载中。看来我不是第一个遇到这个问题的人。
有什么方法可以添加此标头,或者至少在资源服务器上忽略它?
解决方案
我一直在写一篇可能对您有所帮助的文章: 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 的授权服务器功能,计划在5.3.0中发布
推荐阅读
- sql-server - “SQL 问题:如何在一个表中存储多个通配符字符串并将它们传递给 where 子句中的 LIKE 运算符”
- sql - 比较两个表后创建标志列
- html - div 椭圆形,带角,带 css
- netsuite - 如何在行级别添加动态链接?
- node.js - 将 JSON 更新到缓存中
- spring - 我如何在没有服务的情况下模拟 ResteTemplate 交换
- c# - 组策略覆盖了我以编程方式阻止 Win10 中睡眠的尝试。寻找让它保持清醒的骇人听闻的方法?
- r - Snakemake:构建 DAG 的工作......无事可做
- python - Python 将连字符附加到 API 的日期输出
- appium - 当我以前运行 Appium 页面对象模型代码时,它显示错误,例如“无法通过此策略定位元素:定位器映射:”