リソースサーバーでキークロークの証明書URLから公開鍵を動的に取得しようとしています。URL は負荷分散されていますが (lb://app-auth/...)、ニンバスはホストを解決できません。
正確なURLでテストしてキーを返したので、URLが正しいと確信しています。
エラーログ:
java.lang.IllegalStateException: Could not obtain the keys
at org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder$JwkSetUriReactiveJwtDecoderBuilder.lambda$null$2(NimbusReactiveJwtDecoder.java:382) ~[spring-security-oauth2-jose-5.4.5.jar!/:5.4.5]
org.springframework.web.reactive.function.client.WebClientRequestException: failed to resolve 'app-auth'; nested exception is java.net.UnknownHostException: failed to resolve 'app-auth'
at org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.lambda$wrapException$9(ExchangeFunctions.java:141) ~[spring-webflux-5.3.5.jar!/:5.3.5]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ Request to GET lb://app-auth/auth/realms/myrealm/protocol/openid-connect/certs [DefaultWebClient]
java.net.UnknownHostException: failed to resolve 'app-auth'
リソース サーバー構成:
@EnableWebFluxSecurity
class SecurityConfig {
private val jwkUrl = "lb://app-auth/auth/realms/app/protocol/openid-connect/certs"
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? {
http.csrf().disable()
.cors().and()
.authorizeExchange()
.pathMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.pathMatchers("/**").hasAuthority("SCOPE_trust")
.anyExchange().authenticated()
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(AuthenticationConverter())
return http.build()
}
@Bean
@Throws(Exception::class)
fun reactiveJwtDecoder(): ReactiveJwtDecoder? {
return NimbusReactiveJwtDecoder.withJwkSetUri(jwkUrl).build()
}
}
負荷分散された URL を持つことさえ可能ですか? もしそうなら、どうすればこれを達成できますか?