У меня есть следующая архитектура.
У меня есть сервер Spring Cloud Gateway, который обрабатывает аутентификацию, авторизацию и маршрутизацию.
Мы можем накрыть его сервером A
.
Другой сервер - это сервер аутентификации B
, который использует Kerberos для аутентификации пользователей. Чтобы использовать его, A
перенаправьте запрос формы A/a/route
на запрос формы B/a/route
со статусом 307
.
Затем сервер B
аутентифицирует пользователя и добавляет файл cookie с JWT и отвечает перенаправлением A/a/route
со статусом 307
.
Когда сервер A
получает перенаправленные запросы с файлом cookie JWT, он передает его на сервер API.
Во время всего этого процесса мы получаем следующую ошибку
Не удалось загрузить A/a/route
: перенаправление с A/a/route
на B/a/route
было заблокировано политикой CORS: заголовок 'Access-Control-Allow-Origin' содержит несколько значений '*, http://localhost:4200',, но разрешено только одно Origin 'http://localhost:4200' поэтому не допускается.
Мы установили все Access-Control-Allow-*
заголовки, чтобы разрешить все запросы на обоих серверах A
и B
следующим образом
В весеннем шлюзе сервер
@Bean
public WebFilter corsFilter() {
return (ServerWebExchange exchange, WebFilterChain chain) -> {
ServerHttpRequest request = exchange.getRequest();
if (CorsUtils.isCorsRequest(request)) {
ServerHttpResponse response = exchange.getResponse();
HttpHeaders headers = response.getHeaders();
headers.add("Access-Control-Allow-Method", "POST, GET, OPTIONS, PUT");
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Headers", /* HEADRS */);
headers.add("Access-Control-Allow-Credentials", "true");
if (HttpMethod.OPTIONS.equals(request.getMethod())) {
response.setStatusCode(HttpStatus.OK);
return Mono.empty();
}
}
return chain.filter(exchange);
}
}
На сервере Apache-httpd Kerberos
<VirtualHost *>
LuaRoot /etc/httpd/lua
LuaHookFixups authz.lua check_authz_cookie
ProxyPreserveHost On
SetEnvIf Origin "(.*)" origin=$0
Header always set Access-Control-Allow-Origin "%{origin}e"
Header always set Access-Control-Allow-Method "POST, GET, OPTIONS, PUT"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Allow-Headers # HEADERS...
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
ProxyPass /whoami !
ProxyPass / A
ProxyPassReverse / A
</VirtualHost>
Мы ожидаем, что перенаправления будут работать, но возникают проблемы с CORS.