Partage
  • Partager sur Facebook
  • Partager sur Twitter

Session avec express

Sujet résolu
    25 mai 2021 à 18:37:53

    Bien le bonjour.

    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;

     D'avance merci.


    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2021 à 16:31:30

      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.

      • Partager sur Facebook
      • Partager sur Twitter

      suggestion de présentation.

        3 juin 2021 à 11:12:04

        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 ?

        • Partager sur Facebook
        • Partager sur Twitter
          6 juin 2021 à 15:43:37

          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.

          • Partager sur Facebook
          • Partager sur Twitter

          suggestion de présentation.

            13 juin 2021 à 18:25:38

            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... )

            OH P***IN !!!!
            Je me disais bien que toutes ces choses étaient bien complexes, moi qui voulais juste le principe tout simple des sessions.
            La solution se trouvait ici :
            https://stackoverflow.com/questions/67793233/session-from-express-session-not-persisting-through-requests

            C'est juste l'option secure du cookie à mettre sur false au lieu de true. Un peu bizarre et pas forcément très rassurant, mais bon, si ça fonctionne.

            -
            Edité par LucasWerquin 14 juin 2021 à 17:04:01

            • Partager sur Facebook
            • Partager sur Twitter
              14 juin 2021 à 23:43:04

              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

              • Partager sur Facebook
              • Partager sur Twitter

              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.
              • Editeur
              • Markdown