无法验证散列密码

时间:2017-06-26 08:46:04

标签: node.js express mongoose bcrypt

大家好

我正在使用 bcrypt模块对我的用户进行身份验证 我可以执行注册过程,但在登录过程中遇到问题 用户模型

var userSchema = new Schema({
    email: {type: String, required: true},
    password: {type: String,
});


哈希方法

userSchema.methods.encryptPassword = function (password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(5), null)
};
userSchema.methods.validPassword = function (password) {
    return bcrypt.compareSync(password, this.password);
};


登录

module.exports.login = function (user, callback) {
    User.findOne({'email': user.email, 'password': user.validPassword(this.password)}, callback);
};


登录路线

router.post('/login', function (req, res) {
    var user = req.body;
    User.login(user, function (err, user) {
        if (err) {
            throw err;
        }
        if (!user) {
            res.sendStatus(404);
            return;
        }
        res.json(user.id);
    });
});


执行时遇到此错误: TypeError:user.validPassword不是函数

请帮助。

2 个答案:

答案 0 :(得分:0)

登录路径中,您需要实例化架构:

router.post('/login', function (req, res) {
    var user = new User(req.body);
    User.login(user, function (err, user) {
        if (err) {
            throw err;
        }
        if (!user) {
            res.sendStatus(404);
            return;
        }
        res.json(user.id);
    });
});

答案 1 :(得分:0)

您的错误是提供给login方法的用户不是Mongoose数据库对象。相反,您的登录功能应如下所示:

module.exports.login = function (request, callback) {
    User.findOne({'email': request.email }, function(err, user) {
        if (err) return callback(err);
        if(!user || !user.validPassword(request.password)) return callback();
        return callback(null, user);
    });
};

在您尝试验证密码之前,这将确保user是有效的Mongoose对象。

另一种可能的解决方案是,如果您希望避免检查密码在数据层中是否有效,则只需根据其电子邮件获取用户文档,然后在登录路径中检查密码。 / p>

router.post('/login', function (req, res) {
    var user = req.body;
    User.findOne(user, function (err, user) {
        if (err) {
            throw err;
        }
        if (!user) {
            res.sendStatus(404);
            return;
        }
        if (!user.validPassword(req.body.password)) {
            res.sendStatus(401);
            return;
        }
        res.json(user.id);
    });
});