sql >> Base de Datos >  >> NoSQL >> Redis

¿Implemento serializar y deserializar NodesJS + Passport + RedisStore?

Si está utilizando sesiones debe proporcionar pasaporte con una función de serialización y deserializar. La implementación de Redis como un almacén de sesiones no tiene nada que ver con la forma en que se implementó el pasaporte, solo se trata de dónde se almacenan los datos de la sesión.

Implementación de Sesiones con pasaporte

Como dije, las funciones serializar y deserializar deben proporcionarse al pasaporte para que las sesiones funcionen.

El propósito de serializar La función es devolver suficiente información de identificación para recuperar la cuenta de usuario en cualquier solicitud posterior. Específicamente el segundo parámetro de done() El método es la información serializada en los datos de la sesión .

La deserializar La función que proporciona está destinada a devolver el perfil de usuario en función de la información de identificación que se serializó en la sesión .

Aquí está el ejemplo de la Guía de Pasaportes en la sección de sesiones de discusión:

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

En el ejemplo anterior passport.serializeUser() se proporciona una función que toma dos parámetros, el perfil de usuario (user ) y una función de devolución de llamada (done ). La función de devolución de llamada toma como segundo parámetro la información de identificación (user.id , pero si está usando mongoDB, esto puede ser user._id ) necesarios para recuperar la cuenta de la base de datos. Esto se llamará en cada solicitud autenticada y almacena la información de identificación en los datos de la sesión (ya sea en una cookie o en su tienda Redis).

passport.deserializeUser() se proporciona una función que también toma dos parámetros, la información de identificación (id ) y nuevamente una función de devolución de llamada (done ). La información de identificación es lo que se serializó en los datos de la sesión en la solicitud anterior (user.id ). La función de devolución de llamada aquí requiere el perfil de usuario como su segundo parámetro, o cualquier error generado al recuperar el perfil como su primer parámetro. El User.findById() La función es una función de búsqueda para el perfil de usuario en la base de datos. En este ejemplo User object es una instancia de un modelo de mangosta que tiene el findById() función.

La función proporcionada a passport.deserializeUser() es llamado por el middleware de pasaporte, passport.session() antes del manejo de la ruta para almacenar el perfil de usuario (user ) a req.user .

Implementación de Redis como almacén de sesión

El propósito de usar Redis es almacenar los datos de la sesión en el lado del servidor, de modo que los únicos datos almacenados en el lado del cliente sean la identificación de la sesión. Nuevamente, esto es independiente de cómo haya implementado el pasaporte, al pasaporte no le importa dónde se almacenan los datos de la sesión siempre que haya agregado soporte de sesión a su aplicación. Esta pregunta anterior sobre stackoverflow aborda cómo implementar Redis