the resource requested present origin headers has habilitar from control been allow javascript node.js express cors

javascript - resource - Los navegadores no envían cookies cuando usan CORS XHR



habilitar cors javascript (4)

Editar: al examinar las cookies utilizando el inspector web de Chrome, parece que, independientemente del valor de caducidad de la cookie, el navegador la configura como una cookie de sesión y la elimina por solicitud.

Estoy construyendo un ejemplo de CORS para una clase que estoy enseñando, usando Node.js y Express.

Sin embargo, aunque las cookies se configuran desde el servidor, no se envían de nuevo al servidor en las siguientes solicitudes. Esto significa que no puedo usar ningún administrador de sesión trivial.

¿Alguna idea de lo que me estoy perdiendo aquí? ¿Por qué el navegador no envía las cookies establecidas por un dominio a ese dominio? ¿No debería estar pasando esto automáticamente?

editar - algunos ejemplos de código: configurar la solicitud XHR:

var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.widthCredentials = true; xhr.onreadystatechange = function(res){ if (xhr.readyState == 4){ cb(res,xhr); } }; xhr.setRequestHeader("Content-Type",''application/json''); xhr.setRequestHeader(''Accept'',''application/json''); xhr.send(JSON.encode({param:some_param}));

servidor:

function allowCrossDomain(req,res,next) { res.header(''Access-Control-Allow-Credentials'', true); res.header(''Access-Control-Allow-Origin'', req.headers.origin); res.header(''Access-Control-Allow-Methods'', ''GET,PUT,POST,DELETE,OPTIONS''); res.header(''Access-Control-Allow-Headers'', ''Content-Type,Accept,X-Requested-With''); if (req.method!=''OPTIONS'') return next(); res.send(204); } //while configuring express app.use(allowCrossDomain)

También vale la pena mencionar que he probado varios middlewares de npm que hacen lo mismo sin una diferencia observable.

En cuanto al escenario:

  1. Hacer una solicitud CORS usando XHR
  2. El servidor establece una cookie, que se envía con éxito al cliente (cookie de sesión expresa)
  3. La próxima solicitud de XHR no enviará esa cookie de nuevo al servidor, por lo que Express no puede identificar al usuario y, por lo tanto, crea una nueva cookie de sesión, etc.

Acabo de tener este problema, la solución en mi caso fue agregar la ruta a la cookie, así que cuando agregue la cookie debe usar:

document.cookie = ''cookieName=cookieValue;path=/'';

De esta manera el navegador podrá enviar la cookie en la nueva solicitud.

PS: También necesita xhr.withCredentials = true; Si está utilizando la solicitud de dominio cruzado.


Esto me pasó antes, y puedo decir que es bastante estúpido.

Si está utilizando una máquina virtual, generalmente la suspende / reanuda cuando la necesita, etc.

Esto significa que la fecha de la máquina virtual suele tardar algunos días (o más) en comparación con el host o con cualquier cliente que esté utilizando.

Entonces, cuando el servidor establece la fecha de caducidad de la cookie (generalmente un par de horas después de la fecha actual), ya está vencido en el cliente. Así, el cliente no lo conserva.

Para actualizar su fecha en su máquina virtual, le sugiero que solo use ntpdate , o puede configurar manualmente la fecha para ver si ese es el problema:

# what''s the date? date # You''ll see if it''s the problem already # If it is, here is how to manually set it date -set 2012-07-22 # yyyy-mm-dd date -set 17:00:42 # hh:mm:ss


Realmente no sé nada más sobre esto que lo que he leído, pero de acuerdo con los documentos de MDN, hay una propiedad "withCredentials" en el objeto XHR, y eso debe configurarse:

xhr.withCredentials = true;

Por defecto, es false . Si no se establece ese indicador, las cookies no se transmiten y los encabezados de las cookies en la respuesta se ignoran.

Editar - Juro que leí su pregunta un par de veces, pero me perdí por completo su mención de la bandera. Lo siento. Sin embargo, para que esto no sea un desperdicio total, también mencionaré que su servidor debe estar configurando el indicador "Acceso-Control-Permitir-Credenciales" en true en el encabezado de respuesta, y "Acceso-Control-Permitir- Origen "establecido en su protocolo actual + host + puerto.


Tuve un problema similar, y resultó que la configuración del navegador estaba bloqueando las cookies de terceros (Chrome> Configuración> Configuración avanzada> Privacidad> Configuración de contenido> Bloquear cookies de terceros y datos del sitio). Desbloqueo resuelto el problema!