Я внедрил CORS не в том месте?

У меня проблема с CORS. Я всегда получаю отказ от клиентского api (ошибка консоли в конце статьи). Теперь мне интересно, не моя ли это вообще вина. Я надеюсь найти брешь с вашей помощью.

Я получил следующую схему:

Под моей ответственностью: domain-a.com: NGINX ------ УГЛОВОЙ интерфейс ------ SpringBoot backend

В ответственности клиентов: domain-b.com: /adrstep.json

domain-b.com обслуживает JSON при вызове GET на /adrstep.json. Это прекрасно работает, когда вызывается прямо из браузера.

В угловой части я вызываю domain-a.com/adrstep/adrstep.json, это переписывается в NGINX на domain-b.com/adrstep.json. Вот что я получаю в Chrome:

На вкладке CHROME NETWORK:

Запрос от браузера к NGINX:

GENERAL:
Request URL: https://domain-a.com/adrsteps/adrstep.json
Request Method: GET
Status Code: 302 Moved Temporarily
Remote Address: 212.25.3.166:443
Referrer Policy: no-referrer-when-downgrade

RESPONSE HEADER:
HTTP/1.1 302 Moved Temporarily
Server: nginx
Content-Type: text/html
Connection: keep-alive
Location: https://domain-b.com
Access-Control-Allow-Origin: https://domain-b.com
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Headers: Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With

REQUEST HEADER:
GET /adrsteps/adrstep.json HTTP/1.1
Host: domain-a.com
Connection: keep-alive
Accept: application/json, text/plain, */*
Content-Type: application/json
Referer: https://domain-a.com
Accept-Encoding: gzip, deflate, br

Перенаправленный запрос от NGINX к api на domain-b.com:

GENERAL
Request URL: https://domain-b.com/adrstep.json
Request Method: OPTIONS
Status Code: 200 OK
Remote Address: 193.246.69.8:443
Referrer Policy: no-referrer-when-downgrade

RESPONSE HEADER
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 0
Connection: keep-alive
Status: 200 OK
Age: 0
Strict-Transport-Security: max-age=86400; includeSubdomains
X-Frame-Options: SAMEORIGIN
Frame-Options: SAMEORIGIN

REQUEST HEADER
OPTIONS /adrstep.json HTTP/1.1
Host: domain-b.com
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: https://domain-a.com
Access-Control-Request-Headers: authorization,content-type,x-requested-with
Accept: */*
Accept-Encoding: gzip, deflate, br

Конфигурация NGINX:

location /adrsteps/ {
    add_header 'Access-Control-Allow-Origin' 'https://domain-b.com' always;
    add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,...
    rewrite ^(\/adrsteps\/) https://domain-b.com/adrsteps.json$2 break;
    proxy_redirect     off;
}

Ошибка консоли браузера:

Failed to load https://domain-b.com/adrsteps.json?: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://domain-a.com' is therefore not allowed access.

Кто-нибудь знает, где может быть проблема? Я ясно вижу Access-Control-Allow-Origin в заголовке моего запроса ... Заранее спасибо.

0
задан 28 May 2018 в 13:51
2 ответа

Благодаря графику, размещенному @Craft, я пошел в правильном направлении. Но решение было не на стороне клиента - это была ошибка конфигурации nginx. В итоге пришлось переписать и прокси обойти запрос. Позже я пропустил.

Здесь мой блок расположения nginx:

location /adrsteps/ {
    rewrite ^(\/adrsteps\/) /adrsteps.json$2 break;
    proxy_pass https://domain-b.com;
    proxy_redirect off;

    add_header 'Access-Control-Allow-Origin' 'https://domain-b.com' always;
    add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
  }

Btw: Как отличить, правильно ли реализован CORS на вашей или на клиентской стороне, просто используйте CORS-Toggle. Если он работает с переключателем (он добавляет Access-Control-Allowed-Origin = ''), то ошибка будет на вашей стороне.*

.
1
ответ дан 4 December 2019 в 13:26

Вы должны разрешить Origin https://domain-a.com в конфигурации виртуального хоста domain-b.com , потому что браузер проверяет если https://domain-a.com разрешено совместно использовать ресурсы, размещенные на сайте https://domain-b.com .

Эта ссылка может помочь вам в litle: https://upload.wikimedia.org/wikipedia/commons/c/ca/Flowchart_showing_Simple_and_Preflight_XHR.svg

Надеюсь, это поможет!

1
ответ дан 4 December 2019 в 13:26

Теги

Похожие вопросы