Spring Security 5.2 - как настроить NimbusJWTDecoder, используемый OAuth2ResourceServer?
У меня есть провайдер openid (openam), работающий локально. Я использую самозаверяющий сертификат, а URL-адрес jwks - @ https://localhost:8443/openam/oauth2/connect/
Из-за того, что сертификат ssl самоподписан, я получаю исключение SSLHandshake при декодировании токена oidc. Я попытался использовать собственный шаблон отдыха, создав собственный JwtDecoder (как предложено в https://docs.spring.io/spring-security/site/docs/current/reference/html5/)
@Bean
public JwtDecoder jwtDecoder() {
NimbusJwtDecoder.withJwkSetUri("https://localhost:8443/openam/oauth2/connect").restOperations(myCustomRestTemplateThatAllowsSelfSignedCerts()).build();
}
Но этот декодер вроде не используется. OidcIdTokenDecoderFactory используется для создания декодера. Этот класс, похоже, не позволяет нам передавать пользовательский jwtDecoder..
Почему декодер oauthResourceServer(). Jwt(). (CustomDecoder()) не работает? Как я могу заставить декодер работать с jwks uri, который является веб-сайтом с самоподписанным сертификатом?
Один из вариантов, о котором я думаю, - добавить самозаверяющий сертификат в папку cacerts моего jdk..
1 ответ
OAuth2LoginAuthenticationFilter
звонит OidcAuthorizationCodeAuthenticationProvider
для аутентификации OpenID. Чтобы изменитьJwtDecoder
что он использует, у вас должен быть JwtDecoderFactory
фасоль.
Например, у вас может быть что-то вроде:
@Bean
public JwtDecoderFactory<ClientRegistration> customJwtDecoderFactory() {
return new CustomJwtDecoderFactory();
}
static class CustomJwtDecoderFactory implements JwtDecoderFactory<ClientRegistration> {
public JwtDecoder createDecoder(ClientRegistration reg) {
//...
return new CustomJwtDecoder();
}
}
Надеюсь, это ответит хотя бы на часть вашего вопроса.