passport.session()中间件是做什么的?

我正在使用本教程构build一个使用Passport.js的身份validation系统。

我对passport.session()做了什么感到困惑。

玩过不同的中间件之后,我明白了express.session()是通过cookie向客户端发送会话ID的,但是我对passport.session()做了什么以及为什么需要除了express.session()。

以下是我如何设置我的应用程序:

// Server.jsconfiguration应用程序并设置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对象,并将当前会话ID(从客户端cookie)的“user”值更改为真正的反序列化的用户对象。

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

 app.use(passport.session()); 

相当于

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

“会话”是指与passportJS捆绑在一起的以下策略。

jaredhanson/passport/blob/master/lib/strategies/session.html

具体行59-60:

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

它本质上充当中间件,并改变req对象中'用户'属性的值以包含用户的反序列化身份。 为了使这个工作正常,你必须在你的自定义代码中包含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(id, function (err, user) { done(err, user); }); }); 

这将从数据库中find正确的用户,并将其作为闭包variables传递给callbackdone(err,user); 所以passport.session()的上述代码可以replacereq对象中的'user'值,并传递给堆中的下一个中间件。

虽然您将使用PassportJs来validation用户是否为loginURL的一部分,但您仍然需要一些机制来将此用户信息存储在会话中,并在随后的每个请求(即序列化/反序列化用户)中检索它。

所以实际上,即使这个authentication不需要在login响应中查找数据库或者oauth,你也可以用每个请求来authentication用户。 因此,护照将会话authentication也视为另一种authentication策略。

为了使用这个名为session策略,只需使用一个简单的快捷方式app.use(passport.session()) 。 还要注意,这个特定的策略会要求你实现序列化和反序列化的function,这是显而易见的。

从文档

在Connect或基于Express的应用程序中,需要passport.initialize()中间件来初始化Passport。 如果您的应用程序使用持久login会话,则还必须使用passport.session()中间件。

会议

在典型的Web应用程序中,仅在login请求期间传输用于authentication用户的凭证。 如果validation成功,会话将通过在用户浏览器中设置的cookie来build立和维护。

每个后续请求将不包含凭据,而是标识会话的唯一Cookie。 为了支持login会话,Passport将序列化和反序列化会话中的用户实例。

请注意,启用会话支持完全是可选的,尽pipe它对于大多数应用程序是推荐的。 如果启用,请务必在passport.session()之前使用express.session(),以确保login会话以正确的顺序恢复。

它只是validation会话(由express.session()填充)。 这相当于:

 passport.authenticate('session'); 

从这里的代码可以看出:

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