Многие знакомы с таким флагом 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», двойка мне за навыки поиска. Но надеюсь, теперь многие смогут избежать возможного недопонимания.

Комментарии (2)


  1. evnuh
    23.07.2015 19:28
    +7

    доки не читай
    @
    сразу пиши код
    @
    потом дочитывай доки
    @
    пиши статью на хабр


    1. habus Автор
      23.07.2015 20:09

      Доки я читал, но видимо не те, так уж получилось, что до www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute добрался поздно, а до этого нигде этот нюанс не встречался. Думаю будет полезно таким же нерадивым, как я, иметь еще одно упоминание этой особенности, заодно и доку нужную почитают.