如何配置反应式资源服务器以使用具有对称密钥的 JWT?

Posted

技术标签:

【中文标题】如何配置反应式资源服务器以使用具有对称密钥的 JWT?【英文标题】:How to configure a Reactive Resource Server to use a JWT with a symmetric key? 【发布时间】:2021-02-21 18:22:43 【问题描述】:

在授权服务器上,我的 Jwt 是这样生成的:

      @Value("$jwt.key")
      private String jwtKey;

      @Override
      public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
        endpoints
            .authenticationManager(authenticationManager)
            .tokenStore(tokenStore)
            .accessTokenConverter(jwtAccessTokenConverter);
      
    
      @Bean
      public TokenStore tokenStore() 
        return new JwtTokenStore(jwtAccessTokenConverter());
      
    
      @Bean
      public JwtAccessTokenConverter jwtAccessTokenConverter() 
        var converter = new JwtAccessTokenConverter();
        converter.setSigningKey(jwtKey);
        return converter;
      

现在在响应式资源服务器端:

  @Value("$jwt.key")
  private String jwtKey;

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
    return http
        .authorizeExchange()
        .anyExchange().authenticated()
        .and()
        .oauth2ResourceServer()
        .jwt(jwtSpec -> ...)
        .and.build();
  

在给定签名密钥的情况下,如何配置我的反应式资源服务器以使用该令牌?

【问题讨论】:

你在使用 Spring Boot 吗? (如果没有,为什么不使用 Webflux?) 是的,我用的是spring boot 我不知道你在说什么。 jwt 没有“密钥”。而且您不使用“令牌”。您使用 jwk(json web 密钥)对 jwt 进行签名,并且您的授权服务器中有私钥,并且您将公钥分发给需要验证标牌的所有应用程序。您的标准,为资源服务器提供一个 url,以便授权服务器可以按给定的时间间隔轮换密钥。而且您不应该在两台服务器之间“共享”相同的密钥。您需要一个密钥对。 如果你的术语正确并理解你是如何做到的,它会记录在 spring boot 安全参考手册中。我建议你阅读一下 oauth 和 jwts 的工作原理,文档真的很好docs.spring.io/spring-security/site/docs/current/reference/… 请告诉我配置...这就是我在这里的原因。我知道如何管理非反应性。但对于反应式,它似乎必须通过 .oauth2ResourceServer().jwt(jwtSpec -> ...) 。我只是不认识男人 【参考方案1】:
  @Value("$jwt.key")
  private String jwtKey;

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
    return http
        .authorizeExchange()
        .anyExchange().authenticated()
        .and()
        .oauth2ResourceServer()
        .jwt(jwtSpec ->  jwtSpec.decoder(jwtDecoder()); )
        .and.build();
  

  @Bean
  public JwtDecoder jwtDecoder() 
    SecretKey secretKey = new SecretKeySpec(jwtKey, "HMACSHA256");
    return NimbusJwtDecoder
            .withSecretKey(secretKey)
            .macAlgorithm(MacAlgorithm.HS256)
            .build();
 

除非您指定签名算法,否则授权服务器使用 HMACSHA256 作为默认算法。所以你需要在资源服务器配置中指定这个。

【讨论】:

只是一个小修正,它适用于ReactiveJwtDecoderNimbusReactiveJwtDecoder

以上是关于如何配置反应式资源服务器以使用具有对称密钥的 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用对称密钥配置 Microsoft JWT?

如何使用对称密钥配置 Microsoft JWT?

具有反向密钥角色的非对称密码学

相关性的说明

使用 HSM 的对称加密密钥

markdown 如何配置ssh配置以使多个私有github依赖关系具有多个部署密钥和自动部署。