web-dev-qa-db-fra.com

Comment trouver l'ID de session lorsque vous utilisez Express/Connect et un magasin de session?

Si un utilisateur est déjà connecté et tente de se reconnecter dans une nouvelle instance, il convient de déconnecter l'autre instance d'utilisateur. Je ne veux pas que le même utilisateur soit connecté deux fois sur mon application.

Actuellement, la session est stockée dans un magasin Redis, j'utilise express/connect pour gérer le stockage de session. Une des fonctions disponibles pouvant être utilisées pour détruire la session est la suivante:

.destroy(sid, callback)

Cependant, je dois trouver cet identifiant de session avant d'appeler .destroy (). Dans Redis, le nom d'utilisateur est stocké dans le cadre de la session. 

Question: Est-il possible d'interroger Redis pour obtenir l'identifiant de session basé sur le nom d'utilisateur?

24
Jack

req.sessionID vous fournira l'ID de la session, où req est un objet de requête.

67
Joe H

Pour les lecteurs récents

Les middlewares Connect ne sont plus inclus dans Express depuis la version 4. 

Donc, pour que req.sessionID fonctionne, vous devez effectuer les tâches suivantes:

  1. Assurez-vous d’avoir les modules cookie-parser abd express-session dans votre package.json. Si ce n'est pas ajouté, ajoutez-les:
npm install express-session --save
npm install cookie-parser --save
  1. Faites attention à la commande tout en en ayant besoin dans votre fichier app.js et ajoutez les paramètres de configuration requis.
var cookieParser = require('cookie-parser');
var session = require('express-session')
app.use(cookieParser());
app.use(session({
    secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string
    resave: false,
    saveUninitialized: true
}));
  1. Vous devriez maintenant utiliser req.sessionID et req.session.id .
17
scaryguy

Stockez le SID avec le compte lorsque l'utilisateur se connecte pendant la validation de la base de données de l'appel du compte utilisateur .destroy (sid, fn), puis mettez à jour le SID dans la base de données avec le SID actuel de l'utilisateur.

Dans mon cas, en utilisant MongoDB, voici comment je l’ai fait:

app.post('/login', function(req, res)
{
  var sid = req.sessionID;
  var username = req.body.user;
  var password = req.body.pass;

  users.findOne({username : username, password : password}, function(err, result)
  { 
    ...
    sessionStore.destroy(result.session, function(){
       ...
       users.update({_id: result._id}, {$set:{"session" : sid}});
       ...
    }
    ...
  }
}
15
Jack

Question: Est-il possible d'interroger Redis pour obtenir l'identifiant de session basé sur le nom d'utilisateur?

Non. Les clés de session dans Redis ne portent pas le nom d'utilisateur.

Cependant, voici une pensée: lorsqu'un utilisateur déjà connecté tente de se connecter à nouveau, ne pouvez-vous pas voir cela dans votre application et détruire immédiatement l'ancienne session ou ne pas leur permettre de se connecter à nouveau?