我使用spring-security-oauth2模块的Spring Boot来构建RESTful API。
我还有一个(外部)auth服务器提供JWT,以及一个密钥来验证签名(security.oauth2.resource.jwt.key-value
);算法是HMAC。
问题是密钥是base 64 url编码的,据我所知,阅读源代码时,属性security.oauth2.resource.jwt.key-value
必须是纯文本。
我尝试手动解码密钥并将其设置在外部配置文件中,但这不起作用。
所以问题是:我该怎么办?有没有办法在配置bean之前动态解码?另一个建议?
提前致谢。
答案 0 :(得分:1)
我理解这个问题:我使用以下代码解码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
使用此String作为参数创建MacSigner
的实例;它的构造函数从String获取字节:
...
new SecretKeySpec(key.getBytes(), ...);
最后,在尝试验证JWT签名时,它失败了。
事实上,这是行不通的,因为在转换回String时会丢失信息:
assertThat(decoded, equalTo(decodedKey.getBytes)); // fails!
因此解决方案是使用解码的字节数组构建MacSigner
。我需要重新实现JwtAccessTokenConverter。