Tengo una aplicación MERN cuyo backend está alojado en Heroku y frontend en netlify. No puedo ver las cookies en el navegador después de implementar la aplicación, pero funciona bien en localhost. Creo que se debe a los diferentes puertos de backend y frontend, ¿qué me estoy perdiendo? Por favor, ayuda.
Estás en lo correcto. Las cookies no son compatibles entre dominios. Si lo fuera, sería un grave problema de seguridad. La forma más fácil de solucionar su problema sería devolver la cookie como un objeto res y luego configurar la cookie manualmente en la interfaz.
Toma esto por ejemplo. Haré esto con pseudocódigo de estilo JavaScript. No copie y pegue esto, ya que lo más probable es que no funcione de inmediato. Esto es lo que vas a hacer en el back-end:
// 1. Authenticate the user. const userData = await authenticateUser(); const userToken = await verifyUser(userData); // 2. Return the response object. return response.status(200).json({ status: 'success', data: userData, token: userToken, });En la parte delantera:
const response = await axios.post(...); // your API call, will return above object. // set your authentication token here. // the 'options' object will contain all possible cookie options, example would be 'secure'. cookies.set('token', response.data.token, options); // alternatively, set the cookie in the local storage. localStorage.setItem('token', response.data.token);Debe configurar la cookie en consecuencia en el front-end.
Lectura adicional: MDN Docs
EDITAR : Tu pregunta no está clara. La primera vez que habló de cookies, pero ahora está hablando de cookies httpOnly . Por favor sea más específico en sus preguntas.
Es imposible establecer cookies httpOnly en React.js si es multidominio. React solo es responsable de la 'vista' del sitio web. Las cookies httpOnly solo están destinadas a configurarse en el lado del servidor. El JavaScript del lado del cliente no puede leer ni configurar esa cookie específica, pero puede enviarla. A menos que tenga algo en su Netlify que pueda realizar operaciones del lado del servidor, no creo que sea posible.
Lo mejor que puedes hacer es usar el mismo dominio.