无法使用Passport.js和Express 4访问req.user

我一直在用Passport,Express 4和Jade创build应用程序。 我想向用户显示当他们login时更改的导航栏。

但是,我无法访问除configuration文件页面之外的任何其他页面的req.user,该页面调用isLoggedIn:

function isLoggedIn(req, res, next) { // if user is authenticated in the session, carry on if (req.isAuthenticated()) return next() // if they aren't redirect them to the home page res.redirect("/login") } 

使用任何其他函数在未login时不redirect用户将导致req.user undefined 。 我得到这样的用户:

 router.get("/profile", isLoggedIn, function(req, res) { res.render("profile", { title: 'Gebruikersprofiel van ' + req.user.firstname + " " + req.user.lastname, user: req.user // get the user out of session and pass to template }) }) 

而没有呼叫isLoggedIn(这是行不通的):

 router.get("/", function(req, res) { // serve index.html res.render("index", { title: 'Home', user: req.user, message: req.flash("message") }) }) 

isLoggedInmodule.exports = function(passport) { /* all routes */ } ,其余的(当然)在其中。

该应用程序的设置如下:

 var express = require("express"), bodyParser = require("body-parser"), mongodb = require("mongodb"), mongoose = require("mongoose"), uriUtil = require("mongodb-uri"), morgan = require("morgan"), cookieParser = require("cookie-parser"), session = require("express-session"), passport = require("passport"), flash = require("connect-flash"), ip = "okay", port = process.env.PORT || 80 require("./includes/passport")(passport) require("./includes/subject") require("./includes/user") var app = new express() app.disable("x-powered-by") app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })) app.use(morgan("dev")); // log every request to the console app.use(cookieParser()); // read cookies (needed for auth) // required for passport app.use(session({ secret: "yep" })); // session secret app.use(passport.initialize()); app.use(passport.session()); // persistent login sessions app.use(flash()); // use connect-flash for flash messages stored in session app.set("view engine", "jade") app.use(express.static(__dirname + "/views")) /** * CORS support. */ //skipped //Database setup skipped /** * App setup */ // make our db accessible to our router - globals app.use(function(req, res, next) { req.db = db next() }) var api = require("./routes/api")(passport), web = require("./routes/web")(passport) // /api for api routes and / for web routes app.use("/api", api) app.use("/", web) //Error handling skipped // fire in the hole! app.listen(port, ip, function() { console.log("Listening on port " + port) }) 

我已经尝试了各种各样的东西,包括在app.js中添加中间件以将用户添加到res.locals.user,但到目前为止,还没有人为我工作。

我究竟做错了什么?

编辑 :我没有看到很多人提到它,但StormPath也许是一个更好的解决scheme?

编辑2 :我现在正在使用Stormpath,但仍然乐意采取如何解决这个问题,如果有人有任何build议。

编辑3 :我已经得到了一些请求来查看(de)serializeUser函数。 他们如下:

 // used to serialize the user for the session passport.serializeUser(function(user, done) { done(null, user._id); }); // used to deserialize the user passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); 

我已经解决了这个问题。 这是我的方式链接我的网站,这使得它开始一个新的会议从configuration文件页到网站的其余部分的方式。

答案可以在这里find: https : //stackoverflow.com/a/27314240/1218007