Entender el pasaporte serializar deserializar

¿Cómo explicaría el flujo de trabajo de los métodos de serialización y deserialización de Passport a un lego?

  1. ¿A dónde va user.id go after passport.serializeUser ?

  2. Estamos llamando a passport.deserializeUser justo después de donde encaja en el flujo de trabajo?

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

Todavía estoy tratando de entenderlo. Tengo una aplicación de trabajo completa y no tengo errores de ningún tipo.

Solo quería entender qué está pasando exactamente aquí.

Cualquier ayuda es apreciada.

  1. ¿A dónde va user.id go after pasaporte.serializeUser?

El ID de usuario (que proporciona como el segundo argumento de la función completada) se guarda en la sesión y luego se usa para recuperar el objeto completo a través de la función deserializeUser .

serializeUser determina qué datos del objeto de usuario deben almacenarse en la sesión. El resultado del método serializeUser se adjunta a la sesión como req.session.passport.user = {} . Aquí, por ejemplo, sería (ya que proporcionamos la identificación del usuario como la clave) req.session.passport.user = {id:'xyz'}

  1. Estamos llamando a pasaporte.deserializeUser justo después de donde encaja en el flujo de trabajo?

El primer argumento de deserializeUser corresponde a la clave del objeto de usuario que se le dio a la función done (ver 1.). Entonces, todo su objeto se recupera con la ayuda de esa clave. Esa clave aquí es la identificación del usuario (la clave puede ser cualquier clave del objeto del usuario, es decir, nombre, correo electrónico, etc.). En deserializeUser esa clave se combina con la matriz / base de datos de la memoria o cualquier recurso de datos.

El objeto recuperado se adjunta al objeto de solicitud como req.user

Flujo 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 cualquiera que use Koa y koa-pasaporte :

Sepa que la clave para el usuario configurada en el método serializeUser (a menudo una identificación única para ese usuario) se almacenará en:

this.session.passport.user

Cuando se establece en done(null, user) en deserializeUser donde ‘user’ es un objeto de usuario de su base de datos:

this.req.user O this.passport.user

por alguna razón, this.user contexto this.user Koa nunca se establece cuando llamas a done (null, user) en tu método deserializeUser.

Así que puedes escribir tu propio middleware después de la llamada a app.use (pasaporte.sesión ()) para ponerlo en this.user así:

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

Si no está seguro de cómo serializeUser y deserializeUser funcionan, solo entrégueme a Twitter. @yvanscher

Intereting Posts