Descripción del pasaporte serializar deserializar


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

  1. ¿A dónde va user.id después de que passport.serializeUser ha sido llamado?

  2. Estamos llamando a passport.deserializeUser justo después de él, ¿dónde 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 envolver mi cabeza alrededor de ella. Tengo una aplicación completa que funciona y no me estoy metiendo en errores de ningún tipo.

Solo quería entender qué es exactamente lo que está sucediendo aquí?

Cualquier ayuda es apreciada.

Author: Sunil Garg, 2014-12-24

2 answers

  1. ¿Dónde user.id ve tras el pasaporte.serializeUser ha sido llamado?

El id de usuario (que proporciona como segundo argumento de la función done) se guarda en la sesión y se usa más tarde para recuperar todo el objeto 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 (como nosotros proporcionar el id de usuario como clave) req.session.passport.user = {id:'xyz'}

  1. Estamos llamando a pasaporte.deserializeUser justo después de él ¿dónde encaja en el flujo de trabajo?

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

El objeto obtenido 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

 });
  });
 285
Author: A.B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 15:11:04

Para cualquiera que use Koa y koa-passport :

Sepa que la clave para el usuario establecida en el método serializeUser (a menudo un id único 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 El contexto Koa nunca se establece cuando llamas a done(null, user) en tu método deserializeUser.

Para que puedas escribir tu propia middleware después de la llamada a la aplicación.uso(pasaporte.session()) para ponerlo en esto.usuario así:

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

Si no tienes claro cómo funcionan serializeUser y deserializeUser, solo comunícame en twitter. @yvanscher

 14
Author: yvanscher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-18 21:12:58