PassportJS serializeUser y deserializeUser flujo de ejecución

Estoy usando passportJS con Express para autenticar al usuario por la estrategia local. He visto algunos artículos sobre cómo se configura el pasaporte y el flujo de ejecución. Aunque la mayoría de las cosas relacionadas con el pasaporte pueden resolverse mediante la búsqueda, hay una serialización y deserialización del usuario que me confunde.

Entiendo que se usa para guardar la información del usuario en la sesión para un inicio de sesión persistente. Mi código de serialización y deserialización es

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

Mi pregunta con respecto a esto

1) ¿Quién llama y rellena los argumentos de serializeUser y deserializeUser? ¿Y cómo tiene acceso al objeto de usuario? Para entender esto agregué log como

  passport.serializeUser(function(user, done){ console.log(arguments.callee.caller); done(null, user.id); }); 

Y tengo [Función: pasar] en la salida ¿Alguien puede explicar esto?

2) Estoy usando mongodb para almacenar la información del usuario. MongoDB tiene _id como el ID predeterminado del documento. Así que, idealmente, el serializeUser y deserializeUser deberían haber trabajado con user._id en lugar de user.id. Pero funciona bien con user.id, que no está disponible en User the object. Aquí está el objeto de usuario impreso en consola

 { _id: 5505f231b810dbd4098ac76a, __v: 0, google: {}, twitter: {}, facebook: {}, local: { password: '$2a$08$9NGd0xNu0JbWMZ07ufyFRu8guwy147k8IBl5cAC4Y8APOuxreNI32', email: '[email protected]' } } 

¿Cómo es esto posible?

3) ¿A dónde va la ejecución del flujo de control una vez que se ejecuta el método?

Después de mucho tiempo de búsqueda, encontré este artículo que explica el flujo de autenticación muy claramente.

  • Para serializeUser:
  1. Cuando el usuario envía el formulario de inicio de sesión, se realiza una solicitud POST para / inicio de sesión que resulta en la ejecución del middleware passport.authenticate que hemos configurado.
  2. Como el middleware de autenticación para esa ruta está configurado para manejar la estrategia local, el pasaporte invocará nuestra implementación de la estrategia local.
  3. Passport toma el req.body.username y req.body.password y lo pasa a nuestra función de verificación en la estrategia local.
  4. Ahora hacemos lo nuestro: cargar al usuario desde la base de datos y verificar si la contraseña dada coincide con la de la base de datos.
  5. Si todo salió bien y queremos que el usuario inicie sesión, invocamos “hecho” (nulo, usuario).
  6. Las llamadas realizadas harán que el flujo vuelva a passport.authenticate . Ha pasado el error, el usuario y el objeto de información adicional (si está definido).
  7. Si el usuario fue aprobado, el middleware llamará req.login (una función de pasaporte adjunta a la solicitud).
  8. Esto llamará a nuestro método passport.serializeUser que hemos definido anteriormente.
  • Para deserializeUser:
  1. Express carga los datos de la sesión y los adjunta a la req. Como pasaporte almacena el usuario serializado en la sesión.
  2. passport.session middleware es una estrategia de pasaporte que cargará el objeto de usuario en req.user si se encontró un objeto de usuario serializado en el servidor.
  3. passport.initialize se invoca en la solicitud, encuentra el passport.user adjunto a la sesión. A continuación, se invoca passport.session .
  4. El middleware passport.session llama a passport.deserializeUser que hemos configurado. Adjuntar el objeto de usuario cargado a la solicitud como req.user.

Espero que ayude.

Ya que está utilizando PassportJS, supongo que debe tener alguna idea sobre cómo funciona. Así que añadiría más información que creo que despejaría su duda.

La configuración del pasaporte consta de tres piezas:

  1. Estrategias de autentificación
  2. Aplicación de middleware
  3. Sesiones

La respuesta a tu pregunta se encuentra en la tercera pieza, sesiones.

Si la autenticación se realiza correctamente, se establecerá y mantendrá una sesión a través de un conjunto de cookies en el navegador del usuario. Cada solicitud posterior no contendrá credenciales, sino la cookie única que identifica la sesión. Para admitir las sesiones de inicio de sesión, Passport serializará y deserializará user instancias de los user hacia y desde la sesión.

De acuerdo con su implementación, solo el ID de usuario se serializa a la sesión, manteniendo pequeña la cantidad de datos almacenados dentro de la sesión. Cuando se reciben solicitudes posteriores, esta identificación se usa para encontrar al usuario, que se restaurará a req.user

En los pasaportes se nos da la opción de escribir nuestra propia lógica de serialización y deserialización para que podamos elegir cualquier base de datos adecuada y no atada a reglas estrictas.

Entonces, para resumir, después de una autenticación exitosa, el objeto de usuario se serializa y almacena en sesión, si llama a req.user , entonces podrá recuperar el mismo objeto de usuario.