首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >passport.session()中间件做什么?

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

Stack Overflow用户
提问于 2014-02-27 04:14:07
回答 3查看 96.8K关注 0票数 147

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

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

在尝试了不同的中间件之后,我开始理解express.session()是通过cookies向客户机发送会话ID的工具,但我对passport.session()的作用以及除了express.session()之外为什么还需要它感到困惑。

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

// Server.js配置应用程序并设置sets服务器

代码语言:javascript
复制
//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);
EN

回答 3

Stack Overflow用户

发布于 2015-03-12 01:59:44

passport.session()充当中间件来更改请求对象,并将当前为会话id的“用户”值(来自客户端cookie)更改为真正的反序列化用户对象。

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

代码语言:javascript
复制
app.use(passport.session());

等同于

代码语言:javascript
复制
app.use(passport.authenticate('session'));

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

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

以及在撰写本文时指向以下行的permalink

代码语言:javascript
复制
var property = req._passport.instance._userProperty || 'user';
req[property] = user;

其中它实质上充当中间件,并且改变请求对象中的' user‘属性的值以包含用户的反序列化身份。要使其正常工作,必须在自定义代码中包含serializeUserdeserializeUser函数。

代码语言:javascript
复制
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‘值,并传递给堆中的下一个中间件。

票数 169
EN

Stack Overflow用户

发布于 2014-02-27 07:58:05

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

代码语言:javascript
复制
passport.authenticate('session');

在下面的代码中可以看到:

https://github.com/jaredhanson/passport/blob/42ff63c/lib/authenticator.js#L233

票数 12
EN

Stack Overflow用户

发布于 2014-10-17 01:31:55

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

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

要使用这个名为session的策略,只需使用一个简单的快捷方式- app.use(passport.session())。另请注意,由于显而易见的原因,此特定策略将要求您实现序列化和反序列化函数。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22052258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档