Spring Cloud Security с Token Relay: в ответе есть пустой заголовок набора cook ie - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь создать минимальную защищенную облачную среду openid. После более или менее https://developer.okta.com/blog/2019/08/28/reactive-microservices-spring-cloud-gateway.

У меня есть шлюз Spring Cloud, реестр консулов, приложение, зарегистрированное в okta, и простое тестовое приложение с одним контроллером, возвращающим строку. И шлюз, и тестовое приложение зависят от 'com.okta.spring', name: 'okta-spring-boot-starter', version: '1.4.0'.

Шлюз настроен так (пропустите ssl здесь для краткости):

spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
    gateway:
      default-filters: 
        - TokenRelay
      discovery:
        locator:
          enabled: true
okta:
  oauth2:
    issuer: ${OKTA_OAUTH2_ISSUER}
    client-id: ${OKTA_OAUTH2_CLIENT_ID}
    client-secret: ${OKTA_OAUTH2_CLIENT_SECRET}

, и я добавил минимальную конфигурацию безопасности:

private final ReactiveClientRegistrationRepository clientRegistrationRepository;

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
    http
            .redirectToHttps()
            .and()
            .authorizeExchange()
            .pathMatchers("/login").permitAll()
            .pathMatchers("/actuator/**").permitAll()
            .anyExchange().authenticated()
            .and()
            .oauth2Login()
            .and()
            .logout(logout -> logout.logoutSuccessHandler(oidcLogoutSuccessHandler()))
            .oauth2ResourceServer()
            .jwt();
    return http.build();
}

private ServerLogoutSuccessHandler oidcLogoutSuccessHandler() {
    OidcClientInitiatedServerLogoutSuccessHandler oidcLogoutSuccessHandler =
            new OidcClientInitiatedServerLogoutSuccessHandler(clientRegistrationRepository);

    oidcLogoutSuccessHandler.setPostLogoutRedirectUri(URI.create("https://<my-uri>"));

    return oidcLogoutSuccessHandler;
}

Тестовое приложение также настроило okta openid в application.yml, как в шлюзе, плюс:

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
    http
            .authorizeExchange()
            .pathMatchers("/actuator/**").permitAll()
            .anyExchange().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();

    Okta.configureResourceServer401ResponseBody(http);

    return http.build();
}

Моя проблема:

Когда я удаляю ретрансляция токена и сохранение незащищенного тестового приложения, шлюз успешно выполнит авторизацию, а ответ содержит заголовок set-cookie, который можно использовать в последующих запросах для обеспечения повторного прохождения через весь поток авторизации.

Однако, добавив токен-реле с помощью 'org.springframework.cloud:spring-cloud-starter-security' (и настроенный как фильтр по умолчанию, как показано выше), возвращает пустой заголовок set-cook ie и, таким образом, каждый запрос о запуске throw весь поток авторизации.

Я пробовал разные подходы к решению, например, ручную настройку ReactiveOAuth2AuthorizedClientService. Мои подходы все больше походили на догадки.

1 Ответ

0 голосов
/ 06 апреля 2020

Оказалось, что решение заключается в удалении заголовка cook ie из последующего запроса. Это может быть достигнуто путем добавления другого фильтра по умолчанию к шлюзу:

spring:
  cloud:
    gateway:
      default-filters: 
        - TokenRelay=
        - RemoveRequestHeader=Cookie
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...