web-dev-qa-db-fra.com

Que fait le middleware passport.session ()?

Je construis un système d'authentification à l'aide de Passport.js à l'aide de Facile Node Authentification: tutoriel d'installation et local) .

Je suis confus à propos de ce que fait passport.session().

Après avoir joué avec les différents middleware, je me suis rendu compte que express.session() est ce qui envoie un identifiant de session via des cookies au client, mais je ne comprends pas ce que passport.session() fait et pourquoi. requis en plus de express.session().

Voici comment j'ai configuré 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);
103
Georges Krinker

passport.session() agit en tant que middleware pour modifier l'objet req et modifier la valeur "utilisateur" qui est actuellement l'identifiant de session (du cookie client) en véritable objet utilisateur désérialisé.

Tandis que les autres réponses font ressortir de bons arguments, j’ai pensé que des détails plus spécifiques pourraient être fournis.

app.use(passport.session());

est équivalent à

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

Où "session" fait référence à la stratégie suivante fournie avec passportJS.

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

Plus précisément 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é 'utilisateur' dans l'objet 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(user.id, function (err, user) {
        done(err, user);
    });
});

Ceci trouvera le bon utilisateur dans la base de données et le passera comme variable de fermeture dans le callback done(err,user); afin que le code ci-dessus dans le passport.session() puisse remplacer la valeur "utilisateur" dans l'objet req et passé sur le middleware suivant dans la pile.

106
lindsaymacvean

De la documentation

Dans une application Connect ou Express, le middleware passport.initialize () est requis 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 typique, 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 les informations d'identification, mais plutôt le cookie unique qui identifie la session. Afin de prendre en charge les sessions de connexion, Passport sérialise et désérialise les instances utilisateur vers et depuis la session.

et

Notez que l'activation du support de session est entièrement facultative, bien que cela soit recommandé pour la plupart des applications. Si cette option est activée, assurez-vous d'utiliser express.session () avant passport.session () pour vous assurer que la session de connexion est restaurée dans le bon ordre.

13
Josh C.

Bien que vous utilisiez PassportJs pour valider l'utilisateur en tant qu'élément de votre URL de connexion, vous avez toujours besoin d'un mécanisme permettant de stocker ces informations utilisateur dans la session et de les récupérer à chaque demande ultérieure (par exemple, sérialiser/désérialiser l'utilisateur). .

Donc, en réalité, vous authentifiez l'utilisateur à chaque demande, même si cette authentification n'a pas besoin de rechercher une base de données ou oauth comme dans la réponse de connexion. Donc, Passport traitera également l'authentification de session une autre stratégie d'authentification.

Et pour utiliser cette stratégie - nommée session, utilisez un simple raccourci - app.use(passport.session()). Notez également que cette stratégie particulière vous demandera d'implémenter des fonctions de sérialisation et de désérialisation pour des raisons évidentes.

10
uniwalker

Il authentifie simplement la session (qui est remplie par express.session()). Cela équivaut à:

passport.authenticate('session');

comme on peut le voir dans le code ici:

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

9
Jared Hanson