当前位置: 首页 > 知识库问答 >
问题:

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

云新知
2023-03-14

根据这里和那里的文档,我设法设置了一个授权服务器,该服务器提供使用非对称密钥签名的JWT访问令牌,资源服务器使用公钥的本地副本在本地验证这些令牌。到现在为止,一直都还不错。

我的最终目标是让资源服务器在授权服务器上使用JWKSendpoint,并使用JWT中的“kid”头在JWKS中查找正确的密钥并在本地进行验证,从而支持密钥轮换。我发现了如何使授权服务器公开JWKSendpoint,以及如何为资源服务器指定密钥集uri。

然而,似乎没有办法

  • 在JWKS中发布kid(密钥id)值

有办法做到这一点吗?

共有2个答案

呼延鸿畅
2023-03-14

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

背景:Jwk存储区正在比较令牌头中的KID与内存中的KID,如果不可用,它将请求已知endpoint

因此,将KID放在JwkSetEndpoint将导致一个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希望将use标头设置为signing。我还必须重写signer对象,因为我被一个hmac签名者而不是所需的RsaSigner卡住了。

佴波鸿
2023-03-14

我找到了在jwksendpoint中设置孩子的方法:

@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的标题中设置它的方法。

 类似资料:
  • 我在下面设置Spring配置: 和Maven设置如下:

  • 尝试使用 Spring 授权服务器实现 OAuth2 协议。使用以下配置创建了一个简单的应用程序。 调用以下endpoint时: 我得到这些: 我正在尝试通过身份验证并尝试遵循此文档。我尝试了多个电话,其中之一是: 我大部分时间都是带着不同的信息返回401。我真的想不出在哪里可以找到一些带有示例的文档,因为我能够找到的示例对我的用例没有什么帮助。我不完全理解如果客户端是前端应用程序,我将如何验证和

  • 我有一个Spring启动应用程序,我想结合我自己的和远程的OAuth2授权服务器(谷歌,脸书等)加上基本身份验证。 我想要: 常规登录/密码流程(通过电子邮件确认)访问除 /api以外的任何url OAuth2访问 /api网址 SSO(谷歌、Facebook…) 我有单点登录的问题。我希望它的工作原理是这样的:当用户成功授权时,我将获得电子邮件地址,然后如果它还没有存在于我的应用程序中,我将注册

  • 因此,为了简单起见,我只是将添加到MyWebSecurity类的方法中,这解决了选项请求的问题,但因此POST请求不再起作用,而且(同时使用curl)。 我试图找出是否必须以某种方式连接MyWebSecurity类和AuthServer,但没有任何运气。原始示例(开头的链接)也注入了authenticationManager,但这对我没有什么改变。

  • 我需要了解在我的项目范围内使用autheorizaion服务器的便利性。 我们正在实现我们的服务并将其部署到客户环境中。 客户基础结构已经提供了一种身份验证机制,以便对用户进行身份验证。 此机制拦截所有通信并将用户重定向到“登录”表单。 之后,用户被重定向到我们的服务,我们必须处理和消化它,并使用JWT令牌进行响应。 这是我感到迷茫的地方: 我在想: 使用Spring oauth2 向授权服务器请

  • 我已经创建了单独的spring boot oAuth2单独的服务器,并通过使用下面的配置在单独的REST API项目中使用secure。除了这个标签@preauthorize(“hasauthority('user')”)之外,一切都很好。它不起作用 YML配置:安全性:oauth2:resource:token-info-uri:http://127.0.0.1:9191/oauth/check