es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error al establecer sameSite de strict o lax a none – cookie con solo HTTP – ExpressJS

Estoy trabajando en un proyecto de la pila MERN. El backend se ejecuta en el puerto 5000 y el frontend se ejecuta en el puerto 3000.

Después de haber generado la versión de producción, he enviado el archivo del servidor a Heroku y el archivo del cliente a Netlify. Por lo tanto, tuve que cambiar sameSite de strict a none, y el problema apareció tanto en el entorno de desarrollo como en el entorno de producción.

Aquí está mi código para crear una cookie:

validateLogin(req, res, next){
    user.find({username : req.body.username})
    .then(async (user) => {
        const valid = await bcrypt.compare(req.body.password, user[0].password); 
        if (valid) 
        res.cookie('token',"Hello",{
            httpOnly:true,
            maxAge:3600000*5,
            sameSite:'none',
            secure:true,
         }).status(200).send("Inicio de sesión exitoso");
        res.status(403).send({status: false, message: `Contraseña incorrecta`});
    })
    .catch(() => {res.status(400).send({status : false,message : `No se puede validar el inicio de sesión`})});
}

Al principio, como he mencionado, la cookie funcionaba sin problemas cuando sameSite:'strict' o sameSite:'lax' en el entorno de desarrollo. Pero tuve que cambiarlo por motivos de producción.

El código de estado 400 se devuelve cuando intento validar el inicio de sesión. Cuando sameSite != none, devuelve con el código de estado 200 y recibe el mensaje “Inicio de sesión exitoso”, pero no se agrega ninguna cookie.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en node.js, reactjs, express, cookies y cookie-httponly, puedo ofrecer una idea sobre el problema que estás enfrentando.

    Como mencionaste, estás ejecutando un proyecto MERN stack, con el backend ejecutándose en el puerto 5000 y el frontend ejecutándose en el puerto 3000. Después de compilar para producción, subiste el archivo del servidor a Heroku y el archivo del cliente a Netlify. Esto requirió que cambiaras el atributo sameSite de strict a none.

    Tu código para crear una cookie es el siguiente:

    validateLogin(req, res, next){
        user.find({username : req.body.username})
        .then(async (user) => {
            const valid = await bcrypt.compare(req.body.password, user[0].password); 
            if (valid) 
            res.cookie('token',"Hello",{
                httpOnly:true,
                maxAge:3600000*5,
                sameSite:'none',
                secure:true,
             }).status(200).send("Inicio de sesión exitoso")
            res.status(403).send({status: false, message: `Contraseña incorrecta`});
        })
        .catch(() => {res.status(400).send({status : false,message : `No se puede validar el inicio de sesión`})});
    }
    

    Inicialmente, la cookie funcionaba correctamente cuando el atributo sameSite estaba configurado en strict o lax en el entorno de desarrollo. Sin embargo, al cambiarlo a none para fines de producción, se produjo un problema en el que el código de estado 400 se devolvía al validar el inicio de sesión. Cuando el atributo sameSite no se establecía en none, se devolvía el código de estado 200 pero no se agregaba ninguna cookie.

    Según la información proporcionada, parece que el problema puede estar relacionado con el atributo secure. Cuando se establece en true, la cookie solo se enviará a través de HTTPS. Es posible que esto esté causando problemas con la configuración adecuada de la cookie.

    Para solucionar este problema, puedes intentar establecer el atributo secure en false y ver si la cookie se configura correctamente. Además, puedes intentar usar una herramienta de gestión de cookies (como EditThisCookie para Chrome) para verificar si la cookie se está configurando correctamente y para ver sus atributos.

    Además, debes asegurarte de que tu backend y frontend estén correctamente configurados para manejar las cookies con el valor none para el atributo sameSite. Esto puede implicar configurar encabezados CORS en el backend y actualizar el código del lado del cliente para manejar los cambios.

    En resumen, el problema que enfrentas con la configuración incorrecta de la cookie puede estar relacionado con el atributo secure u otros problemas de configuración en tu backend y frontend. Al solucionar estos aspectos y asegurarte de que las configuraciones sean correctas, deberías poder resolver el problema y configurar la cookie correctamente con el valor none para el atributo sameSite.

Comments are closed.