2013-07-25 10 views
10

Zajmuję się tworzeniem aplikacji PhoneGap, która komunikuje się z bezpiecznym serwerem .net. Problem polega na tym, że nie mogę przekazywać żadnych plików cookie z jakimkolwiek wnioskiem (W3C).Nagłówek ciasteczka w PhoneGap: Odmówiono ustawiania niebezpiecznego nagłówka "Cookie"

To właśnie robię (zakładam, że działają "nazwa użytkownika" i "hasło").

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; 
    }); 

W tym momencie mam token uwierzytelniania, którego mogę używać do sprawdzania wszystkich kolejnych żądań. Więc za pomocą tokenu robię kolejne żądania do serwera ...

$.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 po prostu mówi: Odmowa ustawić niebezpieczny nagłówka „Cookie” (która przylega do specyfikacji W3C). Aplikacja nie ustawia nagłówka iw rezultacie żądanie 401, ponieważ plik cookie autoryzacji nie jest wysyłany.

Moje pytanie brzmi: czy istnieje sposób na obalenie tego i zastąpienie nagłówka pliku Cookie (lub w inny sposób obejścia go w całości) w PhoneGap? Wiem, że używanie nagłówka Authorization jest także opcją, ale mam ograniczony dostęp do serwera (który go nie obsługuje) i liczyłem na bardziej natychmiastowe rozwiązanie.

Pytanie dodatkowe: Wywołanie usługi AuthService powinno również ustawić plik cookie httpOnly na urządzeniu, ale nie działa (przypuszczam, że jest to spowodowane tym, że jest to żądanie międzydomenowe) ... Czy mam rację w tym założeniu lub coś jest nie tak po stronie serwera?

Dzięki!

Odpowiedz

5

Krótka odpowiedź brzmi: nie, nie można ustawić nagłówka pliku cookie. Powodem tego jest to, że Chrome jest Twoim agentem użytkownika, więc jest to wymagane przez specyfikację HTTP, aby zabronić modyfikacji nagłówków, które mają wpływ na bezpieczeństwo.

Jednym z rozwiązań może być wykonanie akcji, która pozwoli serwerowi ustawić plik cookie na obiekcie XmlHttpRequest. Mówisz, że już próbujesz to zrobić, ale to nie działa. Podejrzewam, że to dlatego, że musisz ustawić withCredentials na żądanie ajax. Dodaj atrybut xhrFields w następujący sposób.

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; 
}); 

Teraz tak długo jak serwer odpowiada nie wysyła wieloznaczny jak jego CORS dozwolone domen (Access-Control-Allow-Origin), powinieneś otrzymać plik cookie.

+0

Dzięki za odpowiedź. W końcu zdecydowałem się na nagłówek Authorization, który działa dobrze na moje potrzeby! – evancohen

+0

Dziękuję, zmagałem się z nagłówkiem odpowiedzi 'Set-Cookie' z atrybutami' Secure' i 'httponly', a następnie wysłałem odpowiedni plik' Cookie' z prośbą o kontynuację. Używam pośrednika 'nginx' pośredniego i pozwoliło mi ustawić odpowiednie nagłówki' Access-Control', których wymagany jest Angular '$ http'. – sampoh

Powiązane problemy