security.oauth2.resource.jwt.key-value的编码

时间:2016-06-15 10:34:35

标签: java spring-security spring-boot spring-security-oauth2 oauth2

我使用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之前动态解码?另一个建议?

提前致谢。

1 个答案:

答案 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。