2013-07-25 14 views
10

Sto sviluppando un'applicazione PhoneGap che comunica con un server .net sicuro. Il problema è che non riesco a passare nessun cookie con nessuna richiesta (W3C).Intestazione cookie in PhoneGap: rifiutato di impostare l'intestazione non sicura "Cookie"

Questo è quello che sto facendo (supponiamo che "username" e "password" funzionino).

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

A questo punto ho un token di autenticazione che posso utilizzare per convalidare tutte le richieste successive. Quindi, utilizzando quella pedina faccio un'altra richiesta al server ...

$.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 dice solo: rifiutato di fissare pericoloso intestazione "Cookie" (che aderisce alla specifica W3C). L'app non imposta l'intestazione e di conseguenza la richiesta 401 perché il cookie di autorizzazione non viene inviato.

La mia domanda è questa: Esiste un modo per sovvertire questo e sovrascrivere l'intestazione del cookie (o un altro modo di procedere interamente) su PhoneGap? So che usare un'intestazione di autorizzazione è anche un'opzione, ma ho un accesso limitato al server (che non lo supporta) e speravo in una soluzione più immediata.

Domanda bonus: la chiamata a AuthService deve anche impostare un cookie httpOnly sul dispositivo, ma non lo fa (suppongo che si tratti di una richiesta interdominio) ... Sono corretto in questa ipotesi, o potrei c'è qualcosa di sbagliato sul lato server?

Grazie!

risposta

5

La risposta breve è no, non è possibile impostare l'intestazione del cookie. Il motivo è che Chrome è il tuo User Agent, quindi è richiesto dalle specifiche HTTP per disabilitare le modifiche alle intestazioni che hanno implicazioni sulla sicurezza.

Una soluzione sarebbe eseguire un'azione che consente al server di impostare il cookie sull'oggetto XmlHttpRequest. Dici che stai già provando a farlo ma non funziona. Ho il sospetto che sia perché è necessario impostare con Criteri sulla richiesta Ajax. Aggiungi l'attributo xhrFields, come segue.

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

Ora fino a quando il server di rispondere non invia un jolly come i suoi CORS ammessi domini (Access-Control-Allow-Origin), si dovrebbe ricevere il cookie.

+0

Grazie per la risposta. Ho finito per optare per un'intestazione di autorizzazione, che funziona bene per le mie esigenze! – evancohen

+0

Grazie, stavo lottando con l'intestazione di risposta 'Set-Cookie' con gli attributi' Secure' e 'httponly', quindi inviando il' Cookie' giusto alle richieste di follow-up. Sto usando un proxy 'nginx' in mezzo e mi ha permesso di impostare le intestazioni' Access-Control' appropriate che Angular '$ http' richiedeva. – sampoh

Problemi correlati