2012-04-19 20 views
40

Sé que esto se ha preguntado anteriormente en varias formas, pero parece que no puedo evitar el problema. He intentado usar tanto jQuery como la API JS nativa para realizar las solicitudes de Ajax.HTTP Cookies y solicitudes de AJAX a través de HTTPS

Mi situación es la siguiente (ver el diagrama adjunto):

  1. navegador realiza una solicitud HTTP
  2. Server responde y fija cookie persistente
  3. navegador hace HTTP petición Ajax, Cookie está ahí bien
  4. El servidor responde como se esperaba, las actualizaciones Cookie
  5. El navegador hace una solicitud HTTPS Ajax, la cookie ya no existe (?!)
  6. servidor da respuesta "por defecto", ya que no hay Cookie (comportamiento no deseado)

Antes de que nadie se inicia una conferencia sobre las solicitudes entre dominios permítanme decir un par de cosas:

  • Sé que esta es una solicitud entre dominios (protocolo diferente), y es por eso que el Servidor establece el encabezado Access-Control-Allow-Origin en la respuesta (y estoy usando Chrome y Firefox, que admiten CORS)
  • Lo que también sé, sin embargo, es que la cookie HTTP debe ser manejable a través de HTTPS (ver here) s Dado que el host es el mismo
  • (EDITAR) La cookie está configurada correctamente para el dominio general (p. .domain.ext) y ni los indicadores HttpOnly ni Secure están configurados

Entonces, ¿por qué, por qué, por qué el navegador no pasa la cookie al hacer la llamada HTTPS Ajax? ¿Algunas ideas? Estoy a punto de perder la cabeza ...

 +-----------+ HTTP Request  +-----------+ 
    |Browser |+---------------->|Server  | 
    +-----------+     +-----------+ 

        HTTP Response 
        <----------------+ 
        Set-cookie 

        Ajax HTTP Req. 
        +----------------> 
        Cookie (OK) 

        HTTP Response 
        <----------------+ 
        Set-cookie (OK) 

        Ajax HTTPS Req. 
        +----------------> 
        No Cookie (!!!) 
+0

captura de la petición HTTP volcado y comprobar si alguno de los '' http secure' y sólo 'flags se establecen en la declaración' Set-Cookie'. Ese sería al menos un buen lugar para comenzar. – dpq

+0

Ninguno está configurado. – NeXuS

+0

http://stackoverflow.com/questions/5441836/jquery-cookie-values-not-maintained-while-moving-from-http-to-https parece que esta es una limitación deliberada. – dpq

Respuesta

66

Bien, encontré la solución al problema de las cookies.

Ver XHR specs, jQuery docs y StackOverflow.

La solución para enviar las cookies cuando se cambia el protocolo y/o el subdominio es establecer la propiedad withCredentials en true.

E.g. (usando jQuery)

$.ajax({ 
    /* Setup the call */ 
    xhrFields: { 
    withCredentials: true 
    } 
}); 
+2

Impresionante. Usted encontró la respuesta usted mismo. Gracias por compartir. Tantas publicaciones cuando las personas encuentran la respuesta y no la comparten. Kudos NeXuS. – FernandoZ

+0

Lamentablemente no pude hacer que funcione, no obstante ...: D – NeXuS

+0

gracias, esto funcionó para mí después de 2 días de tratar de descubrir por qué –

0

Document.cookie y Ajax Request no comparten la cookie. De lo contrario, ajax no puede acceder a las cookies de document.cookie o los encabezados de respuesta. Solo pueden ser controlados por el dominio remoto.

Si recibe respuesta por primera vez, incluyendo cookies del servidor por ajax, ya que puede solicitar la comunicación ajax con cookies al servidor.

Para este caso, se escribe como código de abajo (jQuery)

$.jajx({ 
     xhrFields : { 
      withCredentials : true 
     } 
    }); 

Ver this article y demo

Cuestiones relacionadas