passportjs 无法验证快速会话
passportjs failed to authenticate express session
我正在使用 passportjs 来验证我的 Express 应用程序。我所做的与教程代码非常相似,但是身份验证会话总是让我感到困惑。
在我的主要工作流程中,我使用本地策略对用户进行身份验证
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查找用户的操作发生在请求被判死刑之后。我的代码可能有一些 ordering/async 问题(我到处查看,真的找不到任何东西..)
- 500 [object SequelizeInstance:User] 确实是一个黑框错误,我不知道这意味着什么..
困在这个问题上很多个晚上...非常感谢任何对此的帮助...
500 [object SequelizeInstance:User]
似乎表明您正在将 sequelize 实例传递给某个认为是错误的东西。也许你正在调用一个回调,它只需要 err, user
user
:
fn(user)
// Where it should have been
fn(null, user)
我正在使用 passportjs 来验证我的 Express 应用程序。我所做的与教程代码非常相似,但是身份验证会话总是让我感到困惑。
在我的主要工作流程中,我使用本地策略对用户进行身份验证
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查找用户的操作发生在请求被判死刑之后。我的代码可能有一些 ordering/async 问题(我到处查看,真的找不到任何东西..)
- 500 [object SequelizeInstance:User] 确实是一个黑框错误,我不知道这意味着什么..
困在这个问题上很多个晚上...非常感谢任何对此的帮助...
500 [object SequelizeInstance:User]
似乎表明您正在将 sequelize 实例传递给某个认为是错误的东西。也许你正在调用一个回调,它只需要 err, user
user
:
fn(user)
// Where it should have been
fn(null, user)