ExpressJs Passportjs为每个路由请求反序列化用户对象

时间:2015-12-14 22:24:46

标签: javascript node.js express passport.js passport-facebook

我有一个ExpressJS应用程序正在使用Passportjs对Facebook进行身份验证,并且所有内容都按预期异常处理一个问题。

我在vehicle.js下面有/routes/,其中包含一些需要身份验证的路由(router.gets和router.posts),而另一些则不需要身份验证。如果用户已登录,则vehicle.js处理的每个请求都会导致用户反序列化,这是Mongoose查找。 当向不需要身份验证的Mongoose和/或router.get发出请求时,如何避免这些不必要的router.post次查找?

我已经查找了这个SO question并且它没有解决我的问题(我已经在护照上面声明了静态资源,因此它们未经过身份验证)。

Passport中的{p> app.js个配置如下所示:

// Configuring Passport
var passport = require('passport');
var expressSession = require('express-session');

app.use(expressSession({secret: 'thisIsSecret'}));
app.use(passport.initialize());
app.use(passport.session());

// Using the flash middleware provided by connect-flash to store messages in session
// and displaying in templates
var flash = require('connect-flash');
app.use(flash());

// Initialize Passport
var initPassport = require('./passport/init');
initPassport(passport);

//passing passport object could be the reason why all requested that are 
//mapped in vehicle cause user de-serialization. Not sure if there is any
//alternative approach than following line that passes passport??
var vehicle = require('./routes/vehicle')(passport);

以下isAuthenticated位于vehicle.js

var isAuthenticated = function (req, res, next) {
  if (req.isAuthenticated())
    return next();
    // if the user is not authenticated then redirect him to the login page
    res.redirect('/vehicle/api/login');
}

其后是一系列处理routeslogging in的{​​{1}},以及logging out上的一些操作。

vehicle

是否因为以下行导致用户登录时对module.exports = function(passport) { router.get('/api/login', function(req, res) { res.render('vehicle/login', { message: req.flash('message') }); }); router.post('/api/login', passport.authenticate('login', { successRedirect: '/vehicle/api/list/mine', failureRedirect: '/vehicle/api/list', failureFlash : true })); ... ... ... router.post('/api/upload', isAuthenticated, function(req, res) { //this route needs to be authenticated, so it works fine, //deserialization done, mongoose lookup, no problem }); router.get('/api/image/:vehicleId/:filename', function(req,res) { //this route does not need authentication, but causes User //de-serialization and Mongoose lookup }); return router; } 的每个请求都会导致用户反序列化?

vehicle.js

避免这种不必要的反序列化的一种方法是将不需要身份验证的路由从var vehicle = require('./routes/vehicle')(passport); 分隔到不同的文件,并且不将该护照对象传递给该文件(因为它传递给{{在vehicle.js)中的1}}。我不知道这是否是解决此问题的正确方法。

2 个答案:

答案 0 :(得分:2)

您可以将护照中间件包装在自定义中间件中,该中间件仅针对您指定的路由调用它。所以不要:

app.use(passport.session());
你可以:

app.use(function(req, res, next){
  if(req.url.match('api/image'))
    next(); // do not invoke passport
  else
    passport.session()(req, res, next)
    // same as doing == app.use(passport.session())
});

答案 1 :(得分:0)

如果您使用passport.session()中间件,则会对每个路由进行反序列化: https://github.com/jaredhanson/passport/blob/33075756a626999c6e2efc872b055e45ae434053/lib/strategies/session.js#L53-L69

解决方案是将其仅添加到使用护照的人。