node.js - passport.session()中间件做什么?

我正在使用Passport.js使用简易节点身份验证:安装和本地教程构建身份验证系统。

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

在使用不同的中间件后,我开始明白express.session()是通过cookie向客户端发送会话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);
4个解决方案
93 votes

done(err,user);充当中间件以更改req对象并更改用户' 当前会话ID(从客户端cookie)到真正的反序列化用户对象的值。

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

app.use(passport.session());

相当于

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

在哪里'会话#39; 指的是与护照JS捆绑在一起的以下策略。

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

特别是第59-60行:

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

它本质上充当中间件并改变用户'的价值。 req对象中的属性,用于包含用户的反序列化标识。 要使其正常工作,您必须在自定义代码中包含done(err,user);passport.session()函数。

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

lindsaymacvean answered 2019-08-10T20:39:41Z
11 votes

从文档中

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

会议

在典型的Web应用程序中,用于验证a的凭据   用户只能在登录请求期间传输。 如果   验证成功后,将建立并维护会话   通过在用户浏览器中设置的cookie。

每个后续请求都不包含凭据,而是包含凭据   标识会话的唯一cookie。 为了支持登录   会话,Passport将序列化和反序列化用户实例   并从会议。

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

Josh C. answered 2019-08-10T20:40:35Z
10 votes

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

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

并使用此策略 - 名为session,只需使用一个简单的快捷方式 - app.use(passport.session()).另请注意,此特定策略将要求您实现序列化和反序列化功能,原因很明显。

uniwalker answered 2019-08-10T20:41:17Z
9 votes

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

passport.authenticate('session');

在这里的代码中可以看到:

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

Jared Hanson answered 2019-08-10T20:41:57Z
translate from https://stackoverflow.com:/questions/22052258/what-does-passport-session-middleware-do