Ошибка Spring вызвана: java.lang.IllegalArgumentException: Невозможно разрешить конфигурацию с предоставленным издателем “Issuer-uri”

Вопрос или проблема

У меня запущен экземпляр Keycloak, к которому я обычно обращаюсь. Все конечные точки Keycloak работают должным образом. Я пытался соединить свое Spring приложение с Keycloak через следующее:

App.yaml:

(https://i.sstatic.net/tLXfhxyf.png)

SecurityConfig:

``@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/public/**", "/oauth2/**", "/login/**").permitAll()
                    .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                    .loginPage("/oauth2/authorization/keycloak")
                    .defaultSuccessUrl("/", true)
            )
            .logout(logout -> logout
                    .logoutSuccessUrl("/")
                    .permitAll()
            );

    return http.build();
}

@Bean
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
    return new NullAuthenticatedSessionStrategy();
}

@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
        ClientRegistrationRepository clientRegistrationRepository,
        OAuth2AuthorizedClientRepository authorizedClientRepository) {

    OAuth2AuthorizedClientProvider authorizedClientProvider =
            OAuth2AuthorizedClientProviderBuilder.builder()
                    .authorizationCode()
                    .refreshToken()
                    .build();

    DefaultOAuth2AuthorizedClientManager authorizedClientManager =
            new DefaultOAuth2AuthorizedClientManager(
                    clientRegistrationRepository, authorizedClientRepository);
    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

    return authorizedClientManager;
    }
}``

KeycloakConfig:

@Configuration
public class KeycloakConfig {

@Value("${spring.security.oauth2.client.provider.keycloak.issuer-uri}")
private String serverUrl;

@Value("${spring.security.oauth2.client.registration.keycloak.client-id}")
private String clientId;

@Value("${spring.security.oauth2.client.registration.keycloak.client-secret}")
private String clientSecret;

@Bean
public Keycloak keycloak() {
    return KeycloakBuilder.builder()
            .serverUrl("http://localhost:8080") // Уберите область из URL сервера
            .realm("FlowUsers")  // Жестко закодируйте область или сделайте ее настраиваемой при необходимости
            .clientId(clientId)
            .clientSecret(clientSecret)
            .grantType("client_credentials")
            .build();
}

}`

Тем не менее, я продолжаю получать эту ошибку каждый раз, когда запускаю Spring приложение: ‘clientRegistrationRepository’ вызвал исключение с сообщением: Невозможно разрешить конфигурацию с предоставленным идентификатором “http://localhost:8080/realms/FlowUsers”

Я протестировал конечные точки Keycloak, и они возвращают правильные результаты, дважды проверил каждый URL в своем yaml.

Ответ или решение

Ошибка java.lang.IllegalArgumentException: Unable to resolve Configuration with the provided Issuer of "Issuer-uri" в приложении Spring, использующем Keycloak, является распространенной проблемой, с которой сталкиваются разработчики при интеграции аутентификации и авторизации с OpenID Connect (OIDC).

Проблематика

Ошибку вызывает неправильная конфигурация, связанная с параметром issuer-uri, который используется для определения источника конфигурации. В вашем случае приложение не может разрешить конфигурацию для указанного issuer URI http://localhost:8080/realms/FlowUsers, что вызывает подобное исключение.

Что может быть не так

  1. Неправильный URL провайдера Issuer: Убедитесь, что URL issuer-uri соответствует тому, что вы указали в конфигурации. В случае Keycloak URL должен выглядеть так:

    http://localhost:8080/realms/FlowUsers

    Параметр issuer-uri должен указывать на корневой URL вашего Keycloak с добавлением пути к.realm’.

  2. YAML конфигурация: Проверьте, что файл application.yaml содержит правильные параметры:

    spring:
     security:
       oauth2:
         client:
           registration:
             keycloak:
               client-id: ваш_client_id
               client-secret: ваш_secret
           provider:
             keycloak:
               issuer-uri: http://localhost:8080/realms/FlowUsers

    Важно, чтобы поля client-id и client-secret совпадали с теми, что настроены в вашей консоли Keycloak.

  3. Правильный Realm: Убедитесь, что вы правильно указали название вашего realm в Keycloak, в данном случае это FlowUsers. Если название realm указано неверно, то возникнет ошибка.

  4. Версия библиотеки: При использовании Spring Security и Spring Boot также важно следить за версиями сторонних библиотек. Интеграция с Keycloak, особенно в случае использования OAuth 2.0 или OpenID Connect, требует, чтобы клиентские библиотеки были совместимы с сервером Keycloak.

Решение проблемы

  1. Перепроверьте YAML конфигурацию: Удостоверьтесь, что все прописано корректно и соответствуют настройкам на сервере Keycloak.

  2. Используйте правильный базовый URL: Убедитесь, что базовый URL для вашего Keycloak настроен правильно и лидирует к актуальным endpoints.

  3. Compare Keycloak settings: Пройдите в админ-панель Keycloak, выберите созданный клиент и убедитесь, что все параметры, такие как Valid Redirect URIs, настроены корректно, чтобы они соответствовали вашему приложению.

Пример корректной YAML конфигурации

Вот улучшенный пример файла application.yaml, который может помочь устранить ошибку:

spring:
  security:
    oauth2:
      client:
        registration:
          keycloak:
            client-id: ваш_client_id
            client-secret: ваш_secret
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          keycloak:
            issuer-uri: http://localhost:8080/realms/FlowUsers

Заключение

После проведения описанных выше действий и внесения необходимых исправлений, ваше приложение Spring должно успешно интегрироваться с Keycloak. Если проблема сохраняется, возможно, стоит обратиться к логам приложения для более глубокого анализа.

Оцените материал
Добавить комментарий

Капча загружается...