将 spring-security-oauth2 授权服务器与 child 和 JWKS 一起使用?

Posted

技术标签:

【中文标题】将 spring-security-oauth2 授权服务器与 child 和 JWKS 一起使用?【英文标题】:Using spring-security-oauth2 Authorization Server with kid and JWKS? 【发布时间】:2019-05-27 16:13:07 【问题描述】:

按照文档 here 和 there,我设法设置了一个授权服务器,它发出使用非对称密钥签名的 JWT 访问令牌,资源服务器使用公钥的本地副本在本地验证这些令牌。到目前为止一切顺利。

我的最终目标是让资源服务器在授权服务器上使用 JWKS 端点,并使用 JWT 中的“kid”标头在 JWKS 中查找正确的密钥并在本地验证,支持密钥轮换。 我找到了how to make the Authorization Server expose a JWKS endpoint,还有how to specify the key-set-uri for the resource server。

不过好像没办法

在 JWKS 中发布孩子(密钥 id)值 在 JWT 中包含 child 标头

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

我找到了一种在 jwks 端点中设置孩子的方法:

@FrameworkEndpoint
public class JwkSetEndpoint 
    private final KeyPair keyPair;

    public JwkSetEndpoint(KeyPair keyPair) 
        this.keyPair = keyPair;
    

    @GetMapping("/.well-known/jwks.json")
    @ResponseBody
    public Map<String, Object> getKey() 
        RSAPublicKey publicKey = (RSAPublicKey) this.keyPair.getPublic();
        RSAKey key = new RSAKey.Builder(publicKey)
                .keyID("YOUR_KID_HERE")
                .keyUse(KeyUse.SIGNATURE).build();
        return new JWKSet(key).toJSONObject();
    


我没有找到在 JWT 的标头中设置它的方法。

【讨论】:

【参考方案2】:

在遇到同样的问题时,我偶然发现了这篇文章。所以我希望它对某人有用。我认为这不是最好的解决方案,所以也许有人想出了一个更好的答案,我希望例如设置一些外部 bean。

背景: Jwk 存储正在将令牌标头中的 KID 与内存中的 KID 进行比较,如果不可用,它将请求众所周知的端点

因此,将 KID 放入 JwkSetEndpoint 会生成一个包含 child 的 json 文件。 在此旁边,您需要获取 jwt 令牌标头上的 KID。

我在课堂上扩展 JwtAccessTokenConverter 的解决方案

@Override
protected String encode(OAuth2AccessToken accessToken, OAuth2Authentication authentication) 
    String content = null;
    try 
        content = objectMapper.formatMap(getAccessTokenConverter().convertAccessToken(accessToken, authentication));
     catch (Exception e) 
        throw new IllegalStateException("Cannot convert access token to JSON", e);
    
    Map<String, String> headers = getJwtHeader();

    String token = JwtHelper.encode(content, signer, headers).getEncoded();
    return token;

在 KID 标头旁边,Tokenstore 期望使用标头设置为签名。 我还必须覆盖签名者对象,因为我被 hmac 签名者而不是所需的 RsaSigner 卡住了。

【讨论】:

以上是关于将 spring-security-oauth2 授权服务器与 child 和 JWKS 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 spring-security-oauth2 的版本升级?

spring-security-oauth2 替代品

社交登录,spring-security-oauth2 和 spring-security-jwt?

Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core

spring-security-oauth2中的HttpSecurity配置问题

Spring-Security-Oauth2:默认登录成功 url