安全编码。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。