Wenn Sie Sitzungen verwenden Sie müssen Passport mit einer Serialisierungs- und Deserialisierungsfunktion versehen. Die Implementierung von Redis als Sitzungsspeicher hat nichts damit zu tun, wie Passport implementiert wurde, sondern nur damit, wo die Sitzungsdaten gespeichert werden.
Implementierung von Sitzungen mit Passport
Wie ich bereits sagte, müssen die Serialisierungs- und Deserialisierungsfunktionen für Passport bereitgestellt werden, damit Sitzungen funktionieren.
Der Zweck der Serialisierung Die Funktion besteht darin, ausreichend identifizierende Informationen zurückzugeben, um das Benutzerkonto bei späteren Anfragen wiederherzustellen. Insbesondere der zweite Parameter von done()
Methode sind die in die Sitzungsdaten serialisierten Informationen .
Die Deserialisierung Die von Ihnen bereitgestellte Funktion soll das Benutzerprofil basierend auf den identifizierenden Informationen zurückgeben, die für die Sitzung serialisiert wurden .
Hier ist das Beispiel aus dem Passport Guide im Abschnitt über Sitzungen:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Im obigen Beispiel passport.serializeUser()
wird eine Funktion bereitgestellt, die zwei Parameter akzeptiert, das Benutzerprofil (user
) und eine Callback-Funktion (done
). Die Callback-Funktion nimmt als zweiten Parameter die identifizierenden Informationen (user.id
, aber wenn Sie MongoDB verwenden, kann dies user._id
sein ) erforderlich, um das Konto aus der Datenbank wiederherzustellen. Dies wird bei jeder authentifizierten Anfrage aufgerufen und speichert die identifizierenden Informationen in den Sitzungsdaten (ob in einem Cookie oder Ihrem Redis-Speicher).
passport.deserializeUser()
wird eine Funktion bereitgestellt, die auch zwei Parameter akzeptiert, die identifizierenden Informationen (id
) und wieder eine Callback-Funktion (done
). Die Identifizierungsinformationen sind das, was in der vorherigen Anfrage zu den Sitzungsdaten serialisiert wurde (user.id
). Die Rückruffunktion erfordert hier das Benutzerprofil als zweiten Parameter oder einen Fehler beim Abrufen des Profils als ersten Parameter. Die User.findById()
Funktion ist eine Suchfunktion für das Benutzerprofil in der Datenbank. In diesem Beispiel User
Objekt ist eine Instanz eines Mungo-Modells, das den findById()
hat Funktion.
Die für passport.deserializeUser()
bereitgestellte Funktion wird von der Passport-Middleware passport.session()
aufgerufen vor dem Routenhandling zum Speichern des Benutzerprofils (user
) zu req.user
.
Redis als Sitzungsspeicher implementieren
Der Zweck der Verwendung von Redis besteht darin, Sitzungsdaten serverseitig zu speichern, sodass die einzigen Daten, die clientseitig gespeichert werden, die Sitzungs-ID sind. Auch dies ist unabhängig davon, wie Sie Passport implementiert haben, Passport kümmert sich nicht darum, wo die Sitzungsdaten gespeichert werden, solange Sie Ihrer App Sitzungsunterstützung hinzugefügt haben. Diese vorherige Frage zu Stackoverflow befasst sich mit der Implementierung von Redis