Estoy tratando de enviar cookies a un script PHP dentro de una solicitud CORS de recuperación de JavaScript. La solicitud comienza en https://sub1.example.com y contiene las siguientes opciones:
let response = await fetch('https://sub2.example.com/target.php', { method: "POST", headers: headers, body: formData, mode: 'cors', credentials: 'include', cache: 'no-store' });El script PHP correspondiente establece los siguientes encabezados:
header('Access-Control-Allow-Origin: https://www.example.com'); header('Access-Control-Allow-Methods: POST, OPTIONS'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');Pero el encabezado de la cookie no se envía con la solicitud. También probé:
let headers = new Headers(); headers.set('Cookie', document.cookie);Eso tampoco tuvo efecto. ¿Qué estoy haciendo exactamente mal aquí?
Revisé la pestaña Red en las Herramientas de desarrollo. También $_COOKIE en PHP Script está vacío. No hay absolutamente ningún error. También puedo ver que el encabezado de la cookie se envía en cualquier solicitud de extracción que no sea fetch .
EDITAR: Aquí están los Ajustes de una de las Cookies:
Name: PHPSESSID Path: / Secure: true SameSite: noneNo puedo compartir el Dominio porque no es público. Pero el dominio de la cookie tiene el mismo valor que el origen en el encabezado de la solicitud (menos el https://).
EDIT 2: Cambió la URL de búsqueda para aclarar lo que está sucediendo.
Tenga en cuenta que, dependiendo de
Path de la cookie,Domain de la cookie,Secure de la cookie,SameSite de la cookie, una cookie puede o no adjuntarse a la solicitud. De particular relevancia para su caso es el atributo Domain ; echa un vistazo a la página de MDN sobre el tema :
El atributo
Domainespecifica qué hosts pueden recibir una cookie. Si no se especifica, el atributo predeterminado es el mismo host que configuró la cookie, excluyendo los subdominios . Si se especificaDomain, los subdominios siempre se incluyen. Por lo tanto, especificarDomaines menos restrictivo que omitirlo. Sin embargo, puede ser útil cuando los subdominios necesitan compartir información sobre un usuario.
Está configurando la cookie de la siguiente manera en el origen https://sub1.example.com :
Set-Cookie: PHPSESSID=whatever; Path=/; SameSite=None; Secure Por lo tanto, esa cookie se adjuntará a las solicitudes (con credenciales) cuyo origen de destino sea https://sub1.example.com y ningún otro.
Si desea que su cookie se envíe a todos los orígenes seguros cuyo dominio sea un subdominio de example.com , debe establecer explícitamente su Domain en example.com .
fetch El estándar Fetch especifica una lista de nombres de encabezados prohibidos ; Cookie es una de ellas. No puede establecer un encabezado llamado Cookie en una solicitud enviada con fetch ; la norma simplemente lo prohíbe . Si desea adjuntar cookies existentes a una solicitud de origen cruzado, use el valor 'include' para el parámetro de credentials pasado en las opciones de fetch .
Normalmente, no se supone que las cookies se adjunten a las solicitudes de verificación previa en el modo CORS. Es posible que desee comprobar esto.
Nota: Los navegadores no deben enviar credenciales en solicitudes de verificación previa, independientemente de esta configuración. Para más información ver: CORS > Solicitudes con credenciales.
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch