Noções básicas sobre passaporte serializar desserializar

Como você explicaria o stream de trabalho dos methods de serialização e desserialização do Passport para um leigo?

  1. Para onde user.id vai depois de passport.serializeUser ter sido chamado?

  2. Estamos chamando passport.deserializeUser logo depois dele, onde ele se encheckbox no stream de trabalho?

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

Eu ainda estou tentando envolver minha cabeça em torno disso. Eu tenho um aplicativo de trabalho completo e não estou correndo em erros de qualquer tipo.

Eu só queria entender o que exatamente está acontecendo aqui?

Qualquer ajuda é apreciada.

    1. Para onde user.id vai depois de passport.serializeUser ter sido chamado?

    O id do usuário (você fornece como o segundo argumento da function done ) é salvo na session e é usado posteriormente para recuperar o object inteiro por meio da function deserializeUser .

    serializeUser determina quais dados do object de usuário devem ser armazenados na session. O resultado do método serializeUser é anexado à session como req.session.passport.user = {} . Aqui, por exemplo, seria (como nós fornecemos o id do usuário como a chave) req.session.passport.user = {id:'xyz'}

    1. Estamos chamando passport.deserializeUser logo depois dele, onde ele se encheckbox no stream de trabalho?

    O primeiro argumento de deserializeUser corresponde à chave do object de usuário que foi dado à function done (veja 1.). Então todo o seu object é recuperado com a ajuda dessa chave. Essa chave aqui é o ID do usuário (a chave pode ser qualquer tecla do object do usuário, ou seja, nome, email, etc.). Em deserializeUser essa chave é correspondida com a matriz / database em memory ou qualquer recurso de dados.

    O object buscado é anexado ao object request como req.user

    Fluxo Visual

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

    Para quem usa Koa e koa-passaporte :

    Saiba que a chave para o usuário definida no método serializeUser (geralmente um ID exclusivo para esse usuário) será armazenada em:

    this.session.passport.user

    Quando você define em done(null, user) em deserializeUser, em que ‘user’ é algum object de usuário do seu database:

    this.req.user OU this.passport.user

    por algum motivo, o contexto deste this.user Koa nunca é definido quando você chama done (null, user) em seu método deserializeUser.

    Então você pode escrever seu próprio middleware após a chamada para app.use (passport.session ()) para colocá-lo neste user.user assim:

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

    Se você não está claro sobre como serializeUser e deserializeUser funcionam, apenas me avise no twitter. @vanscher