gpt4 book ai didi

node.js - Passportjs 无法验证快速 session

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:55 24 4
gpt4 key购买 nike

我正在使用 Passportjs 来验证我的 Express 应用程序。我所做的与教程代码非常相似,但身份验证 session 总是让我感到困惑。

在我的主要工作流程中,我使用本地策略对用户进行身份验证

passport.authenticate('local', function (err, user, info) {
if (err) {
req.flash('error', { msg: err.message });
return res.redirect('back');
}

if (!user) {
// punish abuser...
})
.catch( function (err) {
req.flash('error', { msg: err.message });
return res.redirect('back');
});
} else {
// Log user in
debug('Info: ' + 'Logging in'.green.bold);
req.logIn(user, function (err) {
if (err) {
debug('Info: ' + 'Error occured '.red.bold);
req.flash('error', { msg: err.message });
res.redirect('back');
}
// req.session.passport.user = user.id; // <-- even tried hack, didn't work
// Send user on their merry way
res.redirect('/homepage');
});
}
})

然后,对于/homepage 的所有请求,我强制他们验证用户是否已通过身份验证

  app.all('/api*', passportConf.isAuthenticated);

其中 isAuthenticated() 定义为

exports.isAuthenticated = function (req, res, next) {
// Is the user authenticated?
if (req.isAuthenticated()) {
debug('Info: ' + '----authentication verified');
return next();
} else {
debug('Info: ' + '----authentication verification failed');
// flash error message etc...
return res.redirect('/login');
}
};

结果显示:

Info: --->> Password Matched! <<--- +0ms
Info: Logging in +0ms
Info: serializing user +0ms
...
POST /login 302 295.015 ms - 64
...
Executing (default): UPDATE "Sessions" SET "data"='{"cookie":{"//cookie"},"passport":{"user":37}}'
...
Info: ----authentication verification failed +0ms
....
GET /api 302 19.094 ms - 68

Executing (default): UPDATE "Sessions" SET "data"='{"cookie":{"//cookie"},"passport":{}, "attemptedURL":"/api"}
...
Info: de-serializing user +20ms
...
Executing (default): SELECT "//fields" FROM "Users" AS "User" WHERE "User"."id" = 37 LIMIT 1;
Error: 500 [object SequelizeInstance:User] +5ms

该请求确实通过了密码检查,并一直持续到重定向之前,并在重定向后终止。

我观察到有 3 个潜在原因:

  • 两次 Session UPDATE 写入完全相同,只是第一个写入了 user.id 序列化,重定向后,用户消失了。
  • 反序列化用户和查找用户的 SELECT 操作发生在请求被判死刑之后。我的代码可能存在一些排序/异步问题(我到处都看了,确实找不到任何东西..)
  • 500 [object SequelizeInstance:User] 确实是一个黑盒错误,我不知道这意味着什么..

被困在这个问题中很多个夜晚...非常感谢对此的任何帮助...

最佳答案

500 [object SequelizeInstance:User] 似乎表明您正在将一个sequelize 实例传递给某个认为是错误的地方。也许您正在调用一个需要 err, user 且仅包含 user 的回调:

fn(user)
// Where it should have been
fn(null, user)

关于node.js - Passportjs 无法验证快速 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com