Partage
  • Partager sur Facebook
  • Partager sur Twitter

Node.JS: aide sur express-session (redirection)

Redirections via express-session

    5 juin 2016 à 13:20:01

    Hello!

    Je voulais me lancer sur un système de connexion avec Node.JS (qqchose de très basique).

    Voici mon code:

    var express = require("express"),
        app = express(),
        server = require("http").createServer(app),
        io = require("socket.io").listen(server),
        session = require("express-session");
    
    server.listen(8080);
    
    app.use(session({
        secret: "%dDFy6g#v!ITP3e65oEmneawJ&zuj7iG",
        resave: true,
        saveUninitialized: true
    }))
    
    .use(function(request, response, next) {
    
        console.log(request.session.logged);
    
        if (typeof request.session.logged === "undefined")
            response.redirect("/account/login/");
    
        if (request.session.logged === true)
            response.redirect("/dashboard/")
    
        next();
    })
    
    .use(express.static(__dirname + "/views/assets/"))
    
    .get("/dashboard/", function(request, response) {
        response.render("dashboard.ejs");
    })
    
    .get("/account/login/", function(request, response) {
        request.session.logged = false;
        console.log(request.session.logged);
        response.render("login.ejs");
    });


    Le but est simplement de rediriger l'utilisateur vers la page de connexion lorsque la session "logged" n'est pas définie. Cependant, cela créé une redirection en boucle: la console affiche des erreurs "Error: Can't set headers after they are sent." et la page ne s'affiche pas (pas redirigée correctement).

    Les différents console.log() m'indiquent que la session est bien sur "false" lorsqu'on visite la page /account/login/, mais revient sur undefined qqs secondes plus tard.

    Si quelqu'un pourrait éclairer ma lanterne, ça m'arrangerait.

    Merci!

    -
    Edité par Vaslyn 5 juin 2016 à 13:20:41

    • Partager sur Facebook
    • Partager sur Twitter
      6 juin 2016 à 12:31:27

      replace les if par 

      switch(true){
       case typeof request.session.logged === "undefined":
              response.redirect("/account/login/");
       break;
       case request.session.logged === true:
              response.redirect("/dashboard/"),
       break;
        default:
          next();
      
      }



      • Partager sur Facebook
      • Partager sur Twitter
        6 juin 2016 à 23:00:13

        Hm a mon humble avis il n'y pas besoin de switch case, c'est même le canon pour tuer une mouche.

        Déjà, si ton code ne fonctionne pas c'est parce que la fonction next() est quand même exécutée. En effet la fonction res.redirect() ne met pas fin à l'exécution de la fonction il te suffit juste d'ajouter un "return" devant chaque response.redirect().

        Comme ceci :

        var express = require("express"),
            app = express(),
            server = require("http").createServer(app),
            io = require("socket.io").listen(server),
            session = require("express-session");
         
        server.listen(8080);
         
        app.use(session({
            secret: "%dDFy6g#v!ITP3e65oEmneawJ&zuj7iG",
            resave: true,
            saveUninitialized: true
        }))
         
        .use(function(request, response, next) {
         
            console.log(request.session.logged);
         
            if (typeof request.session.logged === "undefined")
                return response.redirect("/account/login/");
         
            if (request.session.logged === true)
                return response.redirect("/dashboard/");
         
            next();
        })
         
        .use(express.static(__dirname + "/views/assets/"))
         
        .get("/dashboard/", function(request, response) {
            response.render("dashboard.ejs");
        })
         
        .get("/account/login/", function(request, response) {
            request.session.logged = false;
            console.log(request.session.logged);
            response.render("login.ejs");
        });



        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2016 à 17:46:08

          Hey!

          Merci de ta réponse, ça marche... pas entièrement ^^

          Lorsque la page est sensée être redirigée vers le dashboard (après la connexion via le.post sur /account/login/), il y a une boucle de redirection et je ne vois pas vraiment comment faire?

          var express = require("express"),
              app = express(),
              server = require("http").createServer(app),
              io = require("socket.io").listen(server),
              session = require("express-session");
            
          server.listen(8080);
            
          app.use(session({
              secret: "%dDFy6g#v!ITP3e65oEmneawJ&zuj7iG",
              resave: true,
              saveUninitialized: true
          }))
            
          .use(function(request, response, next) {
            
            
              if (typeof request.session.logged === "undefined") {
                  request.session.logged = false;
                  return response.redirect("/account/login/");
              }
            
              if (request.session.logged === true)
                  return response.redirect("/dashboard/");
            
              next();
          })
            
          .use(express.static(__dirname + "/views/assets/"))
            
          .get("/dashboard/", function(request, response) {
              response.render("dashboard.ejs");
          })
            
          .get("/account/login/", function(request, response) {
              response.render("login.ejs");
          })
          
          .post("/account/login/", function(request, response) {
              request.session.logged = true;
              return response.redirect("/dashboard/");
          });

          Merci!

          -
          Edité par Vaslyn 7 juin 2016 à 17:46:50

          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2016 à 18:02:40

            Je pense que c'est parce que tu utilise ton middleware pour les routes "/dashboard" et "/account/login".

            Ce que tu peux faire c'est de vérifier l'url demandée lors de tes vérification de session.

            Par contre, j'aurai personnellement utilisé un middleware différent pour la partie dashboard et connexion.

            Le dashboard passe par un middleware qui vérifie qu'on est bien connecté sinon redirige vers la page de login.

            Et pour la page de login un middleware vérifie que la session n'existe pas, sinon redirige vers le dashboard.

            Le problème actuellement c'est que lorsque tu te connecte, tu passe par le middleware qui te redirige vers "/dashboard". Cette route ayant pour dépendance le middleware celui voit que tu es connecté et te redirige vers "/dashboard" et ainsi de suite.

            • Partager sur Facebook
            • Partager sur Twitter
              10 juin 2016 à 16:25:31

              Bon j'ai pas fais des tonnes de nodejs mais en terme de logique tu as un soucis déjà, je crois que c'es tse que ChibiBlasphem essaye de te dire.

              .use(function(request, response, next) {
                 
                 
                  if (typeof request.session.logged === "undefined") {
                      request.session.logged = false;
                      return response.redirect("/account/login/");
                  }
                 
                  if (request.session.logged === true)
                      return response.redirect("/dashboard/");
                 
                  next();
              })

              Là ton middleware est appelé tout le temps, du coups je me trompe peut-être mais pour moi si tu est logué ça fait:

              accès à ta page -> logué? -> redirection vers dashboard -> logué? -> redirection vers dashboard -> logué? -> redirection vers dashboard -> etc...

              Même si ma théorie est fausse, avec ce code tu ne pourras jamais que accéder a "account/login" et "dashboard" étant donné tes if

              Pour éviter de rajouter des if à gogo je pense qu'il vos mieux simplifier ça :

              .use(function(request, response, next) {
                 
                 
                  if (typeof request.session.logged === "undefined") {
                      request.session.logged = false;
                      return response.redirect("/account/login/");
                  } else {
                      next();
                  }
              })

               Du moins c'est comme ça que je ferais ^^

              Tu peux même écrire:

              .use(function(request, response, next) {
                 
                 
                  if (typeof request.session.logged === "undefined") {
                      request.session.logged = false;
                      return response.redirect("/account/login/");
                  }
                  next();
              })




              • Partager sur Facebook
              • Partager sur Twitter
                10 juin 2016 à 18:12:55

                .use(function(request, response, next) {
                    
                    
                    if (typeof request.session.logged === "undefined") {
                        request.session.logged = false;
                        response.redirect("/account/login/");
                    }
                    else next();
                })

                ou plutot

                T.

                -
                Edité par Tracker 10 juin 2016 à 18:13:08

                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2016 à 11:29:15

                  @Tracker, tu te rends bien compte que ça fais exactement la même chose n'est-ce pas?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juin 2016 à 11:57:43

                    Oui sauf que niveau logique c'est plus compréhensible

                    • si tu ne rediriges pas tu files le traitement au prochain middleware
                    • et c'est étrange de faire un return d'une fonction qui n'est pas censé retourner quoique ce soit

                    T.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2016 à 19:09:08

                      Tracker a écrit:

                      Oui sauf que niveau logique c'est plus compréhensible

                      • si tu ne rediriges pas tu files le traitement au prochain middleware
                      • et c'est étrange de faire un return d'une fonction qui n'est pas censé retourner quoique ce soit

                      T.


                      Vu ton niveau en JS tu dois bien savoir que ne rien retourner à la fin d'une fonction exécute un return; implicite, soit un return undefined;

                      Une fonction qui ne renvoie rien théoriquement ça n'existe pas, elle renvoie undefined.

                      Si tu regarde les fichier minifier c'est souvent utiliser. Et clairement un return bien placé plus t'éviter des indentations inutiles

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juin 2016 à 22:17:19

                        Vu le code de GG84, à priori il n'a pas compris la logique de chaînage des middlewares d'express, le but de ma remarque était simplement de mettre en évidence l'algo. Pour le reste libre à toi d'écrite ton code comme tu le sens, le but d'un code source pour moi est d'être lisible sans ambiguité pas d'être minifié.

                        T.

                        -
                        Edité par Tracker 26 juin 2016 à 18:39:30

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Node.JS: aide sur express-session (redirection)

                        × 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