Pull to refresh

Особенности withCredentials

Reading time 2 min
Views 31K
Многие знакомы с таким флагом 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», двойка мне за навыки поиска. Но надеюсь, теперь многие смогут избежать возможного недопонимания.
Tags:
Hubs:
-3
Comments 2
Comments Comments 2

Articles