在实际调用我的passwordMatch函数之前,Passport无法通过“错误密码”进行身份验证

时间:2019-03-14 23:51:39

标签: node.js authentication mongoose passport.js cryptojs

这很奇怪。

我正在尝试做什么

使用Passportjs本地策略和JWT在node.js中创建身份验证服务器。允许使用电子邮件和密码进行帐户注册,密码使用'crypto'散列

发生了什么

因此,当我使用正确的密码登录到现有模型时,由于密码错误而导致APi身份验证失败。尽管发生了一些奇怪的事情。

我尝试过的事情

基本上是在我发出发布请求时:

  • OPTIONS / api / login调用
  • 它通过我的护照配置,并在典型功能中检查密码是否正确
  • 旁注:POST api /登录已记录到控制台

我的护照配置中的功能:

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;
};
  • 尽管您注意到控制台日志,但我在此处检查哈希比较是否正确。在记录“通过错误”后,该日志语句被打印到控制台 。在我的登录功能中的password.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);

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

这是怎么了?

1 个答案:

答案 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;
};

还需要对护照配置进行必要的更改以将用户而不是用户名作为该功能的第一个参数传递给