wake-up-neo.com

Was macht passport.session () Middleware?

Ich baue ein Authentifizierungssystem mit Passport.js mit Easy Node Authentication: Setup and Local tutorial .

Ich bin verwirrt darüber, was passport.session() tut.

Nachdem ich mit der verschiedenen Middleware herumgespielt hatte, wurde mir klar, dass express.session() eine Sitzungs-ID über Cookies an den Client sendet, aber ich bin verwirrt darüber, was passport.session() tut und warum zusätzlich zu express.session() erforderlich.

So richte ich meine Anwendung ein:

// Server.js konfiguriert die Anwendung und richtet den Webserver ein

//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() fungiert als Middleware zum Ändern des req-Objekts und zum Ändern des 'user'-Werts, der derzeit die Sitzungs-ID (vom Client-Cookie) ist, in das echte deserialisierte Benutzerobjekt.

Während die anderen Antworten einige gute Punkte machen, dachte ich, dass einige spezifischere Details zur Verfügung gestellt werden könnten.

app.use(passport.session());

ist äquivalent zu

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

Dabei bezieht sich 'Sitzung' auf die folgende Strategie, die mit passportJS gebündelt ist.

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

Speziell Linien 59-60:

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

Wenn es im Wesentlichen als Middleware fungiert und den Wert der Eigenschaft 'user' im req-Objekt so ändert, dass es die deserialisierte Identität des Benutzers enthält. Damit dies ordnungsgemäß funktioniert, müssen Sie die Funktionen serializeUser und deserializeUser in Ihren benutzerdefinierten Code aufnehmen.

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

Dies findet den richtigen Benutzer aus der Datenbank und übergibt ihn als Abschlussvariable an den Rückruf done(err,user);, sodass der obige Code in passport.session() den Wert 'user' im req-Objekt ersetzen kann und weiter zur nächsten Middleware im Stapel.

106
lindsaymacvean

Aus der Dokumentation

In einer Connect- oder Express-basierten Anwendung ist die Middleware passport.initialize () erforderlich, um Passport zu initialisieren. Wenn Ihre Anwendung permanente Anmeldesitzungen verwendet, muss auch die Middleware passport.session () verwendet werden.

und

Sitzungen

In einer typischen Webanwendung werden die zur Authentifizierung eines Benutzers verwendeten Anmeldeinformationen nur während der Anmeldeanforderung übertragen. Wenn die Authentifizierung erfolgreich ist, wird eine Sitzung über ein Cookie im Browser des Benutzers eingerichtet und verwaltet.

Jede nachfolgende Anforderung enthält keine Anmeldeinformationen, sondern das eindeutige Cookie, das die Sitzung identifiziert. Um Anmeldesitzungen zu unterstützen, serialisiert und deserialisiert Passport Benutzerinstanzen zu und von der Sitzung.

und

Beachten Sie, dass das Aktivieren der Sitzungsunterstützung völlig optional ist, obwohl dies für die meisten Anwendungen empfohlen wird. Wenn aktiviert, stellen Sie sicher, dass Sie express.session () vor passport.session () verwenden, um sicherzustellen, dass die Anmeldesitzung in der richtigen Reihenfolge wiederhergestellt wird.

13
Josh C.

Während Sie PassportJs verwenden, um den Benutzer als Teil Ihrer Anmelde-URL zu validieren, benötigen Sie noch einen Mechanismus, um diese Benutzerinformationen in der Sitzung zu speichern und bei jeder nachfolgenden Anforderung abzurufen (dh den Benutzer zu serialisieren/zu deserialisieren). .

Tatsächlich authentifizieren Sie den Benutzer also bei jeder Anforderung, obwohl diese Authentifizierung keine Datenbank oder oauth wie in der Anmeldeantwort) nachschlagen muss. Passport behandelt daher die Sitzungsauthentifizierung auch noch eine andere Authentifizierungsstrategie.

Und um diese Strategie zu verwenden, die session heißt, verwenden Sie einfach eine einfache Verknüpfung - app.use(passport.session()). Beachten Sie auch, dass Sie bei dieser speziellen Strategie aus offensichtlichen Gründen Funktionen zum Serialisieren und Deserialisieren implementieren müssen.

10
uniwalker

Es authentifiziert einfach die Sitzung (die mit express.session() gefüllt ist). Es ist äquivalent zu:

passport.authenticate('session');

wie im code hier zu sehen ist:

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

9
Jared Hanson