在实际调用我的 passwordMatch 函数之前,Passport 使用“错误密码”进行身份验证失败
Posted
技术标签:
【中文标题】在实际调用我的 passwordMatch 函数之前,Passport 使用“错误密码”进行身份验证失败【英文标题】:Passport fails authentication with "Wrong password" before actually calling my passwordMatch function 【发布时间】:2019-08-06 00:08:04 【问题描述】:这很奇怪。
我想做什么
使用 Passportjs 本地策略和 JWT 在 node.js 中创建身份验证服务器。允许使用电子邮件和密码注册帐户,密码使用“crypto”进行哈希处理
发生了什么
因此,当我使用正确的密码登录到预先存在的模型时,API 中的身份验证因密码错误而失败。虽然发生了一些奇怪的事情。
我的尝试
基本上是在我发出帖子请求时:
选项 /api/login 调用 它通过我的护照配置,并在您检查密码是否正确的典型功能中 旁注:POST api/login 被记录到控制台我的护照配置中的功能:
if (!profileController.passMatch(username, password))
console.log('pass was wrong');
return done(null, false,
message: 'Password is wrong'
);
调用“通过错误”,使用 done() 验证失败。虽然在 passMatch 中,如下所示,它确实显示了正确的密码
配置文件控制器中的 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;
;
不过,如果您注意到我检查哈希比较是否正确的控制台日志。该日志语句在记录“pass was wrong”后打印到控制台。在我的登录函数中的 passport.authenticate 调用结束 console.log(info) 上的身份验证失败后,它也会打印出来
登录功能:
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);
;
不会调用错误登录,但会调用 console.log(info) 并使用配置中的 done() 消息中的错误消息。
这里出了什么问题?
【问题讨论】:
【参考方案1】:在“passMatch”函数中,我再次查询用户(这只是效率低下),但由于此操作是异步的,它被跳过到“return false”语句之后,并且在护照身份验证配置过程中,它收到了错误,导致身份验证失败,但“日志”在返回后需要更长的时间。
我是如何解决的
我将护照已经查询的用户对象而不是用户名传递给 passMatch,然后有两个操作来检查哈希是否相同并返回,现在它可以工作了。
新代码
module.exports.passMatch = (user, password) =>
var hash = crypto.pbkdf2Sync(password, user.salt, 1000, 64, 'sha512').toString('hex');
return user.hash == hash;
;
还需要在护照配置中进行必要的更改,以将用户而不是用户名作为该函数的第一个参数传递给该函数。
【讨论】:
以上是关于在实际调用我的 passwordMatch 函数之前,Passport 使用“错误密码”进行身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章