Que fait le middleware passport.session ()?

Je construis un système d’authentification en utilisant Passport.js en utilisant ce tutoriel .

Je ne comprends pas ce que passe.sport ().

Après avoir joué avec les différents middlewares, j’ai compris qu’express.session () est ce qui envoie un identifiant de session sur les cookies au client, mais je ne comprends pas ce que le fichier passport.session () fait et pourquoi il est nécessaire en plus de express.session ().

Voici comment je configure mon application:

// Server.js configure l’application et configure le serveur 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() agit comme un middleware pour modifier l’object req et changer la valeur ‘user’ qui est actuellement l’ID de session (du cookie client) dans le véritable object utilisateur désérialisé.

Tandis que les autres réponses apportent de bons points, je pensais que des détails plus précis pourraient être fournis.

 app.use(passport.session()); 

est équivalent à

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

Où «session» fait référence à la stratégie suivante qui est fournie avec le passeport JS.

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

Spécifiquement les lignes 59-60:

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

Où il agit essentiellement comme un middleware et modifie la valeur de la propriété ‘user’ dans l’object req pour contenir l’identité désérialisée de l’utilisateur. Pour que cela fonctionne correctement, vous devez inclure les fonctions serializeUser et deserializeUser dans votre code personnalisé.

 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); }); }); 

Cela trouvera l’utilisateur correct dans la firebase database et le transmettra comme variable de fermeture dans le rappel done(err,user); Le code ci-dessus dans passport.session() peut donc remplacer la valeur “user” dans l’object req et passer au middleware suivant dans la stack.

Pendant que vous utiliserez PassportJs pour valider l’utilisateur dans le cadre de votre URL de connexion, vous aurez toujours besoin d’un mécanisme pour stocker ces informations utilisateur dans la session et les récupérer à chaque demande ultérieure (sérialiser / désérialiser l’utilisateur).

Donc, en effet, vous authentifiez l’utilisateur avec chaque requête, même si cette authentification n’a pas besoin de rechercher une firebase database ou un oauth comme dans la réponse de connexion. Donc, le passeport traitera également l’authentification de session comme une autre stratégie d’authentification.

Et pour utiliser cette stratégie – qui s’appelle session , utilisez simplement un raccourci simple – app.use(passport.session()) . Notez également que cette stratégie particulière impliquera que vous mettiez en œuvre des fonctions de sérialisation et de désérialisation pour des raisons évidentes.

Il authentifie simplement la session (qui est remplie par express.session() ). C’est équivalent à:

 passport.authenticate('session'); 

comme on peut le voir dans le code ici:

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

À partir de la documentation

Dans une application basée sur Connect ou Express, le middleware passport.initialize () est requirejs pour initialiser Passport. Si votre application utilise des sessions de connexion persistantes, le middleware passport.session () doit également être utilisé.

et

Sessions

Dans une application Web classique, les informations d’identification utilisées pour authentifier un utilisateur ne seront transmises que lors de la demande de connexion. Si l’authentification réussit, une session sera établie et maintenue via un cookie défini dans le navigateur de l’utilisateur.

Chaque demande ultérieure ne contiendra pas d’informations d’identification, mais plutôt le cookie unique qui identifie la session. Afin de prendre en charge les sessions de connexion, Passport va sérialiser et désérialiser les instances d’utilisateur de la session.

et

Notez que l’activation de la prise en charge de session est entièrement facultative, même si elle est recommandée pour la plupart des applications. Si activé, veillez à utiliser express.session () avant passport.session () pour vous assurer que la session de connexion est restaurée dans le bon ordre.