Passport.js身份验证后,Express.js无法正确路由

时间:2016-11-17 00:47:31

标签: javascript node.js express routing passport.js

我使用Passport.js进行了相当简单的身份验证设置。一旦用户通过身份验证,我就会将其重定向到/ work,就像这样。

app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/work',
        failureRedirect: '/login',
        failureFlash: true
    })
);

整个身份验证过程正常。意思是,该程序将拒绝任何不正确的用户/密码组合等。真正的问题是我的程序重定向到/工作。

如上所示,successRedirect应将其重定向到/ work。我有中间件来检查用户是否已登录,如下所示:

function loggedIn(req, res, next) {
    console.log('call to login, ' + req.user);
    if (req.user) {
        console.log('calling next...');
        next();
    } else {
        console.log('redirecting...');
        res.redirect('/login');
    }
}

我的/工作GET请求如下:

app.get('/work', loggedIn, function (req, res, next) {
    console.log('call to go to work')
    res.render("projects.html", {
        projects: getProjects()
    });
});

问题是登录后不是重定向到/工作,浏览器只显示[object Object]。 [object Object]也会记录到控制台。它甚至没有进入/工作。如果我从/ work GET请求中删除了loggedIn,我的页面会正确呈现,这表明它在路由中存在问题。我错过了明显的东西吗?非常感谢您提供任何帮助! :)

在此过程中登录到控制台:

redirecting...
Authentication success!
[object Object]

序列化和反序列化函数:

passport.serializeUser(function (user, cb) {
    cb(null, user.Email);
});
passport.deserializeUser(function (email, cb) {
    getInfo(email, function (user) {
        cb(user);
    });
});

请注意我从不在任何console.log中打印[object Object],所以这似乎是个谜。

1 个答案:

答案 0 :(得分:1)

您的反序列化程序看起来不正确:

passport.deserializeUser(function (email, cb) {
    getInfo(email, function (user) {
        cb(user);
    });
});

Node回调的通用约定是第一个参数始终用于传递错误。如果没有,第一个参数应该是假的(一般来说,它是null)。

我不确定getInfo是由您自己实现的,但它也没有使用正确的约定。我强烈建议你这样做。

在任何情况下,这很可能是导致问题的原因,因为Passport认为您传递了错误。

修复getInfo后,您可以将反序列化程序重写为:

passport.deserializeUser(function (email, cb) {
    getInfo(email, cb);
});

甚至更短:

passport.deserializeUser(getInfo);