Я прочитал предложения здесь. Я делаю запрос XHR к своей службе, чтобы получить файл cookie. Я попытался убедиться, что домен отсутствует в файле cookie (а не просто пустая строка) -
Set-Cookie: file-auth=MTU0ODIzODU1M3xEdi1CQkFFQ180SUFBUXdCREFBQUh2LUNBQUVGZG1Gc2RXVVRaRzkzYm14dllXUXRZWFYwYUc5eWFYcGxaQT09fPzBg_EP9S6wn_7gAz0iUtS1cOOaeo78VAMdD5xxhunF; Path=/; Expires=Thu, 24 Jan 2019 10:15:53 GMT
Я пробовал настроить свой хост-файл так, чтобы я делал запрос на app.localhost.com:12350
, а затем указывал домен в заголовке Set-Cookie
-
Set-Cookie: file-auth=MTU0ODIzODg4NnxEdi1CQkFFQ180SUFBUXdCREFBQUh2LUNBQUVGZG1Gc2RXVVRaRzkzYm14dllXUXRZWFYwYUc5eWFYcGxaQT09fCdT3LhVhHIA6mPq_65ndnP1XFD2IEzLpxCmiaosHZA5; Path=/; Domain=app.localhost.com; Expires=Thu, 24 Jan 2019 10:21:26 GMT
Мой первоначальный запрос XHR (GET) — на http://app.localhost.com:12350/test/file_service/setcookie
со следующими заголовками
GET /test/file_service/setcookie HTTP/1.1
Host: app.localhost.com:12350
Connection: keep-alive
Accept: application/json
Origin: http://app.localhost.com
Authorization: <MY-JWT>
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Referer: http://app.localhost.com/tutorials
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
И приходит ответ -
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://app.localhost.com
Access-Control-Expose-Headers: Content-Length
Content-Encoding: gzip
Set-Cookie: file-auth=MTU0ODIzODg4NnxEdi1CQkFFQ180SUFBUXdCREFBQUh2LUNBQUVGZG1Gc2RXVVRaRzkzYm14dllXUXRZWFYwYUc5eWFYcGxaQT09fCdT3LhVhHIA6mPq_65ndnP1XFD2IEzLpxCmiaosHZA5; Path=/; Domain=app.localhost.com; Expires=Thu, 24 Jan 2019 10:21:26 GMT
Vary: Accept-Encoding
Vary: Origin
Date: Wed, 23 Jan 2019 10:21:26 GMT
Content-Length: 23
Content-Type: application/x-gzip
Но тогда, когда я делаю новый GET-запрос на http://app.localhost.com:12350/test/file_service/file?
(не XHR - я просто кликаю по ссылке в браузере), cookie не отправляется. Глядя на вкладку cookie в отладчике Chrome, для домена ничего не установлено.
Как мне заставить это работать?
XMLHttpRequest имеет атрибут withCredentials
, который по умолчанию равен false
. Этот атрибут определяет, будет ли учитываться заголовок Set-Cookie
для запросов между источниками.
Если вы размещаете страницу на http://app.localhost.com
, но вызываете http://app.localhost.com:12350
для получения файла cookie, заголовок Set-Cookie
будет игнорироваться, если для атрибута withCredentials
не установлено значение true.
Настройка withCredentials
будет зависеть от того, как вы делаете запрос. В старых браузерах -
var client = new XMLHttpRequest()
client.open("GET", "./")
client.withCredentials = true
Но более современное решение -
fetch("./", { credentials:"include" }).then(/* … */)
См. здесь