web-dev-qa-db-fra.com

Comprendre le passeport sérialiser désérialiser

Comment expliqueriez-vous le flux de travail des méthodes de sérialisation et de désérialisation de Passport à un profane?.

  1. user.id va-t-il après que passport.serializeUser a été appelé?

  2. Nous appelons passport.deserializeUser juste après, quelle est sa place dans le flux de travail?

    // 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);
        });
    });
    

J'essaie encore de m'envelopper la tête. J'ai une application de travail complète et je ne cours pas d'erreurs d'aucune sorte.

Je voulais juste comprendre ce qui se passe exactement ici?

Toute aide est appréciée.

288
Anubhav
  1. Où va user.id après que passport.serializeUser a été appelé?

L'identifiant de l'utilisateur (que vous fournissez comme second argument de la fonction done) est enregistré dans la session et est utilisé ultérieurement pour récupérer l'objet entier via la fonction deserializeUser.

serializeUser détermine quelles données de l'objet utilisateur doivent être stockées dans la session. Le résultat de la méthode serializeUser est associé à la session sous la forme req.session.passport.user = {}. Ici par exemple, ce serait (puisque nous fournissons l'identifiant de l'utilisateur comme clé) req.session.passport.user = {id: 'xyz'}

  1. Nous appelons passport.deserializeUser juste après, quelle est sa place dans le flux de travail?

Le premier argument de deserializeUser correspond à la clé de l'objet utilisateur qui a été donnée à la fonction done (voir 1.). Ainsi, tout votre objet est récupéré à l'aide de cette clé. Cette clé est l’identifiant de l’utilisateur (la clé peut être n’importe quelle clé de l’objet utilisateur, à savoir le nom, le courrier électronique, etc.) Dans deserializeUser, cette clé est associée au tableau/base de données en mémoire ou à toute ressource de données.

L'objet récupéré est attaché à l'objet de requête en tant que req.user

flux visuel

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

Pour ceux qui utilisent Koa et koa-passport :

Sachez que la clé définie pour l'utilisateur dans la méthode serializeUser (souvent un identifiant unique pour cet utilisateur) sera stockée dans:

this.session.passport.user

Lorsque vous définissez dans done(null, user) dans deserializeUser où 'utilisateur' correspond à un objet utilisateur de votre base de données:

this.req.user OR this.passport.user

pour une raison quelconque this.user le contexte Koa n'est jamais défini lorsque vous appelez done (null, utilisateur) dans votre méthode deserializeUser.

Donc, vous pouvez écrire votre propre middleware après l'appel à app.use (passport.session ()) pour le mettre dans this.user comme ceci:

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

Si vous ne savez pas exactement comment fonctionnent serializeUser et deserializeUser, n'hésitez pas à me contacter sur Twitter. @ yvanscher

18
yvanscher