HTTP Cookies и запросы Ajax по HTTPS
Я знаю, что это было задано раньше в разных формах, но я не могу обойти эту проблему.
Я попытался использовать jQuery и собственный JS API для выполнения запросов Ajax.
Моя ситуация следующая (см. прилагаемую диаграмму):
- Браузер выполняет запрос HTTP
- Сервер отвечает и устанавливает постоянное Cookie
- Браузер делает HTTP-запрос Ajax, Cookie там в порядке
- Сервер отвечает как ожидалось, обновляет Cookie
- Браузер делает запрос HTTPS Ajax, Cookie больше не существует (?!)
- Сервер дает ответ "по умолчанию", так как нет Cookie (непреднамеренное поведение)
Прежде чем кто-нибудь начнет читать лекцию о междоменных запросах, позвольте мне сказать пару вещей:
- Я знаю, что это междоменный запрос (другой протокол), и поэтому сервер устанавливает заголовок
Access-Control-Allow-Origin
в ответе (и я использую Chrome и Firefox, оба из которых поддерживают CORS)
- Тем не менее, я знаю, что HTTP файл cookie должен управляться через HTTPS (см. здесь), так как хост является тем же
- (EDIT) Файл cookie правильно настроен для общего домена (например .domain.ext), и не установлены флаги HttpOnly и Secure.
Итак, почему, почему, почему браузер не передает cookie при выполнении вызова HTTPS Ajax? Есть идеи? Я собираюсь потерять сознание...
+-----------+ HTTP Request +-----------+
|Browser |+---------------->|Server |
+-----------+ +-----------+
HTTP Response
<----------------+
Set-cookie
Ajax HTTP Req.
+---------------->
Cookie (OK)
HTTP Response
<----------------+
Set-cookie (OK)
Ajax HTTPS Req.
+---------------->
No Cookie (!!!)
Ответы
Ответ 1
Хорошо, нашел решение проблемы с cookie.
См. Спецификации XHR, документы jQuery и fooobar.com/questions/26174/....
Решение для отправки куки при переключении протокола и/или субдомена состоит в том, чтобы установить для свойства withCredentials
значение true
.
Например, (используя jQuery)
$.ajax( {
/* Setup the call */
xhrFields: {
withCredentials: true
}
});
Ответ 2
Document.cookie и Ajax Request не передают cookie. В противном случае ajax не может получить доступ к файлам cookie из файла document.cookie или заголовков ответов. Они могут управляться только удаленным доменом.
Если вы сначала получите ответ, включая cookie с сервера с помощью ajax, с тех пор вы можете запросить связь ajax с файлом cookie на сервере.
В этом случае вы пишете, например, под кодом (jQuery)
$.jajx({
xhrFields : {
withCredentials : true
}
});
Смотрите эту статью и demo