2014-12-24 6 views
183

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

  1. Wo user.id nach passport.serializeUser gehen aufgerufen wurde?

  2. Wir rufen passport.deserializeUser direkt 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 um sie meinen Kopf zu wickeln. Ich habe eine komplette App und lerne keine Fehler.

Ich wollte nur verstehen, was genau hier passiert?

Jede Hilfe wird geschätzt.

Antwort

227
  1. Wo kommt user.id gehen nach passport.serializeUser genannt worden ist?

Die Benutzer-ID (Sie bieten als das zweite Argument der done Funktion) in der Sitzung gespeichert und später das ganze Objekt über die deserializeUser Funktion zum Abrufen verwendet.

serializeUser bestimmt, 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 zum Beispiel, wäre es (wie wir den Benutzer-ID als Schlüssel zur Verfügung stellen) req.session.passport.user = {id:'xyz'}

  1. Wir fordern passport.deserializeUser gleich danach, wo es in dem Workflow paßt ?

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

Der abgerufene Objekt wird als req.user

visuellen Fluss auf die Anforderung Objekt angebracht

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 

}); 
    }); 
+1

So ist 'user.id' als' req.session.passport.user' gespeichert oder 'user' selbst als' gespeichert req.session.passport.user' – Anubhav

+2

@Anubhav bearbeitet siehe Diagramm .. –

+2

macht Sinn . danke – Anubhav

12

Für alle unter Verwendung von Koa und koa-passport:

wissen, dass der Schlüssel für den Benutzer festgelegt in Die serializeUser-Methode (oft eine eindeutige ID für diesen Benutzer) wird gespeichert in:

this.session.passport.user

Wenn Sie in done(null, user) in deserializeUser gesetzt, wo 'user' einige Benutzerobjekt aus Ihrer Datenbank ist:

this.req.user ODER this.passport.user

aus irgendeinem Grund this.user Koa Zusammenhang nie, wenn Sie anrufen gesetzt wird done (null, user) in Ihrer deserializeUser-Methode.

So können Sie Ihre eigene Middleware schreiben, nachdem der Anruf (passport.session()) app.use es wie so in this.user zu setzen:

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

Wenn Sie unklar sind, wie serializeUser und deserializeUser arbeiten, nur mich auf Twitter. @yvanscher

+1

groß und präzise Antwort – trdavidson

+0

Können wir im Chat sprechen, hatte ich wenige Zweifel. –