Tengo un problema con el navegador que no almacena la cookie de sesión enviada desde mi servidor. La aplicación web de mi cliente está alojada en Vercel y la aplicación de mi servidor está alojada en Heroku. Utilizo el pasaporte para iniciar sesión, que cuando tenga éxito, enviará una cookie de sesión al navegador. Esto funciona bien cuando se ejecuta la aplicación localmente (es decir, Cliente en localhost:3000 y servidor en localhost:5500). Sin embargo, cuando ambas aplicaciones se ejecutan en un alojamiento remoto, el navegador no almacena la cookie.
CORS funciona bien, ya que puedo obtener datos de mis API con éxito.
He intentado jugar con las opciones de sesión de cookies (por ejemplo, mismo sitio, seguro, solo http, dominio) sin suerte.
Supongo que la cookie podría estar almacenada en la URL del servidor. Esperaba que la opción de sesión de cookies 'dominio' hubiera solucionado esto, pero desafortunadamente no fue así.
Cliente:
https://github.com/liamliamliam/RateFlix-Cliente
Servidor:
https://github.com/liamliamliam/RateFlix-Server
Índice.mjs
import 'dotenv/config'; import express from 'express'; import mongoose from 'mongoose'; import cookieSession from 'cookie-session'; import passport from 'passport'; import bodyParser from 'body-parser'; import cors from 'cors'; import './models/index.mjs'; import './services/passport.mjs'; import routes from './routes/index.mjs'; mongoose.connect(process.env.MONGODB_URI, console.log('Connected to MongoDB')); const app = express(); app.use( cors({ credentials: true, origin: ['https://rateflix.vercel.app', 'http://localhost:3000'] }) ); app.use(bodyParser.json()); app.use( cookieSession({ maxAge: 30 * 24 * 60 * 60 * 1000, keys: [process.env.COOKIE_KEY] }) ); app.use(passport.initialize()); app.use(passport.session()); routes(app); app.get('/api/env', (req, res) => res.json({ env: process.env.NODE_ENV })); const PORT = process.env.PORT || 5500; app.listen(PORT, console.log(`Running on port ${PORT}`));services/passport.mjs (serializeUser, deserializeUser)
passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { User.findById(id).then((user) => done(null, user)); });Dado que todo funciona bien y su cliente puede obtener datos de su backend sin ningún problema de CORS o lo que sea, entonces creo firmemente que la cookie se almacena bien. ¿Estás seguro de que estás viendo las cookies correctas? Deben almacenarse bajo la URL de su cliente web.
Asegúrese de que está revisando las cookies de esa URL y no localhost o cualquier otro.