Заголовок 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). Приложение не устанавливает заголовок, и в результате запрос 401, потому что файл cookie авторизации не отправлен.

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

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

Спасибо!


person evancohen    schedule 25.07.2013    source источник


Ответы (1)


Короткий ответ: нет, вы не можете установить заголовок Cookie. Причина этого в том, что Chrome является вашим агентом пользователя, поэтому спецификация 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.

person Erin Ishimoticha    schedule 03.02.2014
comment
Спасибо за ответ. В итоге я выбрал заголовок авторизации, который отлично подходит для моих нужд! - person evancohen; 25.02.2014
comment
Спасибо, я боролся с заголовком ответа Set-Cookie с атрибутами Secure и httponly, а затем отправлял правильный Cookie обратно в последующие запросы. Я использую прокси-сервер nginx между ними, и это позволило мне установить соответствующие заголовки Access-Control, которые требуются Angular $http. - person sampoh; 29.09.2016