Comprender el pasaporte serializar deserializar

Resuelto Anubhav asked hace 9 años • 7 respuestas

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

  1. ¿ Adónde user.idva después passport.serializeUserde haber sido llamado?

  2. Llamaremos passport.deserializeUserjusto después, ¿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 entenderlo. Tengo una aplicación que funciona completamente y no encuentro errores de ningún tipo.

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

Se agradece cualquier ayuda.

Anubhav avatar Dec 24 '14 20:12 Anubhav
Aceptado
  1. ¿ Adónde user.idva después passport.serializeUserde haber sido llamado?

La identificación de usuario (que usted proporciona como segundo argumento de la donefunción) se guarda en la sesión y luego se usa para recuperar el objeto completo a través de la deserializeUserfunción.

serializeUserdetermina 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 clave)req.session.passport.user = {id: 'xyz'}

  1. Llamaremos passport.deserializeUserjusto después, ¿dónde encaja en el flujo de trabajo?

El primer argumento de deserializeUsercorresponde a la clave del objeto de usuario que se le dio a la donefunción (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 de usuario, es decir, nombre, correo electrónico, etc.). Esa deserializeUserclave coincide con la matriz/base de datos en la memoria o cualquier recurso de datos.

El objeto recuperado se adjunta al objeto de solicitud comoreq.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   
});
A.B avatar Dec 24 '2014 13:12 A.B

Para cualquiera que utilice Koa y koa-passport :

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

this.session.passport.user

Cuando configura done(null, user)deserializeUser donde 'usuario' es algún objeto de usuario de su base de datos:

this.req.user O this.passport.user

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

Entonces puedes escribir tu propio middleware después de llamar a app.use(passport.session()) para ponerlo en this.user así:

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

Si no tiene claro cómo funcionan serializeUser y deserializeUser, contácteme en Twitter. @yvanscher

yvanscher avatar Aug 04 '2015 19:08 yvanscher