Express.js Passport.js 身份验证后未正确路由
Express.js Not Routing Properly after Passport.js Authentication
我使用 Passport.js 进行了相当简单的身份验证设置。一旦用户通过身份验证,我就让他们重定向到 /work,就这样。
app.post('/login',
passport.authenticate('local', {
successRedirect: '/work',
failureRedirect: '/login',
failureFlash: true
})
);
整个身份验证过程运行良好。意思是,该程序将拒绝任何不正确的 user/password 组合等。真正的问题是当我的程序重定向到 /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。如果我从 /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.logs 中打印 [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);
我使用 Passport.js 进行了相当简单的身份验证设置。一旦用户通过身份验证,我就让他们重定向到 /work,就这样。
app.post('/login',
passport.authenticate('local', {
successRedirect: '/work',
failureRedirect: '/login',
failureFlash: true
})
);
整个身份验证过程运行良好。意思是,该程序将拒绝任何不正确的 user/password 组合等。真正的问题是当我的程序重定向到 /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。如果我从 /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.logs 中打印 [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);