Подтвердить что ты не робот

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 (!!!)
4b9b3361

Ответ 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