Заголовок Cookie в PhoneGap: Отказался от установки небезопасного заголовка "Cookie"

Я разрабатываю приложение PhoneGap, которое взаимодействует с безопасным .net-сервером. Проблема в том, что я не могу передать какие-либо файлы cookie с любым запросом (W3C).

Это то, что я делаю (предположим, что работают "имя пользователя" и "пароль" ).

var token;    
$.ajax({
        url: "https://server.com/AuthService/api/account/login",
        crossDomain: true,
        type: 'post',
        async: false,
        data: {
            username: "username",
            password: "password"
        }
    }).done(function(response) {
        token = response.securityToken;
        success = true;
    });

В этот момент у меня есть токен аутентификации, который я могу использовать для проверки всех последующих запросов. Поэтому, используя этот токен, я делаю еще один запрос на сервер...

$.ajax({
    url: "https://server.com/Service/api/search?query=" + query,
    headers: { Cookie: 'auth=' + token },
    crossDomain: true,
    withCredentials: true,
    type: 'POST',
    async: false,
    data: ' ' //because we don't want our request to be 0 bytes (the server is picky)
}).done(function(data) {
    result = data;
});

Chrome просто говорит: Отказался от установки небезопасного заголовка "Cookie" (который придерживается спецификации W3C). Приложение не устанавливает заголовок и, как результат, запрос 401s, поскольку cookie авторизации не отправляется.

Мой вопрос таков: есть ли способ подорвать это и переопределить заголовок Cookie (или еще один способ сделать это полностью) на PhoneGap? Я знаю, что использование заголовка авторизации также является опцией, но у меня ограниченный доступ к серверу (который его не поддерживает) и надеялся на более немедленное решение.

Бонусный вопрос: вызов AuthService также должен установить cookie httpOnly на устройстве, но не (я предполагаю, что это потому, что это запрос перекрестного домена). Правильно ли я в этом предположении или могу быть чем-то неправильным на стороне сервера?

Спасибо!

Ответ 1

Короткий ответ - нет, вы не можете установить заголовок Cookie. Причина этого заключается в том, что Chrome является вашим User Agent, поэтому по спецификации HTTP требуется запретить модификации заголовков, которые имеют последствия для безопасности.

Одним из решений было бы выполнить действие, которое позволяет серверу установить cookie на объект XmlHttpRequest. Вы говорите, что уже пытаетесь это сделать, но он не работает. Я подозреваю, что вам нужно установить withCredentials в свой запрос ajax. Добавьте атрибут xhrFields следующим образом.

var token;    
$.ajax({
    url: "https://server.com/AuthService/api/account/login",
    crossDomain: true,
    xhrFields: {withCredentials: true},
    type: 'post',
    async: false,
    data: {
        username: "username",
        password: "password"
    }
}).done(function(response) {
    token = response.securityToken;
    success = true;
});

Теперь, пока отвечающий сервер не отправит подстановочный знак в качестве разрешенных доменов CORS (Access-Control-Allow-Origin), вы должны получить файл cookie.