it-swarm.com.de

Passport serialize deserialize verstehen

Wie würden Sie einem Laien den Arbeitsablauf der Serialisierungs- und Deserialisierungsmethoden von Passport erklären?.

  1. Woher kommt user.id geh nach passport.serializeUser genannt worden?

  2. Wir rufen passport.deserializeUser gleich danach, wo passt es in den Workflow?

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id); 
       // where is this user.id going? Are we supposed to access this anywhere?
    });
    
    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
    

Ich versuche immer noch, meinen Kopf darum zu wickeln. Ich habe eine voll funktionsfähige App und stoße auf keinerlei Fehler.

Ich wollte nur verstehen, was genau hier passiert?

Jede Hilfe wird geschätzt.

288
Anubhav
  1. Wohin geht user.id, Nachdem passport.serializeUser Aufgerufen wurde?

Die Benutzer-ID (die Sie als zweites Argument der Funktion done angeben) wird in der Sitzung gespeichert und später zum Abrufen des gesamten Objekts über die Funktion deserializeUser verwendet.

serializeUser legt fest, welche Daten des Benutzerobjekts in der Sitzung gespeichert werden sollen. Das Ergebnis der serializeUser-Methode wird als req.session.passport.user = {} An die Sitzung angehängt. Hier wäre es zum Beispiel (wie wir die Benutzer-ID als Schlüssel angeben) req.session.passport.user = {id: 'xyz'}

  1. Wir rufen gleich danach passport.deserializeUser Auf, wo es in den Workflow passt.

Das erste Argument von deserializeUser entspricht dem Schlüssel des Benutzerobjekts, das der Funktion done übergeben wurde (siehe 1.). So wird Ihr gesamtes Objekt mit Hilfe dieses Schlüssels abgerufen. Dieser Schlüssel ist hier die Benutzer-ID (Schlüssel kann ein beliebiger Schlüssel des Benutzerobjekts sein, d. H. Name, E-Mail usw.). In deserializeUser wird dieser Schlüssel mit dem Array/der Datenbank im Speicher oder einer beliebigen Datenressource abgeglichen.

Das abgerufene Objekt wird als req.user An das Anforderungsobjekt angehängt.

visueller Fluss

passport.serializeUser(function(user, done) {
    done(null, user.id);
});              │
                 │ 
                 │
                 └─────────────────┬──→ saved to session
                                   │    req.session.passport.user = {id: '..'}
                                   │
                                   ↓           
passport.deserializeUser(function(id, done) {
                   ┌───────────────┘
                   │
                   ↓ 
    User.findById(id, function(err, user) {
        done(err, user);
    });            └──────────────→ user object attaches to the request as req.user   
});
377
A.B

Für alle, die Koa und Koa-Pass verwenden:

Stellen Sie sicher, dass der Schlüssel für den Benutzer, der in der serializeUser-Methode festgelegt wurde (häufig eine eindeutige ID für diesen Benutzer), in Folgendem gespeichert wird:

this.session.passport.user

Wenn Sie in done(null, user) in deserializeUser festlegen, wobei 'user' ein Benutzerobjekt aus Ihrer Datenbank ist:

this.req.user OR this.passport.user

aus irgendeinem Grund this.user wird der Koa-Kontext nie festgelegt, wenn Sie in Ihrer deserializeUser-Methode done (null, user) aufrufen.

Sie können also nach dem Aufruf von app.use (passport.session ()) Ihre eigene Middleware schreiben, um sie wie folgt in this.user abzulegen:

app.use(function * setUserInContext (next) {
  this.user = this.req.user
  yield next
})

Wenn Sie sich nicht sicher sind, wie serializeUser und deserializeUser funktionieren, melden Sie sich einfach bei Twitter. @ yvanscher

18
yvanscher