Cookies HTTP y solicitudes Ajax sobre HTTPS
jquery ajax (2)
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 primero obtienes una respuesta que incluye una cookie del servidor por parte de ajax, ya que puedes solicitar una comunicación jajax con la cookie al servidor.
Para este caso, escriba tal como el código siguiente (jQuery)
$.jajx({
xhrFields : {
withCredentials : true
}
});
Ver este artículo y demo
Sé que esto se ha preguntado antes en varias formas, pero parece que no puedo solucionar el problema. Intenté usar tanto jQuery como la API JS nativa para hacer las solicitudes de Ajax.
Mi situación es la siguiente (ver diagrama adjunto):
- El navegador realiza una solicitud HTTP
- El servidor responde y establece cookies persistentes
- El navegador hace la solicitud HTTP Ajax, Cookie está bien
- El servidor responde como se esperaba, actualiza las cookies
- El navegador hace la solicitud HTTPS Ajax, la cookie ya no está allí (?!)
- El servidor da la respuesta "predeterminada", ya que no hay Cookie (comportamiento involuntario)
Antes de que alguien comience una conferencia sobre solicitudes entre dominios, permítanme decir algunas 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, los cuales soportan CORS ) - Lo que también sé, sin embargo, es que la cookie HTTP debe ser manejable a través de HTTPS (ver here ) ya que el host es el mismo
- (EDITAR) La cookie está configurada correctamente para el dominio general (por ejemplo, .domain.ext) y no se configuran las banderas HttpOnly ni Secure.
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 (!!!)
Ok, encontré la solución al problema de las cookies.
Consulte las especificaciones XHR , jQuery docs y .
La solución para enviar las cookies cuando se cambia el protocolo y / o el subdominio es establecer la propiedad withCredentials
en true
.
Ej. (Usando jQuery)
$.ajax( {
/* Setup the call */
xhrFields: {
withCredentials: true
}
});