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

我有一个ExpressJS应用程序,使用Passportjs与Facebook进行身份validation,一切都按预期工作exception的一个问题。

我有vehicle.js /routes/其中包含一些路由(router.gets和router.posts)需要身份validation和一些不。 如果用户login,则由vehicle.js处理的每个请求都将导致用户反序列化,这是一个Mongoose查找。 当请求发送到不需要身份validation的router.get和/或router.post ,如何避免这些不必要的Mongoose查找?

我已经查阅了这个SO问题 ,并没有解决我的问题(我已经宣布上面的静态资源护照,所以他们没有通过身份validation)。

app.js中的Passportconfiguration如下所示:

 // 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); 

以下是authentication在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'); } 

随后是一系列处理logging inlogging out以及在vehicle上的一些行动的routes

 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请求都会导致用户在用户login时反序列化?

 var vehicle = require('./routes/vehicle')(passport); 

避免这种不必要的反序列化的一种方法是将不需要authentication的路由从vehicle.js到不同的文件,并且不要将该护照对象传递给该文件(因为它被传递给app.js中的app.js )。 我不知道这是否是解决这个问题的正确方法。

您可以将护照中间件包装在自定义中间件中,该中间件只为您指定的路由调用它。 所以,而不是:

 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()) }); 

如果您使用passport.session()中间件,则反序列化将针对每个path发生: https : //github.com/jaredhanson/passport/blob/33075756a626999c6e2efc872b055e45ae434053/lib/strategies/session.js#L53-L69

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