¿Qué hace el middleware passport.session ()?

Estoy creando un sistema de autenticación usando Passport.js usando este tutorial .

Estoy confundido acerca de lo que hace passport.session ()

Después de jugar con el middleware diferente, llegué a comprender que express.session () es lo que envía un ID de sesión a través de cookies al cliente, pero estoy confundido acerca de lo que hace passport.session () y por qué se requiere además de express.session ().

Así es como configuro mi aplicación:

// Server.js configura la aplicación y configura el servidor web

//importing our modules var express = require('express'); var app = express(); var port = process.env.PORT || 8080; var mongoose = require('mongoose'); var passport = require('passport'); var flash = require('connect-flash'); var configDB = require('./config/database.js'); //Configuration of Databse and App mongoose.connect(configDB.url); //connect to our database require('./config/passport')(passport); //pass passport for configuration app.configure(function() { //set up our express application app.use(express.logger('dev')); //log every request to the console app.use(express.cookieParser()); //read cookies (needed for auth) app.use(express.bodyParser()); //get info from html forms app.set('view engine', 'ejs'); //set up ejs for templating //configuration for passport app.use(express.session({ secret: 'olhosvermelhoseasenhaclassica', maxAge:null })); //session secret app.use(passport.initialize()); app.use(passport.session()); //persistent login session app.use(flash()); //use connect-flash for flash messages stored in session }); //Set up routes require('./app/routes.js')(app, passport); //launch app.listen(port); console.log("Server listening on port" + port); 

passport.session() actúa como un middleware para alterar el objeto requerido y cambiar el valor de “usuario” que actualmente es el ID de sesión (de la cookie del cliente) en el objeto de usuario deserializado verdadero.

Mientras que las otras respuestas hacen algunos puntos buenos, pensé que se podrían proporcionar algunos detalles más específicos.

 app.use(passport.session()); 

es equivalente a

 app.use(passport.authenticate('session')); 

Donde ‘sesión’ se refiere a la siguiente estrategia que se incluye con passportJS.

https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js

Específicamente las líneas 59-60:

 var property = req._passport.instance._userProperty || 'user'; req[property] = user; 

Cuando actúa esencialmente como un middleware y altera el valor de la propiedad ‘user’ en el objeto req para que contenga la identidad deserializada del usuario. Para que esto funcione correctamente, debe incluir las funciones serializeUser y deserializeUser en su código personalizado.

 passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (user, done) { //If using Mongoose with MongoDB; if other you will need JS specific to that schema User.findById(id, function (err, user) { done(err, user); }); }); 

Esto buscará al usuario correcto de la base de datos y lo pasará como una variable de cierre a la callback done(err,user); por lo tanto, el código anterior en passport.session() puede reemplazar el valor de “usuario” en el objeto req y pasar al siguiente middleware en la stack.

Mientras utilizará PassportJs para validar al usuario como parte de su URL de inicio de sesión, aún necesitará algún mecanismo para almacenar esta información del usuario en la sesión y recuperarla con cada solicitud posterior (es decir, serializar / deserializar al usuario).

Entonces, en efecto, está autentificando al usuario con cada solicitud, aunque esta autenticación no necesita buscar una base de datos o una cuenta como en la respuesta de inicio de sesión. Así que el pasaporte tratará la autenticación de sesión también como otra estrategia de autenticación.

Y para usar esta estrategia, que se denomina session , solo use un atajo simple – app.use(passport.session()) . También tenga en cuenta que esta estrategia en particular querrá que implemente funciones de serialización y deserialización por razones obvias.

De la documentación

En una aplicación basada en Connect o Express, se requiere el middleware passport.initialize () para inicializar Passport. Si su aplicación utiliza sesiones de inicio de sesión persistentes, también se debe usar el middleware passport.session ().

y

Sesiones

En una aplicación web típica, las credenciales utilizadas para autenticar a un usuario solo se transmitirán durante la solicitud de inicio de sesión. 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á las instancias de los usuarios hacia y desde la sesión.

y

Tenga en cuenta que habilitar el soporte de sesión es completamente opcional, aunque se recomienda para la mayoría de las aplicaciones. Si está habilitado, asegúrese de usar express.session () antes de passport.session () para asegurarse de que la sesión de inicio de sesión se restaure en el orden correcto.

Simplemente autentica la sesión (que se llena con express.session() ). Es equivalente a:

 passport.authenticate('session'); 

Como se puede ver en el código aquí:

https://github.com/jaredhanson/passport/blob/master/lib/authenticator.js#L236

    Intereting Posts