Как исправить 'Перенаправление с' XXX 'на' YYY 'было заблокировано политикой Cors - PullRequest
0 голосов
/ 27 июня 2019

У меня есть следующая архитектура.

У меня есть сервер 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.

1 Ответ

0 голосов
/ 27 июня 2019

Политика CORS не допускает использование нескольких значений в заголовке «Access-Control-Allow-Origin». Попробуйте удалить «*» и убедитесь, что в «Access-Control-Allow-Origin» установлен только один адрес

...