我不确定这是否是 Spring Boot 的一个错误,问题是我在 fusionauth 中创建了一个发行者“anyissuer”的租户,然后我使用 spring-boot- 配置了带有 spring boot 3.2.1 的 spring cloud gateway starter-oauth2-resource-server 具有:
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:9011/.well-known/openid-configuration/018d642c-e707-7349-95c7-ead15f625746
spring.security.oauth2.resourceserver.jwt.audiences[0]=018d642c-a7e8-75b1-96af-1ea04c3b0faa
这样做,当我尝试访问某些安全网址时,出现错误:配置中提供的发行者“anyissuer”与请求的发行者“http://localhost:9011/.well-known/openid”不匹配-配置/018d6028-e976-7aef-8d35-d65386e6b448"
但是在 http://localhost:9011/.well-known/openid-configuration/018d6028-e976-7aef-8d35-d65386e6b448 中,响应中的发行者是“anyissuer”。
我在 org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerJwkConfiguration 类中发现了这个方法
@Bean
@ConditionalOnProperty(
name = {"spring.security.oauth2.resourceserver.jwt.jwk-set-uri"}
)
ReactiveJwtDecoder jwtDecoder(ObjectProvider<JwkSetUriReactiveJwtDecoderBuilderCustomizer> customizers) {
NimbusReactiveJwtDecoder.JwkSetUriReactiveJwtDecoderBuilder builder = NimbusReactiveJwtDecoder.withJwkSetUri(this.properties.getJwkSetUri()).jwsAlgorithms(this::jwsAlgorithms);
customizers.orderedStream().forEach((customizer) -> {
customizer.customize(builder);
});
NimbusReactiveJwtDecoder nimbusReactiveJwtDecoder = builder.build();
String issuerUri = this.properties.getIssuerUri();
OAuth2TokenValidator<Jwt> defaultValidator = issuerUri != null ? JwtValidators.createDefaultWithIssuer(issuerUri) : JwtValidators.createDefault();
nimbusReactiveJwtDecoder.setJwtValidator(this.getValidators(defaultValidator));
return nimbusReactiveJwtDecoder;
}
它正在使用 spring.security.oauth2.resourceserver.jwt.issuer-uri 属性的值而不是 http://localhost:9011/.well-known/openid- 响应中的发行者值创建发行者验证器配置/018d642c-e707-7349-95c7-ead15f625746
综上所述,有没有办法使用 Spring Boot 3.2.1 配置 oauth2 资源服务器以从租户获取 openid-configuration (已解决指定 http://localhost:9011/.well-known/openid-configuration/ spring.security.oauth2.resourceserver.jwt.issuer-uri 属性中的 018d642c-e707-7349-95c7-ead15f625746 )并使 jwtDecorder 与发行者正常工作?
我使此“工作”的唯一方法是将我的租户发行者更改为http://localhost:9011/.well-known/openid-configuration/018d642c-e707-7349-95c7-ead15f625746
spring.security.oauth2.resourceserver.jwt.issuer-uri
属性的值不是指向OpenID配置的URI,它是访问令牌中颁发者声明(iss
)的值,并且该声明应包含一个URI(与您找到的相同)在 OpenID 配置中)。
此属性的主要功能是在 JWT 解码器中配置颁发者验证器。如果无法从颁发者处猜出 OpenID 配置(就像其中包含此 UUID),那么您必须配置
jwk-set-uri
属性(使用您在 JWK-set 端点的 OpenID conf 中找到的值),并且您可以将 issuer-uri
留空(没有发行者验证器),或者使用 exactly 设置访问令牌中的 iss
声明。