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();
    }
}

Надеюсь, это ответит хотя бы на часть вашего вопроса.

Другие вопросы по тегам