2012-01-13 19 views
15

Una aplicación de JavaScript que se ejecuta en 10.0.0.1 intenta autenticar a los usuarios con llamadas ajax de dominios cruzados.Conservación de la cookie después de una solicitud de ajax entre dominios

La solicitud se parece a:

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

La primera respuesta del servidor intenta enviar una cookie:

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

Pero la segunda solicitud no incluye esta cookie, ni tampoco cualquier otra ajax solicitudes a ese dominio.

No estoy tratando de leer la cookie de otro dominio, solo quiero que la aplicación en el otro dominio pueda establecer y leer su propia cookie.

¿Esto es posible?

he probado en Chrome y Firefox 9.

Respuesta

1

No, las cookies no se pueden compartir entre dominios. El same origin policy podría eludirse para las llamadas AJAX usando los encabezados Access-Control-* suponiendo que el navegador los admite, pero para las cookies no hay forma.

+1

Gracias por su entrada. Sin embargo, no estoy tratando de compartir cookies entre dominios. Solo quiero compartir cookies entre solicitudes al mismo dominio. Si eso es lo que quieres decir, aclara. – AtnNn

+0

@atnnn en ese caso debería funcionar, ¿estás 100% seguro de que no? Asegúrese de que su solicitud posterior sea exactamente el mismo dominio, y no un subdominio o superdominio. – DaveRandom

+0

Si miras mi código, verás que es la misma solicitud y no hay ninguna condición de carrera. – AtnNn

0

+ Darin Dimitrov sospecha que "la cookie no es guardada por el navegador porque proviene de otro dominio que el que aloja la página que está en el origen de esta llamada".

Sin embargo, la cookie se establece como se desea al usar JSONP, pero JSONP es solo para solicitudes GET.

Mi solución es recuperar la cookie (un identificador de sesión de PHP) cargando el siguiente archivo php en un <script>:

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

Y para pasar el identificador de sesión como una variable de petición en todos los Post-dominios peticiones.

10

Siempre que utilice un navegador que admita CORS, las cookies en la solicitud AJAX deberían funcionar. Pero debe establecer withCredentials en el XMLHttpRequest en verdadero.

Ver: The withCredentials attribute

No consumo jQuery pero aquí es una pregunta que se ocupa específicamente de la configuración withCredentials a través de jQuery.

servidor

Sending credentials with cross-domain posts?

+1

Para una aclaración, la documentación en [developer.mozilla.org] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) establece esto sobre el uso de solicitudes con credenciales: "al responder a un solicitud con credencial, el servidor debe especificar un dominio y no puede usar el comodín. " Por lo tanto, asegúrese de que su encabezado 'Access-Control-Allow-Origin' contiene el dominio real de donde viene la solicitud, y no un' * '. –

11

debe establecer la cabecera:

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

cliente configurado a:

xhrFields: { 
    withCredentials: true 
} 
+0

No debería establecer la respuesta sea 'response.Headers.Add (" Access-Control-Allow-Credentials "," true ");'? – bounav

+0

Sí, he definido un campo const. – Teddy

+0

¡Esto me salvó el día, gracias! –

Cuestiones relacionadas