Spring Security + OAuth:本地 JWT 验证设置

问题描述 投票:0回答:1

我正在构建由 Keycloak 保护的微服务应用程序,并希望保护每个微服务。这里已经写了很多次了,每次您想要验证令牌时都查询 Auth 服务(Keycloak - 在我的例子中)并不是一个好主意。因此,一旦您的请求通过 API 网关传递到微服务,最好在本地验证签名。

所以,我想以这种方式设置我的 Spring 应用程序。

我说得对吗:

  1. jwt.jwk-set-uri
    参数负责本地检查JWT密钥。因此,当我进行设置时,将从 Keycloak 的端点获取打开密钥,以便将来离线检查 JWT 签名的有效性。每次检查时无需访问 Keycloak 的服务器。
  2. 如果我设置
    issuer-uri
    而没有
    jwk-set-uri
    ,则每个请求只会进行在线 JWT 检查。

如果以上均不正确,请描述您认为正确的方式。 不幸的是,Spring 的文档对此并没有那么详细,指出:

因此,资源服务器在启动时不会 ping 授权服务器。我们仍然指定颁发者 uri,以便资源服务器仍然验证传入 JWT 上的 iss 声明。

我正在谈论的配置在这里(application.yaml):

  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:3000/realms/msapp
          jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs

安全配置

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity()
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http
            .csrf().disable()
            .authorizeExchange()
                .pathMatchers("/login").permitAll()
            .anyExchange()
                .authenticated().and()
            .oauth2ResourceServer() 
                .jwt()
                .jwtAuthenticationConverter(keykloakJwtAuthConverter());
        return http.build();
    }
java spring spring-security oauth-2.0 spring-security-oauth2
1个回答
0
投票

根据文档:资源服务器

资源服务器将使用此属性(

issuer-uri:
)进一步自我配置,发现授权服务器的公钥,并随后验证传入的 JWT。

如果资源服务器必须能够独立于授权服务器启动,则可以提供

jwk-set-uri

我认为我已经回答了您的问题以了解更多详细信息,请阅读您自己的有关上面提供的资源服务器的文档,其中有一个很好的示例解释。

© www.soinside.com 2019 - 2024. All rights reserved.