安全编码。oauth2.resource.jwt.key-值
Encoding of security.oauth2.resource.jwt.key-value
我使用 Spring 引导和 spring-security-oauth2 模块来构建 RESTful API。
我还有一个(外部)身份验证服务器提供 JWT,以及一个用于验证签名的密钥 (security.oauth2.resource.jwt.key-value
);算法是HMAC。
问题是密钥是 base 64 url 编码的,据我阅读源代码的理解,属性 security.oauth2.resource.jwt.key-value
必须是纯文本。
我尝试手动解码密钥并在外部配置文件中设置它,但这不起作用。
所以问题是:我能做什么?有没有办法在配置 bean 之前对其进行动态解码?其他建议?
提前致谢。
我明白问题所在:我使用以下代码对 Base 64 url 编码的字符串进行解码:
final Base64.Decoder decoder = Base64.getUrlDecoder();
final byte[] decoded = decoder.decode(key.getBytes());
这使用默认的平台编码(在我的例子中是 UTF-8)。然后我将它重新编码为 String 以便设置为 JwtAccessTokenConverter
和
String decodedKey = new String(decoded);
稍后,JwtAccessTokenConverter
创建一个 MacSigner
的实例,以此字符串作为参数;它的构造函数从字符串中获取字节:
...
new SecretKeySpec(key.getBytes(), ...);
最后,在尝试验证 JWT 签名时失败。
实际上这行不通,因为在转换回字符串时会丢失信息:
assertThat(decoded, equalTo(decodedKey.getBytes)); // fails!
所以解决方案是用解码后的字节数组构建一个MacSigner
。我需要重新实现 JwtAccessTokenConverter。
我使用 Spring 引导和 spring-security-oauth2 模块来构建 RESTful API。
我还有一个(外部)身份验证服务器提供 JWT,以及一个用于验证签名的密钥 (security.oauth2.resource.jwt.key-value
);算法是HMAC。
问题是密钥是 base 64 url 编码的,据我阅读源代码的理解,属性 security.oauth2.resource.jwt.key-value
必须是纯文本。
我尝试手动解码密钥并在外部配置文件中设置它,但这不起作用。
所以问题是:我能做什么?有没有办法在配置 bean 之前对其进行动态解码?其他建议?
提前致谢。
我明白问题所在:我使用以下代码对 Base 64 url 编码的字符串进行解码:
final Base64.Decoder decoder = Base64.getUrlDecoder();
final byte[] decoded = decoder.decode(key.getBytes());
这使用默认的平台编码(在我的例子中是 UTF-8)。然后我将它重新编码为 String 以便设置为 JwtAccessTokenConverter
和
String decodedKey = new String(decoded);
稍后,JwtAccessTokenConverter
创建一个 MacSigner
的实例,以此字符串作为参数;它的构造函数从字符串中获取字节:
...
new SecretKeySpec(key.getBytes(), ...);
最后,在尝试验证 JWT 签名时失败。
实际上这行不通,因为在转换回字符串时会丢失信息:
assertThat(decoded, equalTo(decodedKey.getBytes)); // fails!
所以解决方案是用解码后的字节数组构建一个MacSigner
。我需要重新实现 JwtAccessTokenConverter。