Passport.js不传递用户请求在req.login()

我的passport.jsconfiguration如下所示:

const Local = require("passport-local").Strategy; const USMODEL = require("../models/user.js"); passport.serializeUser(function(user, done) { console.log("SERIALIZING USER"); done(null, user.id); }); passport.deserializeUser(function(id, done) { console.log("DESUSER", id); var US = mongoose.model("RegUser", USMODEL); US.findById(id, function(err, user) { done(err, id); }); }); passport.use("local-login", new Local({ usernameField: "email", passwordField: "password", passReqToCallback: true },function(req, email, password, done) { var US = mongoose.model("RegUser", USMODEL); US.findOne({"email": email}, function(err, user){ if(err) throw err; if(!user) return done(null, false); if(!user.validPassword(password)) { console.log("password not valid"); return done(null, false); } return done(null, user); }); })); 

我正在改变每个函数中的mongoose模型,因为我一次可以处理多个集合,而且我喜欢完全控制正在发生的事情。

我的router.js文件具有以下使用护照中间件的path:

 app.get("/user/login", function(req, res) { res.render("signin"); }); app.post('/user/login', function (req, res){ passport.authenticate('local-login', function(err, user, info){ if (err) return res.redirect("/"); if (!user) return res.redirect('/'); else { req.login(user, function(err) { if (err) return next(err); console.log("Request Login supossedly successful."); return res.redirect('/admin/filter'); }); } })(req, res); }); 

其中,成功的身份validation后,redirect到/ admin /filter在同样的路由器,就这样。

 app.get("/admin/filter", isLoggedIn, function(req, res){ //rendering stuff here }); 

现在,pipe理员/filter请求会通过名为isLoggedIn的中间件,理论上保护我的端点。 它是这样的:

 function isLoggedIn(req, res, next) { console.log("This is the authentication middleware, is req authenticated?"); console.log(req.isAuthenticated()); console.log("Does req.user exist?") console.log(req.user); return next(); } 

现在,你会期望,因为我叫req.login,我被redirect到我select的端点,请求将被authentication。 不是这种情况。

 Request Login supossedly successful. This is the authentication middleware, is req authenticated? false Does req.user exist? undefined 

我似乎无法find我的问题的来源。 所有东西都会在调用策略时检查出来,以及callback函数和req.login ,它们在理论上会呈现一个包含数据的req.user对象。 我观察到的一件奇怪的事情是,我没有看到passport.deserializeUser()方法正在运行。 永远。 但是,这可能是问题的切线。 护照肯定是使用我的策略和渲染一个用户对象,但不知何故这个相同的对象不会进入请求。 你有什么build议或想法是怎么回事?

我在第一次学习如何使用Passport中间件的时候,通过跟我开始的教程解决了这个问题。 原来我在做configuration错误:我的代码曾经是这样在服务器文件中:

 pass = require("passport"); app.use(pass.initialize()); app.use(pass.session()); require("./app/config/passport.js")(pass); 

当它应该是这样的:

 pass = require("passport"); require("./app/config/passport.js")(pass); app.use(pass.initialize()); app.use(pass.session()); 

要么我错过了文档中指定的configuration必须在初始化之前出现的部分,或者只是简单地将其写成小事来说明。 无论哪种方式,我解决了我的问题。