Управление файлами cookie после перенаправления 302 с помощью XMLHttpRequest

Я разрабатываю клиент Firefox OS для ownCloud. Когда я пытаюсь войти и отправить учетные данные пользователя на сервер, мне нужно получить в ответ файл cookie, который я буду использовать для аутентификации в ownCloud в каждом запросе.

Моя проблема в том, что, как я видел в Wireshark, файл cookie отправляется в сообщении HTTP 302, но я не могу прочитать это сообщение в своем коде, потому что Firefox обрабатывает его автоматически, и я читаю окончательное сообщение HTTP 200 без информации о файлах cookie в

request.reponseText; 
request.getAllResponseHeaders();

Итак, мой вопрос заключается в том, есть ли способ прочитать эти заголовки сообщений HTTP 302, или могу ли я получить файл cookie из ОС Firefox перед отправкой следующего запроса, или даже заставить ОС Firefox автоматически добавлять файл cookie. Я использую следующий код для создания POST:

request = new XMLHttpRequest({mozSystem: true});
request.open('post', serverInput, true);
request.withCredentials=true;
request.addEventListener('error', onRequestError);
request.setRequestHeader("Cookie",cookie_value);
request.setRequestHeader("Connection","keep-alive");  
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");

request.send(send_string);
if(request.status == 200 || request.status==302){
  response = request.responseText;
  var headers = request.getAllResponseHeaders();
  document.getElementById('results').innerHTML="Server found";
  loginSuccessfull();
}else{
  alert("Response not found");
  document.getElementById('results').innerHTML="Server NOT found";
}

person jorge baranguan castro    schedule 08.01.2015    source источник


Ответы (1)


"мозАнон"

Логическое значение: установка этого флага в значение true приведет к тому, что браузер не будет раскрывать источник и учетные данные пользователя при извлечении ресурсов. Самое главное, это означает, что файлы cookie не будут отправлены, если они не будут явно добавлены с помощью setRequestHeader.

mozSystem

Логическое значение: установка для этого флага значения true позволяет устанавливать соединения между сайтами, не требуя согласия сервера с помощью CORS. Требуется установка mozAnon: true, т. е. это нельзя совмещать с отправкой файлов cookie или других учетных данных пользователя." [0]

Я не уверен, являетесь ли вы разработчиком owncloud, но если вы являетесь разработчиком и имеете доступ к серверу, вам следует попробовать настроить заголовки CORS. [1] Может быть, если вы сможете установить прокси-сервер и подключить свое приложение к прокси-серверу, на котором включен CORS?

Существует также свойство withCredentials [2], которое вы можете установить для экземпляров объектов xhr. Похоже, он добавит заголовок Access-Control-Request-Headers: "cookies" и отправит HTTP-запрос OPTIONS, который является предварительной проверкой [3]. Таким образом, для этого все равно потребуется поддержка на стороне сервера для CORS. [4]

Хотя судя по внутренним комментариям [5], кажется, что это не должно работать, мне удалось запустить это из симулятора и увидеть заголовки запроса и ответа:

var x = new XMLHttpRequest({ mozSystem: true });
x.open('get', 'http://stackoverflow.com');
x.onload = function () { console.log(x.getResponseHeader('Set-Cookie')); };
x.setRequestHeader('Cookie', 'hello=world;');
x.send();

Вы, вероятно, захотите переназначить document.cookie в событии onload, а не регистрировать его, если заголовок ответа существует (не каждый сайт устанавливает файлы cookie при каждом запросе). Вы также хотели бы установить в заголовке запроса значение document.cookie.

[0] https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#XMLHttpRequest%28%29

[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

[2] https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties

[3] https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

[4] http://www.html5rocks.com/en/tutorials/cors/#toc-making-a-cors-request

[5] https://bugzilla.mozilla.org/show_bug.cgi?id=966216#c2

person Nick Desaulniers    schedule 08.01.2015