Браузеры не отправляют файлы cookie при использовании CORS XHR
edit - глядя на файлы cookie с помощью веб-инспектора Chrome, кажется, что независимо от того, какое значение имеет срок действия cookie, браузер устанавливает его как файл cookie сеанса и удаляет его для каждого запроса.
Я создаю пример CORS для класса, который я преподаю, используя Node.js и Express.
Однако, хотя файлы cookie устанавливаются с сервера, они не отправляются обратно на сервер по следующим запросам. Это в значительной степени означает, что я не могу использовать какой-либо тривиальный менеджер сеансов.
Любая идея, что мне здесь не хватает? Почему браузер не отправляет файлы cookie, установленные доменом обратно в этот домен? Не должно ли это происходить автоматически?
edit - некоторые примеры кода:
настройка запроса XHR:
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.widthCredentials = true;
xhr.onreadystatechange = function(res){
if (xhr.readyState == 4){
cb(res,xhr);
}
};
xhr.setRequestHeader("Content-Type",'application/json');
xhr.setRequestHeader('Accept','application/json');
xhr.send(JSON.encode({param:some_param}));
Сервер:
function allowCrossDomain(req,res,next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type,Accept,X-Requested-With');
if (req.method!='OPTIONS') return next();
res.send(204);
}
//while configuring express
app.use(allowCrossDomain)
Также стоит упомянуть, что я пробовал различные npm
middlewares, которые делают то же самое без заметной разницы
Что касается сценария:
- Сделать запрос CORS с помощью XHR
- Сервер устанавливает cookie, который успешно отправляется клиенту (куки-курьерский сеанс)
- Следующий запрос XHR не отправит этот файл cookie на сервер, поэтому оператор не может идентифицировать пользователя и создает новый файл cookie для сеанса и т.д.
Ответы
Ответ 1
Я ничего не знаю об этом, кроме того, что я прочитал, но согласно в документах MDN есть "withCredentials" свойство объекта XHR, которое необходимо установить:
xhr.withCredentials = true;
По умолчанию он false
. Если этот флаг не установлен, файлы cookie не передаются, а заголовки файлов cookie в ответе игнорируются.
edit — Клянусь, я пару раз прочел ваш вопрос, но я полностью пропустил ваше упоминание о флаге. Сожалею. Однако, так как это не общий объем отходов, я также упомянул, что ваш сервер должен установить флаг "Access-Control-Allow-Credentials" в true
в заголовке ответа, а "Access-Control- Allow-Origin" установлен на ваш текущий протокол + хост + порт.
Ответ 2
Это случилось со мной раньше, и я могу сказать это довольно глупо.
Если вы используете виртуальную машину, вы обычно приостанавливаете ее/возобновляете ее, когда вам это нужно и т.д.
Это означает, что дата виртуальной машины обычно на несколько дней поздней (или более) по сравнению с хостом или любым клиентом, который вы используете.
Поэтому, когда сервер устанавливает дату истечения срока действия файла cookie (обычно через пару часов после текущей даты), он уже истек на клиенте. Таким образом, клиент не сохраняет его.
Чтобы обновить дату на вашей виртуальной машине, я предлагаю вам просто использовать ntpdate
, или вы можете вручную установить дату, чтобы узнать, есть ли эта проблема:
# what the date?
date
# You'll see if it the problem already
# If it is, here is how to manually set it
date -set 2012-07-22 # yyyy-mm-dd
date -set 17:00:42 # hh:mm:ss
Ответ 3
У меня была аналогичная проблема, и выяснилось, что в настройках браузера блокируются сторонние файлы cookie (Chrome > Настройки > Дополнительные настройки > Конфиденциальность > Настройки содержимого > Блокирование файлов cookie сторонних производителей и данных сайта). Разблокировка решила проблему!
Ответ 4
У меня просто была эта проблема, решение в моем случае добавило путь к файлу cookie, поэтому при добавлении файла cookie вы должны использовать:
document.cookie = 'cookieName=cookieValue;path=/';
таким образом браузер сможет отправить cookie в новый запрос.
PS: Вам также нужен xhr.withCredentials = true;
, если вы используете запрос кросс-домена.