Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.07.2018, 17:19
Кандидат Javascript-наук
Отправить личное сообщение для zlodiak Посмотреть профиль Найти все сообщения от zlodiak
 
Регистрация: 24.02.2012
Сообщений: 104

Как правильно установить кроссдоменные куки?
Помогите пожалуйста понять почему несмотря на нарушение CORS кука всё же устанавливается.

Бекенд и фронтенд находятся на разных доменах. Из фронтенда я отправляю запрос на бекенд, а точнее на адрес, который отдаёт куку в виде заголовка Set-Cookie:
const xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open('GET', Config.host + 'csrf/display_form', true);
xhr.onload = function() {
  console.log( 'xhr response code:' + xhr.status + xhr.statusText);
}
xhr.onerror = function() {
  console.log( 'ERROR ' + this + xhr.status + xhr.statusText + xhr.responseText);
}
xhr.send();



Как видите, здесь кроме стандартного ajax-запроса есть команда
Код:
xhr.withCredentials = true;
Этого требует CORS.

Вот код бекенда(написан на python, но принципиального значения это не имеет):
Код:
def display_form(request):
  response = HttpResponse('set csrf cookie for form')
  response.set_cookie('csrftoken', random.getrandbits(256))  # генерируем куку
  response['Access-Control-Allow-Origin'] = 'http://localhost:4200'
  response['Access-Control-Allow-Credentials'] = 'true'
  return response
Как видите, здесь тоже в соответствии с CORS я устанавливаю необходимые два заголовка.

В результате кука в браузере устанавливается и кроме того отрабатывает коллбек xhr.onload. То есть в консоль браузера выводится статус ОК.

Проблема в том, что эта кука устанавливается даже в том случае когда я со стороны сервера нарушаю CORS, а точнее убираю объявление следующих заголовков(оба сразу или по одному):
Код:
response['Access-Control-Allow-Origin'] = 'http://localhost:4200'
response['Access-Control-Allow-Credentials'] = 'true'
В этом случае кука устанавливается, но со стороны фронтенда отрабатывает коллбек xhr.onerror

Я ожидал, что после нарушения CORS со стороны бекенда кука не установится. Помогите пожалуйста разобраться.

На гите: фронт, бек
Ответить с цитированием
  #2 (permalink)  
Старый 14.07.2018, 18:01
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Заголовки ответа нужны только для того, чтобы в js получить содержимое ответа.

Сам по себе кроссдоменный запрос ведь не только через xhr можно сделать, а ещё массой способов. И куки всегда будут выставляться, потому что сервер ставит их для своих надобностей. А вот прежде чем отдать в скрипт содержимое ответа, браузер глянет наличие заголовков.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно настроить очерёдность выполнения функций? Altai Общие вопросы Javascript 8 01.02.2017 19:32
как правильно отслеживать вставку html() bombascter jQuery 15 20.11.2012 09:47
Как правильно установить куки? nip Общие вопросы Javascript 0 30.10.2012 19:55
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14
как правильно установить обработчик onclick? Yurik AJAX и COMET 6 14.04.2009 21:04