Tengo un backend de nodo, que debería permitir la solicitud de origen cruzado desde mi aplicación frontend que se ejecuta en localhost:3000. Por lo tanto, he restringido la política cors a mi dominio.
import csrf from 'csurf'; app.use( cors({ origin: 'http://localhost:3000', credentials: true }) ); const csrfProtection = csrf({ cookie: { maxAge: 900, domain: 'http://localhost:3000' } }) router.get('/csrfToken', csrfProtection, async (req, res, next) => { res.json({ token: req.csrfToken() }); });Cuando realizo ahora una solicitud al punto final de mi servidor (que se ejecuta en localhost: 5000), me devuelve el siguiente error de que no se puede configurar la cookie.
fetch('http://localhost:5000/csrfToken', { method: 'GET', credentials: 'include' })Esto no tiene nada que ver con CORS. Así es como funcionan las cookies.
El dominio en el encabezado set-cookie dice http://localhost:3000 pero la solicitud es para http://localhost:5000 .
Ese es un origen diferente y también lo es una cookie no válida.
Es imposible que un encabezado set-cookie de un origen establezca una cookie para un origen diferente. http://localhost:5000 solo puede establecer cookies para http://localhost:5000 .
Si realmente desea configurar una cookie para :3000 , una solución alternativa sería proporcionar los datos a través de algún otro formato que no sea una cookie (por ejemplo, en el cuerpo de la solicitud) y luego tener el JS del lado del cliente en http://localhost:3000 configura la cookie usando la API document.cookie .
Si desea configurar la cookie para :5000 (lo que parece más probable), obtenga el número de puerto en el encabezado set-cookie .
const csrfProtection = csrf({ cookie: { maxAge: 900, domain: 'http://localhost:5000' } })Me encontré con este problema hoy también. Utilicé el navegador Chrome con una versión superior a 80. Chrome agregó un nuevo atributo "mismo sitio" para defender csrf que de v51. chrome v80+ límite predeterminado entre sitios establece cookies, hace que la cookie no sea válida. advertencia de la consola : se configuró una cookie asociada con un recurso entre sitios en http://XXX.XXX.XXX.XXXX/ sin el atributo SameSite . Se ha bloqueado, ya que Chrome ahora solo entrega cookies con solicitudes entre sitios si están configuradas con SameSite=None y Secure .
chrome://flags/ ingrese la descripción de la imagen aquí
Si alguien aterriza aquí desde Laravel (sanctum), puede probar esto para sus servidores locales:
//.env file. Try removing :port from SESSION_DOMAIN SANCTUM_STATEFUL_DOMAINS="127.0.0.1:8000" SESSION_DOMAIN="127.0.0.1"