我正在使用Easy Node Authentication: Setup and Local tutorial使用Passport.js构建身份验证系统。

我对passport.session()的功能感到困惑。

在使用了不同的中间件之后,我了解到express.session()是通过cookie向客户端发送 session ID的原因,但是我对passport.session()的功能以及除了express.session()之外为什么还需要它感到困惑。

这是我设置应用程序的方式:

//Server.js配置应用程序并设置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()充当中间件来更改req对象,并将当前作为 session ID的“user”值(来自客户端cookie)更改为真正的反序列化用户对象。

虽然其他答案也有一些好处,但我认为可以提供一些更具体的细节。

app.use(passport.session());

相当于
app.use(passport.authenticate('session'));

其中“ session ”指的是与passportJS bundle 在一起的以下策略。

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

特别是第59-60行:
var property = req._passport.instance._userProperty || 'user';
req[property] = user;

在本质上,它充当中间件并更改req对象中“user”属性的值以包含用户的反序列化身份。为了使它正常工作,您必须在自定义代码中包括serializeUserdeserializeUser函数。
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);
    });
});

这将从数据库中找到正确的用户,并将其作为闭包变量传递到回调done(err,user);中,以便passport.session()中的上述代码可以替换req对象中的“user”值,并传递到堆中的下一个中间件。

关于node.js - Passport.session()中间件有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22052258/

10-09 20:08
查看更多