Не удалось получить доступ к req.user с помощью Passport.js и Express 4

Я создаю приложение с Passport, Express 4 и Jade. Я хотел бы показать пользователю навигационную панель, которая изменяется при входе в систему.

Однако я не могу получить доступ к 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")
}

Использование любой другой функции, чтобы не перенаправлять пользователя, когда не регистрировались в результатах, в 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") 
    })
})

isLoggedIn находится вне module.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 может быть лучше решение?

Изменить 2. Я использую Stormpath на данный момент, но все равно с удовольствием возьму предложение о том, как это решить, если у кого-то есть.

Изменить 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);
    });
});

Ответ 1

Я решил проблему. Именно так я связал страницы своего сайта, что заставило его начать новый сеанс со страницы профиля на остальной части сайта.

Ответ можно найти здесь: fooobar.com/info/26164/...