node.js - formdata - Entender el pasaporte serializar deserializar
serialize javascript (2)
- ¿A dónde va
user.id
después de llamar apassport.serializeUser
?
El ID de usuario (que proporciona como segundo argumento de la función
done
) se guarda en la sesión y luego se utiliza 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 el ID de usuario como clave)
req.session.passport.user = {id: ''xyz''}
- Estamos llamando a
passport.deserializeUser
justo después, ¿dónde 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 de usuario (la clave puede ser cualquier clave del objeto de usuario, es decir, nombre, correo electrónico, etc.).
En
deserializeUser
esa clave coincide con la matriz de memoria / 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
});
¿Cómo explicarías el flujo de trabajo de los métodos de serialización y deserialización de Passport a un laico?
-
¿A dónde va
user.id
después de llamar apassport.serializeUser
?
-
Estamos llamando a
passport.deserializeUser
justo 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 de trabajo completa y no me encuentro con errores de ningún tipo.
Solo quería entender qué está pasando exactamente aquí.
Cualquier ayuda es apreciada.
Para cualquiera que use 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 establece
done(null, user)
en deserializeUser donde ''user'' es algún objeto de usuario de su base de datos:
this.req.user
O
this.passport.user
por alguna razón, el contexto de
this.user
Koa nunca se establece cuando llamas a hecho (nulo, usuario) en tu método deserializeUser.
Para que pueda escribir su propio middleware después de la llamada 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 tienes claro cómo funcionan serializeUser y deserializeUser, solo contáctame en Twitter. @yvanscher