Je galère pour mettre en place la gestion d'une variable session. Chose si simple en php, mais sur laquelle j'ai passé une bonne journée à essayer tout ce que je pouvais
La variable req.session.user est bien affectée lors de la requête de connexion ( quand je valide le formulaire ) et elle apparaît bien dans la réponse du serveur. Mais dès la requête suivante, il semble qu'une autre session soit crée, qui ne contient plus la variable que je lui avait affectée ( comportement gênant pour une variable de session ).
Est-ce le MemoryStore qui pose problème ? J'ai bien lu qu'il n'était pas fiable, mais au point que la session ne passe pas la première requête?
Voici les bouts de code où mon erreur devrait se trouver :
//app.js ( fichier de démarrage )
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');
var MongoStore = require('connect-mongo');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var logRouter = require('./routes/log'); // ajout de la route 'log'
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
//app.use(cookieParser('keepItSecret'));
app.use(session({
secret: 'keepItSecret',
resave: false,
saveUninitialized: true,
cookie: { secure: true, maxAge: 60000 }
}))
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.post('/log', logRouter);
app.use('/log', logRouter);
// catch 404 and forward to error handler
//log.js, contient les routes GET et POST de l'url localhost/log, qui gèrent les données du formulaire, et si possible les données de session
var express = require('express');
var router = express.Router();
var util = require('util');
/*POST log page */
router.post('/', function(req, res, next) {
var renderObject = { title: 'mySite logger'};
if(!req.body.postedName || !req.body.postedPass)
console.log('il manque des éléments');
if(req.body.postedName && req.body.postedPass)
{
console.log('posted : name="' + req.body.postedName + '", pass="' + req.body.postedPass + '"');
if(req.session.user)
{
renderObject.logError = 'alreadyConnected';
console.log('already connected');
}
else
{
req.session.user = req.body.postedName;
renderObject.user = req.session.user;
req.session.save();
console.log(req.session.user + " id: " + req.session.id);
}
}
res.render('logpage', renderObject);
});
/* GET log page. */
router.get('/', function(req, res, next) {
var renderObject = { title: 'mySite logger'};
if(req.session.user)
{
renderObject.user = req.session.user;
console.log('session trouvée : log.js l40 : ' + req.session.user);
}
else
{
console.log('session non trouvée');
}
res.render('logpage', renderObject);
});
module.exports = router;
//index.js, contient la route GET /, où je tente ( vainement ) de récupérer la variable de session
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
var renderObject = { title: 'mySite'};
if(req.session)
console.log('index l8 : ' + req.session.id);
if(req.session.user)
{
//renderObject.user = 'session';
console.log('session trouvée : ' + req.session.user);
renderObject.user = req.session.user;
}
else
{
console.log('session non trouvée');
}
res.render('index', renderObject);
});
module.exports = router;
Bonjour j'ai trouvé ce topic sur stackoverflow où un quelqu'un cherche à utilisé 2 gestionnaire de session avec express, et une autre personne propose comme solution de dupliqué le router de express.
var routerA = express.Router();
var routerB = express.Router();
app.use('/a_route', routerA);
app.use('/b_route', routerB);
Et explique que chaque routeur à un gestionnaire de session indépendant
Je pense que le fait d'avoir appelé express.Router pour chaque route fait que toutes les routes possède un gestionnaire de session et qu'il n'est pas commun avec les autres routes.
//index.js, contient la route GET /, où je tente ( vainement ) de récupérer la variable de session
var express = require('express');
var router = express.Router();
//log.js, contient les routes GET et POST de l'url localhost/log, qui gèrent les données du formulaire, et si possible les données de session
var express = require('express');
var router = express.Router();
Utilisé qu'un seul Router où un router par gestionnaire de session voulue pourrait peut être réglé le problème.
Ah, ce serait la fonction express.Router() qui m'écraserait la session à chaque fois? Merci du tuyau. Il faudrait que j'arrive à contrer ça, moi je souhaite juste avoir une seule session, qui soit conservée quelle que soit la page visitée.
Je peux pas récupérer la session crée lors de la connexion avant de faire appel à express.Router() et soit le passer en paramètre, soit écraser son gestionnaire de session ?
Je ne c'est pas si tu peut faire ça tu as la documentation officiel du express.Router qui effectivement et une méthode qui peut prendre des options en paramètre mais dans la description des options je ne vois rien qui parle des sessions.
Peut être qu'utilisé un seul appel à express.Router dans le fichier qui démarre l'application puis rangé le router dans une variable global réglerait le problème d'une façon plus simple (même si éparpiller des variables globales n'est pas top non plus...)
Nodejs contient un object global qui s'appel globalThis il et accessible dans tous les fichier peut être que dans le fichier app.js qui et exécuté en premier tu peut définir un router dans le globalThis et ré utilisé le même dans tous les autres fichiers
//app.js ( fichier de démarrage )
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');
var MongoStore = require('connect-mongo');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var logRouter = require('./routes/log'); // ajout de la route 'log'
var app = express();
globalThis.router = express.Router();
Après l'utilisation des variables globales n'est pas la seule façon de rendre commun le router tu pourrais le passé en paramètre à une fonction qui construit les routes par exemple.
Bon, vraiment pas facile pour moi tout ça, comme je le disais je suis amateur débutant en node.js. Par contre, je viens de remarquer un truc là-dedans :
var app = express();
var session = require('express-session');
var router = express.Router();
app.use('/a_route', router);
app.use('/b_route', router);
router.use(session({
genid: function(req) {
return require('crypto').randomBytes(48).toString('hex'); // use UUIDs for session IDs
},
secret: 'JollynakAjollynakAjollynakApamPam',
resave: false,
saveUninitialized: false,
name: **THIS SHOULD BE DYNAMIC BASED ON URL???**
}));
en faisant router.use(session(...)), ce n'est pas un moyen d'affecter une seule et même session quelle que soit la route?
Ou alors, il faudrait que je mette l'instruction var router = express.Router(); dans le fichier app.js ? ( et d'ailleurs, ça ressemblerait plus à ce que tu me dis, un seul router pour toutes les routes )
Bon, faut que je murisse ça encore un peu avant de trouver le courage de m'y remettre. En tout cas merci de m'avoir aiguillé.
( quelques recherches sur stackoverflow plus tard... )
Ah oui j'avais oublié l'option secure des paramètres des cookies, ces une option qui permet d'encrypté les cookies lors du partage (navigateur/serveur) mais ne fonctionne que sur un protocol HTTPS en local avec HTTP¨(où en prod avec HTTP) ne fonctionnera pas.
Si tu veut sécurisé les cookies tu peut quand même passé l'option httpOnly à true (ce qui rendra les cookies inaccessible par Javascript).
Bonne continuation.
- Edité par SamuelGaborieau3 14 juin 2021 à 23:45:43
suggestion de présentation.
Session avec express
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
suggestion de présentation.
suggestion de présentation.
suggestion de présentation.