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

我正在使用 Passport.js 构建一个使用 轻松节点身份验证: 安装和本地教程的身份验证系统。

我对 passport.session()的作用感到困惑。

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

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

//Server.js 配置应用程序并设置 webserver

//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);
109150 次浏览

来自 文件

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

还有

会议

在典型的 Web 应用程序中,用于验证 用户将只在登录请求期间进行传输 身份验证成功后,将建立并维护一个会话 通过用户浏览器中的 cookie 设置。

每个后续请求将不包含凭据,而是包含 标识会话的唯一 Cookie 会话时,Passport 将序列化和反序列化用户实例 从会议开始。

还有

请注意,启用会话支持是完全可选的,尽管它是可选的 建议大多数应用程序。如果启用,一定要使用 Session () ,以确保登录 会话以正确的顺序还原。

它只是对会话进行身份验证(由 express.session()填充):

passport.authenticate('session');

从这里的代码可以看出:

Https://github.com/jaredhanson/passport/blob/42ff63c/lib/authenticator.js#l233

虽然您将使用 PassportJs作为您的登录 URL 的一部分来验证用户,但是您仍然需要一些机制来在会话中存储这个用户信息,并在每个后续请求(即序列化/反序列化用户)中检索它。

因此实际上,您正在用每个请求对用户进行身份验证,即使这种身份验证不需要像在登录响应中那样查找数据库或誓言。因此,“护照”将会把会话身份验证视为另一种身份验证策略。

要使用这个名为 session的策略,只需使用一个简单的快捷键 app.use(passport.session())。还要注意,这个特定的策略希望您实现序列化和反序列化函数,原因显而易见。

passport.session()充当中间件,用于修改 req 对象,并将当前的会话 ID (来自客户机 cookie)的‘ user’值更改为真正的反序列化用户对象。

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

app.use(passport.session());

相当于

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

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

下面是这个文件的链接: Https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js

以及一个 永久链接,指向本文写作时的下列行:

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”值,并将其传递给堆中的下一个中间件。