Bonjour à tous,
je suis actuellement apprenant et j'essaie de mettre en place un template fullstack.
J'utilise React en front et Express.js pour le backend, j'ai créé un dashboard avec un système d'authentification qui fonctionne relativement bien.

Mon problème.
J'essais depuis une dizaine de jours de garder une session connectée lorsque que je quitte ou rafraichi une page, en vain.
Une fois loggé, j'aimerais que toute ma route privée (le dashboard) soit persistant.
J'utilise ces module :

express-session
express-mysql-session

Coté serveur j'ai mis en place un middleware de session qui ressemble à ça:

import session from "express-session";
import MySQLStore from "express-mysql-session";
import { v4 as uuidv4 } from "uuid";

const MySQLStoreSession = MySQLStore(session);

const sessionStore = new MySQLStoreSession({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  clearExpired: true,
  checkExpirationInterval: 15 * 60 * 1000,
  expiration: 24 * 60 * 60 * 1000,
});

const sessionMiddleware = session({
  genid: (req) => {
    return uuidv4();
  },
  secret: 'your secret',
  name: 'sessionId',
  resave: false,
  saveUninitialized: false,
  cookie: { 
    path: '/',
    httpOnly: true,
    secure: "auto",
    sameSite: "lax",
    maxAge: 14 * 24 * 60 * 60 * 1000,
  }, 
  store: sessionStore, 
});

const verifySessionMiddleware = (req, res, next) => {
  if (!req.session || !req.session.userId) {
    console.error('Session verification failed:', req.session);
    return res.status(401).json("Non authentifié");
  }

  req.userId = req.session.userId;
  next();
};

export { sessionMiddleware, verifySessionMiddleware};

Lorsque que je l utilise comme ci-dessous dans mon serveur, j'obtient bien un cookie de session et une sessionId identique dans ma base de données, avec le bon userId:

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', `${apiUrl}`);
  res.setHeader('Access-Control-Allow-Credentials', 'true'); 
  next();
});

// activation de cookie-parser
app.use(cookieParser());

//session
app.use(sessionMiddleware);
app.use((req, res, next) => {
  req.session.init = "init";
  next();
});
app.get('/', verifySessionMiddleware);

// utilisation des routes
app.use("/api/auth", authRoutes);
app.use("/api/passwordrecovery",passRecRoutes)

Dans mon controller de login j ai ajouté

req.session.userId = data[0].id;

pour récupérer l'id.

Mais voilà, rien n'y fait, que ce soit une fois le site déployé (en changeant les propriété des cookies) ou en locale, mes sessions ne tiennent pas.
Je ne suis pas sur de devoir ajouter quelque chose dans le frontend, ce n'est pas mentionné dans la documentation.

Merci!

1 réponse


Hello :)

Alors req.session ce n'est pas la sesion, c'est les données session de la request

Pour la session tu peux utiliser sessionStorage.setItem("key", "value")

Si tu es coté serveur il faudrait ajouter un header Set-Cookie à la réponse de ton backend