我正在使用Easy Node Authentication: Setup and Local tutorial使用Passport.js构建身份验证系统。
我对passport.session()
的所作所为感到困惑。
在使用不同的中间件后,我开始明白express.session()
是通过cookie向客户端发送会话ID的内容,但我对passport.session()
做了什么以及为什么需要它感到困惑除了express.session()
。
以下是我设置应用程序的方法:
// Server.js配置应用程序并设置网络服务器
//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);
答案 0 :(得分:99)
passport.session()
充当中间件,用于更改req对象并将当前为会话ID的“用户”值(从客户端cookie)更改为真正的反序列化用户对象。
虽然其他答案提出了一些好处,但我认为可以提供一些更具体的细节。
app.use(passport.session());
相当于
app.use(passport.authenticate('session'));
其中'session'是指与passportJS捆绑在一起的以下策略。
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'属性的值以包含用户的反序列化标识。要使其正常运行,您必须在自定义代码中加入serializeUser
和deserializeUser
个函数。
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'值,传递到堆中的下一个中间件。
答案 1 :(得分:12)
在基于Connect或Express的应用程序中,passport.initialize() 中间件需要初始化Passport。如果你的申请 使用持久登录会话,passport.session()中间件必须 也可以使用。
和
会话
在典型的Web应用程序中,用于验证a的凭据 用户只能在登录请求期间传输。如果 验证成功后,将建立并维护会话 通过在用户浏览器中设置的cookie。
每个后续请求都不包含凭据,而是包含凭据 标识会话的唯一cookie。为了支持登录 会话,Passport将序列化和反序列化用户实例 并从会议。
和
请注意,启用会话支持完全是可选的,尽管它是 推荐用于大多数应用。如果启用,请务必使用 express.session()在passport.session()之前确保登录 会话以正确的顺序恢复。
答案 2 :(得分:10)
虽然您将使用PassportJs
验证用户作为登录URL的一部分,但仍需要一些机制将此用户信息存储在会话中,并在每次后续请求时检索它(即序列化/反序列化用户)。
因此,实际上,您正在使用每个请求对用户进行身份验证,即使此身份验证不需要像登录响应中那样查找数据库或oauth。因此,护照也会将会话身份验证视为另一种身份验证策略。
要使用此策略(名为session
),只需使用简单的快捷方式 - app.use(passport.session())
即可。另请注意,由于显而易见的原因,此特定策略将要求您实现序列化和反序列化函数。
答案 3 :(得分:9)
它只是对会话进行身份验证(由express.session()
填充)。它相当于:
passport.authenticate('session');
可以在这里的代码中看到:
https://github.com/jaredhanson/passport/blob/master/lib/authenticator.js#L236