在实际调用我的 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 使用“错误密码”进行身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

无法在 xcode 项目中测试网络调用

逆向分析-之深入理解函数

在本地调用 Firebase 云函数时,我收到 200 响应,但响应是 cors 类型响应,而不是我的实际数据

OpenGL函数解析之glLoadIdentity()

Java 值传递引用传递之争

在路由内部模拟一个 api 函数调用而不实际调用它