Многие знакомы с таким флагом XmlHttpRequest как withCredentials, знают для чего он нужен, какие заголовки нужно использовать с ним в паре, чтобы браузер нормально обрабатывал ответы сервера. И я вроде тоже знал, а что не знал — нагугливал, и всё работало как надо. Но однажды столкнулся с неожиданным поведением, о чём и хочу поведать.
Как указано в спецификации www.w3.org/TR/cors/#omit-credentials-flag, withCredentials позволяет нам использовать в запросе к серверу user-credentials, т.е. куки, аутентификационные данные и клиентские SSL-сертификаты.
Я делаю запрос для получения куки:
$.ajax ({ type: 'POST', url: authUrl, dataType: 'json' });
Сервер возвращает корректный ответ с
Set-Cookie:MYCOOKIE=7B6E846F8972DF580001CDCBF49316E; Path=/; HttpOnly
Далее я обращаюсь по тому же адресу с полученной кукой:
$.ajax ({ type: 'GET', url: authUrl, dataType: 'json', cache: false, xhrFields: { withCredentials: true } });
Здесь и происходит неожиданное для меня: хоть я и указал «withCredentials: true», полученная из первого запроса кука не отправляется во втором запросе.
Выясняется, что кука из первого запроса не сохраняется браузером, и отправлять со вторым запросом нечего.
Предположил, что причина в HttpOnly, но проверить с кукой без этого флага не получилось, потому что перед этим попробовал добавить «withCredentials: true» в первый запрос, и происходит чудо — кука сохраняется браузером, и во втором запросе она успешно отправляется.
Таким образом, получается, что указание «withCredentials: true» необходимо не только для отправки «user-credentials» в запросе к серверу, но и для использования их из ответов от сервера. Вроде бы логично, но использование слова «request» во всех спецификациях и описаниях сбивает с толку, надеюсь не только меня)
PS. Как то я упустил эту спецификацию, где прямо написано, что при отсутствии этого атрибута «cookies are to be ignored in response», двойка мне за навыки поиска(
ссылка на оригинал статьи http://habrahabr.ru/post/263417/
Добавить комментарий