Назад | Перейти на главную страницу

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

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

У меня получилась следующая настройка:

В моей ответственности: domain-a.com: NGINX ------ УГЛОВОЙ интерфейс ------ Бэкэнд SpringBoot

В ответственности клиентов: 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 в заголовке моего запроса ... Заранее спасибо.

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

Вот мой блок местоположения 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;
  }

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

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

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

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