这很奇怪。
我正在尝试做什么
使用Passportjs本地策略和JWT在node.js中创建身份验证服务器。允许使用电子邮件和密码进行帐户注册,密码使用'crypto'散列
发生了什么
因此,当我使用正确的密码登录到现有模型时,由于密码错误而导致APi身份验证失败。尽管发生了一些奇怪的事情。
我尝试过的事情
基本上是在我发出发布请求时:
我的护照配置中的功能:
if (!profileController.passMatch(username, password)) {
console.log('pass was wrong');
return done(null, false, {
message: 'Password is wrong'
});
}
配置文件控制器中的passMatch函数:
module.exports.passMatch = (email, password) => {
User.findOne({email: email}, (err, user) => {
if (err) { console.log ("error at passMatch: " + err); }
var hash = crypto.pbkdf2Sync(password, user.salt, 1000, 64, 'sha512').toString('hex');
console.log(user.hash == hash);
return (user.hash == hash);
});
return false;
};
登录功能:
module.exports.login = (req, res) => {
console.log('beginning to authenticate');
passport.authenticate('local', (err, user, info) => {
console.log ("authenticating");
var token;
// If passport throws an error
if (err) {
res.status(404).json(err);
console.log("error logging in");
return;
}
// If a user is found
if (user) {
// Respond with JWT
token = createJwt(user)
res.status(200);
res.json({
"token": token
})
console.log("user logged in");
// If a user wasn't found
} else {
res.status(401).json(info);
console.log(info);
}
})(req, res);
};
这是怎么了?
答案 0 :(得分:1)
在“ passMatch”函数中,我再次查询用户(这只是效率低下),但是由于此操作是异步的,因此在护照身份验证配置过程之后,它被跳过到“ return false”语句。 ,它接收到false,从而导致身份验证失败,但在返回日志后花了更长的时间。
我如何修复
我将护照已经查询过的用户对象(而不是用户名)传递到passMatch中,然后执行两个操作以检查哈希是否相同并返回该哈希,现在它可以正常工作了。
新代码
module.exports.passMatch = (user, password) => {
var hash = crypto.pbkdf2Sync(password, user.salt, 1000, 64, 'sha512').toString('hex');
return user.hash == hash;
};
还需要对护照配置进行必要的更改以将用户而不是用户名作为该功能的第一个参数传递给
。