web-dev-qa-db-de.com

Wie kann ich die Sitzungs-ID finden, wenn Sie express/connect und einen Sitzungsspeicher verwenden?

Wenn ein Benutzer bereits angemeldet ist und versucht, sich erneut in einer neuen Instanz anzumelden, möchte ich, dass er die andere Benutzerinstanz abmeldet. Ich möchte nicht, dass derselbe Benutzer zweimal in meiner Anwendung angemeldet ist.

Derzeit ist die Sitzung in einem Redis-Store gespeichert. Ich verwende Express/Connect, um den Sitzungsspeicher zu verwalten. Eine der verfügbaren Funktionen, die zum Zerstören der Sitzung verwendet werden können, lautet wie folgt:

.destroy(sid, callback)

Ich muss jedoch die Sitzungs-ID finden, bevor ich .destroy () anrufe. In Redis wird der Benutzername als Teil der Sitzung gespeichert. 

Frage: Ist es möglich, Redis abzufragen, um die Sitzungs-ID basierend auf dem Benutzernamen zu erhalten?

24
Jack

req.sessionID liefert Ihnen die ID der Sitzung, wobei req ein Anforderungsobjekt ist.

67
Joe H

Für die letzten Leser;

Connect-Middlewares sind seit Version 4 nicht in Express enthalten. 

Damit req.sessionID funktioniert, müssen Sie Folgendes tun:

  1. Stellen Sie sicher, dass sich cookie-parser und express-session-Module in Ihrem package.json befinden. Wenn es nicht hinzugefügt wird, fügen Sie sie hinzu:
npm install express-session --save
npm install cookie-parser --save
  1. Seien Sie vorsichtig bei der Bestellung, wenn Sie sie in Ihrer app.js-Datei benötigen, und fügen Sie die erforderlichen Konfigurationsparameter hinzu.
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. Jetzt sollten Sie req.sessionID und req.session.id verwenden.
17
scaryguy

Speichern Sie die SID mit dem Konto, wenn sich der Benutzer während der Datenbankvalidierung des Benutzerkontoaufrufs .destroy (Sid, Fn) anmeldet, und aktualisieren Sie dann die SID in der Datenbank mit der aktuellen SID des Benutzers.

In meinem Fall mit MongoDB habe ich das so gemacht:

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

Frage: Ist es möglich, Redis abzufragen, um die Sitzungs-ID basierend auf dem Benutzernamen zu erhalten?

Nein. Die Sitzungsschlüssel in redis sind nicht nach dem Benutzernamen benannt.

Hier ist jedoch ein Gedanke: Wenn ein bereits angemeldeter Benutzer versucht, sich erneut anzumelden, können Sie das in Ihrer Anwendung nicht sehen und entweder die alte Sitzung sofort zerstören oder ihnen die erneute Anmeldung nicht erlauben?