如何将 JWK 与 spring 一起使用?

How to use JWKs with spring?

我得到了在项目上实施 jwks 的任务。在我们的项目中,我们已经使用 oauth2 实现了令牌验证检查。我们使用 jks 格式的证书来获取一个 public 密钥。我们的项目中没有使用私钥,因为我们需要检查令牌的有效性。我们的目标是摆脱 .jks 文件。 jwks资源太少,所以有些地方不清楚。 如果我理解正确,那么 jwks 的意思是资源中有一个 jwks.json 文件,里面有密钥,我们 select by kid 来自令牌头。根据文档,不清楚它是什么类型的文件以及它是如何被kid检查的,也就是说,在什么时候它 happens.Does 谁有一个项目可以作为例子?提前致谢

https://docs.spring.io/spring-security-oauth2-boot/docs/2.2.x-SNAPSHOT/reference/html/boot-features-security-oauth2-authorization-server.html

您可以使用spring-引导资源服务器实现。

首先,你需要在你的项目中添加如下依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>

其次,您需要添加一个认证服务器配置。您提到的 JSON 文件必须位于身份验证服务器上,或者您可以使用身份验证服务器的 JWK URL。 您的属性文件中应该有这样的配置。

spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https:/example.com/.well-known/openid-configuration/jwks
spring.security.oauth2.resourceserver.jwt.issuer-uri=https:/example.com

最后还需要按照自然spring-security API配置。你需要的是这样的。

@Configuration
@EnableWebSecurity
public class SecureSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
    private String jwtSetUri;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requiresChannel().anyRequest().requiresInsecure().and().cors()
                .and().csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "some path1").permitAll()
                .antMatchers(HttpMethod.POST, "some path2").permitAll()
                .antMatchers(HttpMethod.GET, "some path3").permitAll()
                .antMatchers("/**").hasAuthority("some scope") // if you need this scope.
                .anyRequest()
                .authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt().decoder(jwtDecoder());
    }


    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("DELETE");
        source.registerCorsConfiguration("/**", config);
        return source;
    }

    private JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri(jwtSetUri)
                .jwtProcessorCustomizer(p -> p.setJWSTypeVerifier(
                        new DefaultJOSEObjectTypeVerifier<>(new JOSEObjectType("at+jwt")))).build();
    }
}

在此之后,Spring 应使用身份验证服务器自动验证对您 API 的每个请求。