Почему Access-Control-Allow-Credentials не работает в Crome? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь реализовать междоменный SSO-Auth-сервер.Цель состоит в том, чтобы прочитать информацию о проверенных пользователях, предоставленную https://auth.my -domain.com / profile из https://app.other -domain.com через XmlHttpRequest.(не jsonp!) Следовательно, файл cookie необходимо передавать с app.other-domain.com на auth.my-domain.com.

В Firefox он работает нормально.Но не в Google-Chrome.Точнее: в FF файл cookie отправляется с каждым XHR через любые границы домена, но chrome отправляет файл cookie только в тот же домен 2-го уровня.

Firefox: auth.my-domain.com <> app.my-domain.com  OK
Firefox: auth.my-domain.com <> app.other-domain.com  OK
Chrome:  auth.my-domain.com <> app.my-domain.com  OK
Chrome:  auth.my-domain.com <> app.other-domain.com  FAIL :(

Chrome 73.0.3683.86 Firefox 66.0.1 (64-разрядная версия) ОС: Ubuntu 18.10

В соответствии с этим (и многими другими документами, которые я прочитал), оно должно работать: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

Это точный пример, который не работает в Chrome: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

Я не могу найти информацию, почему он не работает в Chrome.Поиск в Интернете обеспечивает только некоторые ошибки реализации, такие как забытые или недействительные заголовки контроля доступа, отсутствие флага .withCredentials в клиенте, блокирование параметра cookie SameSite ... Я не знаю, что здесь происходит.

Тест/ Воспроизвести:

Сервер аутентификации:

https://auth.my -domain.com / profile

После аутентификации при аутентификации.my-domain.com следующий куки установлен (и обновляется с каждым запросом):

set-cookie: test=1; expires=Wed, 27-Mar-2019 08:32:42 GMT; Max-Age=60; path=/; domain=auth.my-domain.com; secure; HttpOnly

Клиентский скрипт

https://app.other -domain.com/

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://auth.my-domain.com/profile');
xhr.withCredentials = true;
xhr.onload = function () {
  console.log(xhr.responseText);
}
xhr.send();

Заголовки запросов клиентов (Chrome DevTools)

Origin: https://app.other-domain.com
Referer: https://app.other-domain.com/
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

Есть предупреждение «Отображаются временные заголовки»,Я не мог найти никакого объяснения этому.: /

Заголовки запросов клиентов (FF DevTools)

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: de,en-US;q=0.7,en;q=0.3
Connection: keep-alive
Cookie: test=1
Host: auth.zandura.loc
Origin: https://app.other-domain.com
Referer: https://app.other-domain.com/
TE: Trailers
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/66.0

Заголовки ответов конечных точек API:

access-control-allow-credentials: true
access-control-allow-origin: https://app.other-domain.com
access-control-allow-methods: GET
content-type: application/json; charset=utf-8
date: Wed, 27 Mar 2019 09:12:37 GMT
server: nginx/1.15.9
status: 200
x-powered-by: PHP/7.3.3
...