Spring Cloud Gateway в качестве клиента oauth2 и реагирующее на него приложение, получающее 404 NOT FOUND
У меня есть приложение React и облачный шлюз Spring в качестве клиента oauth2 и сервер авторизации Spring в качестве сервера OAuth2, поэтому я хочу разместить свое приложение реагирования за шлюзом (BFF)
это мои шлюзовые маршруты:
spring:
cloud:
gateway:
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
routes:
- id: api
uri: http://192.168.111.58:8000
predicates:
- Path=/api/**
filters:
- SaveSession
- TokenRelay
- StripPrefix=1
- id: ui
uri: http://192.168.111.58:3000
predicates:
- Path=/ui/**
и конфигурация безопасности моего шлюза:
@Configuration
@EnableWebFluxSecurity
public class OAuth2SecurityConfig {
@Value(value = "${spring.security.oauth2.client.post-logout-redirect-uri}")
private String postLogoutRedirectUri;
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http, ReactiveClientRegistrationRepository repository) {
// http.headers(headerSpec -> headerSpec
// .referrerPolicy(referrerPolicySpec -> referrerPolicySpec
// .policy(ReferrerPolicyServerHttpHeadersWriter.ReferrerPolicy.NO_REFERRER_WHEN_DOWNGRADE)));
//
// http.csrf((csrf) -> csrf
// .csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
// .csrfTokenRequestHandler(new XorServerCsrfTokenRequestAttributeHandler()));
http.csrf(ServerHttpSecurity.CsrfSpec::disable);
http.authorizeExchange(authorize -> authorize.anyExchange().authenticated());
http.oauth2Login(loginSpec -> loginSpec.authorizedClientRepository(authorizedClientRepository()))
.logout(logoutSpec -> logoutSpec.logoutHandler(logoutHandler())
.logoutSuccessHandler(logoutSuccessHandler(repository))
.requiresLogout(ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/sign-out")));
return http.build();
}
@Bean
public ServerOAuth2AuthorizedClientRepository authorizedClientRepository() {
return new WebSessionServerOAuth2AuthorizedClientRepository();
}
@Bean
public ServerLogoutSuccessHandler logoutSuccessHandler(ReactiveClientRegistrationRepository repository) {
OidcClientInitiatedServerLogoutSuccessHandler successHandler = new OidcClientInitiatedServerLogoutSuccessHandler(repository);
successHandler.setPostLogoutRedirectUri(postLogoutRedirectUri);
return successHandler;
}
private ServerLogoutHandler logoutHandler() {
return new DelegatingServerLogoutHandler(new SecurityContextServerLogoutHandler());
}
}
приложение реагирования, работающее по адресу 192.168.111.58:3000, шлюз, работающий по адресу 192.168.111.8060, сервер авторизации, работающий по адресу 192.168.111.58:8000
когда я вызываю http://192.168.111.58:8060/ui из браузера, я перенаправляюсь на 192.168.111.58:8000/login (страница входа в систему oauth2)
проблема в том, что после успешной аутентификации журнал шлюза:
Применяется обработчик: {uri=http://localhost:3000/ui, метод=GET} Подключение к [localhost/127.0.0.1:3000]. HTTP/1.1 404 Не найден
и не перенаправляет меня на http://localhost:3000/ui