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

标签 javascript node.js express routes passport.js

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

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

整个身份验证过程运行良好。这意味着,程序将拒绝任何不正确的用户/密码组合等。真正的问题是当我的程序重定向到/work时。

如上所示,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');
    }
}

我的/work GET 请求如下所示:

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

问题是登录后浏览器不会重定向到/work,而是只显示 [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],因此这似乎是一个谜。

最佳答案

您的解串器看起来不正确:

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

关于javascript - Passport.js 身份验证后 Express.js 无法正确路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40644949/

相关文章:

php - PhoneGap 和 CMS 集成

javascript - 在 Node.js 中关闭 postgres (pg) 客户端连接

javascript - js函数队列

javascript - 如何将客户端值从浏览器端传递到 Node.js Controller

javascript - Expressjs pm2忽略观看公共(public)/图像文件夹

javascript - jQuery 淡入淡出动画不流畅

javascript - 在nodejs中将从文件读取的字符串转换为json对象

mysql - 如何仅显示 MySQL 中基于另一个表的列中的一行 - Express JS

mysql - 从另一个文件调用回调? Node js表达

javascript - Vuex store WATCH 和 SUBSCRIBE 的区别