Вопрос по html5 – CORS withCredentials Предварительная проверка XHR не публикует файлы cookie в Firefox

16

Я пытаюсь сделать сообщение CORS XHR с учетными данными. Он прекрасно работает в Chrome, но не в Firefox. Файлы cookie отсутствуют в заголовках запросов перед полетом, и поэтому я вижу 302. Это прекрасно работает в Chrome, поскольку файлы cookie находятся в заголовках запросов перед полетом, и последующий POST проходит.

Почему бы это не работать в FF? Что мне не хватает?

<code>// assume url, boundEventHandler and uploadData are defined, as this definitely works in Chrome
var xhr = new XMLHttpRequest(); 
xhr.open("POST", url, true); 
xhr.addEventListener ("readystatechange", boundEventHandler, false); 
xhr.withCredentials = true;  // FWIW, I've also tried the string 'true'
xhr.send(uploadData);
</code>

Есть идеи? Я вижу некоторые сообщения, в которых говорится, что я могу прокси-запрос на стороне сервера, но я бы предпочел, чтобы это работало в соответствии со спецификацией CORS.

Спасибо!

На какой версии FF вы работаете, последняя? Francisc

Ваш Ответ

2   ответа
18

https://www.w3.org/TR/cors/#resource-preflight-requests предварительный запрос никогда не включает куки. В частности, в спецификации говорится:

Exclude user credentials.

и что ссылки наhttps://www.w3.org/TR/cors/#user-credentials который говорит:

The term user credentials for the purposes of this specification means cookies, HTTP authentication, and client-side SSL (...).

Тем не менее, фрагмент кода, который вы цитируете выше, вообще не должен включать предварительную проверку: нет прослушивателей события загрузки, метод такой же простой, и заголовки автора не установлены. Поэтому, если вы действительно видите предполётный запрос, первый вопрос - почему это происходит. Есть ли у вас какие-либо расширения в Firefox, которые могут манипулировать вашим объектом XMLHttpRequest?

Интересно. Я только что проверил, и Chrome вообще не выполняет предварительную проверку слушателей события загрузки. Это кажется ... сломанным
Хороший вопрос ... Я пропустил прослушиватели события загрузки в фрагменте кода. К сожалению, спецификация не допускает этого. Казалось бы, если кто-то хочет включить куки, они должны быть разрешены. Jeff Ludden
И похоже, что поведение Chrome действительно является ошибкой безопасности в WebKit, исправленной несколько дней назад. Увидетьtrac.webkit.org/changeset/113589
Весь смысл предварительного запроса состоит в том, чтобы защитить сервер от веб-страницы, сообщив ему о том, что кто-то хочет выполнить какой-то странный запрос, и разрешив серверу явно занести в белый список такие вещи, если он знает, как правильно их обрабатывать. .. потому что многие серверы по умолчанию не знают, как правильно их обрабатывать. Это означает, что куки не нужны, потому что это открыло бы вектор атаки против ничего не подозревающих серверов. Единственный способ разрешить использование файлов cookie - этоserver указанные куки разрешены. Но как бы это сделать? Ответ на предпечатную проверку - как он это делает.
Это было действительно полезно! Я выполнял проверку подлинности для своего метода параметров в обработчике приложений, который вызвал ту же ошибку 302, возвращенную сервером. Удаление аутентификации в методе параметров позволило моим XHR теперь правильно реагировать.
3

Похожие вопросы