web-dev-qa-db-fra.com

Utilisation de sessions dans Express.js

J'ai besoin d'aide pour comprendre le concept de sessions pour une application web. J'exécute un serveur Node.js avec Express 3.0.

Mes objectifs sont de:

  • Créer une session pour chaque utilisateur qui se connecte

  • Stockez cette session et utilisez-la pour valider si l'utilisateur est déjà connecté (empêcher deux appareils d'utiliser le même utilisateur en même temps) et pour limiter l'accès à certaines pages (en faisant correspondre l'ID de session à d'autres données)

J'utiliserai MemoryStore pour enregistrer les sessions (semble le plus simple). Si les objectifs ci-dessus ont du sens, pouvez-vous expliquer en détail comment les atteindre?

36
cesarcruz91

Express a Nice exemples dans le repo github. L'un d'eux traite de authentification et montre comment attacher l'utilisateur à l'objet req.session. Cela se fait à l'intérieur de la route app.post('/login').

Pour limiter l'accès à certaines pages, ajoutez un middleware simple à ces routes

function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
});

Comme Brandon déjà mentionné, vous ne devez pas utiliser le MemoryStore en production. Redis est une bonne alternative. Utilisez connect-redis pour accéder à la base de données. Un exemple de configuration ressemble à ceci

var RedisStore = require('connect-redis')(express);

// add this to your app.configure
app.use(express.session({
  secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
  store: new RedisStore({ Host: 'localhost', port: 3000, client: redis })
}));
40
zemirco

Utilisez MemoryStore en express UNIQUEMENT si vous ne créez pas plusieurs instances (comme avec le module de cluster). Si vous effectuez un équilibrage de charge sur plusieurs machines, votre équilibreur de charge devra utiliser des sessions persistantes/persistantes.

Si vous remplissez ces conditions, il vous suffit de vous connecter, une fois les informations d'identification validées, définissez une variable de session pour indiquer la connexion, par exemple:

req.session.loggedIn = true;

Si vous souhaitez vérifier si un utilisateur est connecté, cochez simplement cette variable.

if (req.session.loggedIn) {
    // user is logged in.
}
else {
    // user is not logged in.
}

Vous avez mentionné empêcher un seul utilisateur d'avoir des sessions plus d'une session à la fois. Pour y parvenir, vous devrez peut-être stocker quelque chose dans une base de données indiquant que l'utilisateur est connecté. Je vous préviens, cela peut être dangereux en raison de sessions obsolètes. Par exemple, que se passe-t-il si un utilisateur se connecte, mais ne se déconnecte jamais? Que se passe-t-il s'ils ferment la fenêtre de leur navigateur pour que la session soit définitivement terminée?

Express n'a aucun concept d'expiration d'une session inactive. J'ai implémenté une telle chose en stockant toutes les sessions dans la base de données avec un dernier horodatage consulté, puis en nettoyant périodiquement les données de session en fonction de l'heure. Mais vous devez également mettre à jour votre liste des personnes connectées.

10
Brandon