gpt4 book ai didi

node.js - 在实际调用我的passwordMatch函数之前,Passport 无法通过 "Wrong password"进行身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 22:05:33 26 4
gpt4 key购买 nike

这很奇怪。

我想做什么

使用 Passportjs 本地策略和 JWT 在 Node.js 中创建身份验证服务器。允许使用电子邮件和密码进行帐户注册,密码使用“加密”进行哈希处理

发生了什么

因此,当我使用正确的密码登录到预先存在的模型时,APi 中的身份验证会因密码错误而失败。尽管发生了一些奇怪的事情。

我尝试过的

基本上当我发出帖子请求时:

  • 选项/api/login 调用
  • 它会检查我的 Passport 配置,并在检查密码是否正确的典型功能中
  • 旁注:POST api/登录记录到控制台

我的 Passport 配置中的功能:

if (!profileController.passMatch(username, password)) {
console.log('pass was wrong');
return done(null, false, {
message: 'Password is wrong'
});
}
  • 调用“pass was bad”,导致使用done() 的身份验证失败。尽管在 passMatch 中,正如您将在下面看到的,它确实显示了正确的密码

配置文件 Controller 中的 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;
};
  • 不过,如果您注意到控制台日志,我会在其中检查哈希比较是否正确。该日志语句在记录“传递错误”后打印到控制台。我的登录函数中的 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);

};
  • 不会调用错误登录,但会使用配置中的 did() 消息中的错误消息调用 console.log(info)。

这里出了什么问题?

最佳答案

在“passMatch”函数中,我再次查询用户(效率很低),但由于此操作是异步的,因此在 Passport 身份验证配置过程中,它被跳到“return false”语句,它收到错误,导致身份验证失败,但在导致花费更长时间后返回“日志”。

我是如何修复它的

我将 Passport 已经查询到的用户对象而不是用户名传递到 passMatch 中,然后进行了两个操作来检查哈希值是否相同并返回,现在它可以工作了。

新代码

module.exports.passMatch = (user, password) => {
var hash = crypto.pbkdf2Sync(password, user.salt, 1000, 64, 'sha512').toString('hex');
return user.hash == hash;
};

还需要对 Passport 配置进行必要的更改,以将用户而不是用户名作为该函数的第一个参数传递。

关于node.js - 在实际调用我的passwordMatch函数之前,Passport 无法通过 "Wrong password"进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173662/

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