2012-01-13 13 views
15

Un'applicazione javascript in esecuzione su 10.0.0.1 tenta di autenticare gli utenti con chiamate ajax tra domini.Conservazione del cookie dopo una richiesta ajax tra domini

La richiesta appare come:

function test(again){ 
    $.ajax({ 
    type: 'GET', 
    url: 'http://example.com/userinfo', 
    dataType: 'json', 
    success: function(userinfo){ 
     if(again) 
     test(false);}});} 
test(true); 

La prima risposta dal server tenta di impostare un cookie:

Access-control-allow-origin:http://10.0.0.1 
Set-Cookie:PHPSESSID=uuj599r4k1ohp48f1poobil665; expires=Sat, 28-Jan-2012 17:10:40 GMT; path=/ 

Ma la seconda richiesta non include questo cookie, nè fare qualsiasi altra ajax richieste a quel dominio.

Non sto cercando di leggere il cookie per un altro dominio, voglio solo che l'applicazione sull'altro dominio sia in grado di impostare e leggere il proprio cookie.

È possibile?

Ho testato in Chrome e Firefox 9.

risposta

1

No, i cookie non possono essere condivisi dominio croce. Il same origin policy potrebbe essere aggirato per le chiamate AJAX utilizzando le intestazioni Access-Control-* supponendo che il browser le supporti, ma per i cookie non c'è modo.

+1

Grazie per il vostro input. Tuttavia non sto tentando di condividere i cookie su più domini. Voglio solo condividere i cookie tra le richieste allo stesso dominio. Se questo è ciò che intendi, ti preghiamo di chiarire. – AtnNn

+0

@atnnn in quel caso dovrebbe funzionare, sei sicuro al 100% di no? Assicurati che la tua richiesta successiva corrisponda esattamente allo stesso dominio e non a un sottodominio o a un superdominio. – DaveRandom

+0

Se guardate il mio codice, vedrete che è esattamente la stessa richiesta e non ci sono condizioni di gara. – AtnNn

0

+ Darin Dimitrov sospetta che "il cookie non viene salvato dal browser perché proviene da un altro dominio rispetto a quello che ospita la pagina che è all'origine di questa chiamata".

Tuttavia, il cookie viene impostato come desiderato quando si utilizza JSONP, ma JSONP è solo per le richieste GET.

La mia soluzione è quella di recuperare il cookie (una sessione di PHP id), mediante pubblicazione sul file php in un <script>:

<? echo $_GET['callback'] . '("' . session_id() . '")'; ?> 

E per passare l'id di sessione come una variabile richiesta, in tutti POST cross-domain richieste.

10

Finché si utilizza un browser che supporta CORS, i cookie sulla richiesta AJAX dovrebbero funzionare. Ma è necessario impostare withCredentials su XMLHttpRequest su true.

See: The withCredentials attribute

Non faccio uso di JQuery ma ecco una domanda che si occupa specificamente con l'impostazione withCredentials tramite JQuery.

Sending credentials with cross-domain posts?

+1

Per chiarimenti, la documentazione su [developer.mozilla.org] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) lo afferma sull'utilizzo di richieste con credenziali: "quando si risponde a un richiesta credenziale, il server deve specificare un dominio e non può utilizzare la wild carding. " Quindi assicurati che l'intestazione 'Access-Control-Allow-Origin' contenga il dominio effettivo da cui proviene la richiesta, e non un' *. –

11

server deve impostare intestazione:

response.Headers.Add("Access-Control-Allow-Credentials", "true"); 

client da:

xhrFields: { 
    withCredentials: true 
} 
+0

Non dovrebbe impostare la risposta be 'response.Headers.Add (" Access-Control-Allow-Credentials "," true ");'? – bounav

+0

Sì, ho definito un campo const. – Teddy

+0

Questo mi ha salvato la giornata, grazie! –

Problemi correlati