ACTUALIZACIÓN: aparentemente funciona en Firefox, estaba usando Brave. ¿Supongo que está bloqueando la cookie con la sesión? No sé qué hacer al respecto.
Estoy creando una aplicación con Vue, conectándome a través de Axios a una API hecha con express.
Estoy tratando de usar la sesión rápida para administrar las sesiones de inicio de sesión y la autenticación. En mi localhost funciona muy bien, pero cuando traté de usarlo desde el sitio alojado en heroku, se estropeó. El middleware que verifica si la sesión tiene una propiedad de usuario bloquea la llamada.
Estoy bastante seguro de que tiene que ver con https en lugar de http. Lo probé en localhost https con algunas credenciales generadas y se rompió de la misma manera.
El punto final para el inicio de sesión es bastante largo, pero básicamente verifica si la contraseña que le dio es correcta y, si lo es, establece req.session.usuario en un objeto con algunos datos de usuario. Después de eso, cuando vuelvo a verificar la sesión, el usuario no está configurado.
El software intermedio CORS:
const cors = require("cors"); const whitelist = ["https://localhost:8080", "https://hosted-client.herokuapp.com"]; const corsOptions = { credentials: true, origin: (origin, callback) => { if (whitelist.includes(origin)) return callback(null, true); //callback(new Error("CORS error")); callback(null, true); }, }; module.exports = cors(corsOptions);El middleware de sesión:
const Redis = require("ioredis"); const connectRedis = require("connect-redis"); const session = require("express-session"); const RedisStore = connectRedis(session); const redisClient = new Redis( process.env.REDIS_PORT, process.env.REDIS_HOST, {password: process.env.REDIS_PASSWORD} ); module.exports = session({ store: new RedisStore({ client: redisClient }), secret: process.env.SECRET, saveUninitialized: false, resave: process.env.STATE_ENV === "production", proxy: true, cookie: { secure: process.env.STATE_ENV === "production", httpOnly: true, sameSite: "none", // maxAge: 1000 * 60 * 30, // 30 minutos }, });Un middleware de autenticación de prueba simple:
module.exports = function (req, _, next) { if (!req.session || !req.session.usuario) { const err = new Error("No se encontró una sesión"); err.statusCode = 401; next(err); } next(); }La instancia de Axios en el cliente:
require("dotenv").config(); import axios from "axios"; export default axios.create({ baseURL: process.env.VUE_APP_API, headers: { "Content-type": "application/json", }, withCredentials: true, });No estoy seguro si eso es suficiente información, si no házmelo saber.