Я пытаюсь создать минимальную защищенную облачную среду openid. Следуя более или менее https://developer.okta.com/blog/2019/08/28/reactive-microservices-spring-cloud-gateway.
У меня есть весенний облачный шлюз, реестр консулов, приложение, зарегистрированное на 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-cookie и, таким образом, каждый запрос на запуск отбрасывает весь поток авторизации.
Я пробовал разные подходы к решению, например настройку ReactiveOAuth2AuthorizedClientService
вручную. Все мои подходы были больше похожи на догадки.
set-cookie
тоже нужно какое-то реле. - person PeMa   schedule 17.02.2020