简体   繁体   English

Node.js bcrypt比较函数始终返回false

[英]Node.js bcrypt compare function always returns false

I need a way to compare two hashed passwords before performing a post request in node js. 我需要一种在节点js中执行发布请求之前比较两个哈希密码的方法。 The hashed password is stored in a mongoDB database. 哈希密码存储在mongoDB数据库中。 I've narrowed my mistake down to these possible areas. 我已将错误缩小到这些可能的范围。

//Part 1
router.post('/signIn', function (req, res) {

if(errors){
    console.log(errors);
    res.render('signIn', {
        errors: errors
    });

}else {
    module.exports = function (passport) {
        passport.authenticate('local',{successRedirect: '/dashboard', failureRedirect: '/', failureFlash: true})
    },
        module.exports = function (passport) {
            passport.use(new LocalStrategy(
                function (username, password, done) {
                    User.getUserByUsername(inputUser, function (err, user) {
                        if (err) throw err;
                        if (!user) {
                            req.flash('error_msg','Unknown Username');
                            return done(null, false);
                        }
                        User.comparePassword(inputPwd, user, hash, function (err, isMatch) {
                            if (err) throw err;
                            if (isMatch) {
                                req.flash('error_msg','Unknown Password');
                                return done(null, user);
                            } else {
                                return done(null, false);
                            }
                        })
                    })
                }))
    },
        module.exports = function (passport) {
            passport.serializeUser( function (user, done) {
                done(null, user.id());
            });
    },
        module.exports = function (passport) {
            passport.deserializeUser( function (id, done) {
                User.getUserById(id, function (err, user) {
                    done(err, user);
                });
            });
    };
    res.redirect('/users/dashboard');
}

});

These parts are from different files. 这些部分来自不同的文件。

//Part 2:
module.exports.createUser = function (newUser, callback) {
    bcrypt.hash(newUser.password, 10, function(err, hash) {
        newUser.password = hash;
        newUser.save(callback);
    });
}


module.exports.getUserByUsername = function (username, callback) {
var query = {username: username};
User.findOne(query, callback);
}


module.exports.comparePassword = function (password, hash, callback ) {
bcrypt.compare(password, hash, function(err, isMatch) {
    if (err) throw err;
    callback(null, isMatch);
    console.log(isMatch);
});
}

Ok, you have made quite some mistakes, i hope i found all. 好的,您犯了很多错误,我希望我能找到所有的错误。 I will go through them via comments in your code: 我将通过您代码中的注释对它们进行遍历:

function (username, password, done) {
    // inputUser is undefined, shouldn't that be username?
    User.getUserByUsername(inputUser, function (err, user) {
        if (err) throw err; // you should never throw in async callbacks! use done(err) instead
        if (!user) {
            req.flash('error_msg','Unknown Username');
            return done(null, false);
        }
        // all your input arguments are undefined! Where does inputPwd, user and has coe from?
        // inputPassword should be password i guess, hash idk, maybe user.hash?
        // also your arguments are wrong
        User.comparePassword(inputPwd, user, hash, function (err, isMatch) {
            if (err) throw err; // again, don't throw!
            if (isMatch) {
                req.flash('error_msg','Unknown Password');
                return done(null, user);
            } else {
                return done(null, false);
            }
        })
    })
}));

Now a corrected version: 现在是一个更正的版本:

function (username, password, done) {
    User.getUserByUsername(username, function (err, user) {
        if (err) return done(err);
        if (!user) {
            req.flash('error_msg','Unknown Username');
            return done(null, false);
        }
        User.comparePassword(password, user.password, function (err, isMatch) {
            if (err) return done(err);
            if (isMatch) {
                req.flash('error_msg','Unknown Password');
                return done(null, user);
            } else {
                return done(null, false);
            }
        })
    })
}));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM