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

Posted

技术标签:

【中文标题】无法使用 Passport.js 和 Express 4 访问 req.user【英文标题】:Unable to access req.user with Passport.js and Express 4 【发布时间】:2015-01-28 18:28:56 【问题描述】:

我一直在使用 Passport、Express 4 和 Jade 创建一个应用程序。我想向用户展示一个在他们登录时会发生变化的导航栏。

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

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") 
    )
)

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 可能是一个更好的解决方案吗?

编辑 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);
    );
);

【问题讨论】:

你试过在app.use(passport.session());之后调用require("./includes/passport")(passport)吗? 我刚试过,没用。我看到的是用户没有被反序列化,每个页面只能访问从该页面重定向登录的用户(因此每页登录似乎有效,但当然不是我想要的方式) . 【参考方案1】:

我已经解决了这个问题。这是我链接网站页面的方式,这使它从个人资料页面开始新会话到网站的其余部分。

答案可以在这里找到: https://***.com/a/27314240/1218007

【讨论】:

以上是关于无法使用 Passport.js 和 Express 4 访问 req.user的主要内容,如果未能解决你的问题,请参考以下文章

Passport js 无法跨域维护会话

如何正确使用 Passport.js?

Passport.js 多重登录系统无法正常工作

passport.js 中的 Date.now 无法完成

Passport.js:无法将用户序列化到会话中(已经添加了序列化代码)?

passport.js 中的多个模型