gpt4 book ai didi

node.js - Bcrypt 比较对于正确的密码随机返回 false

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

我在 MERN 项目 (Node v8.10.0) 中使用 bcrypt (v2.0.1),使用 Mongoose 将用户密码存储在 MongoDB 中。哈希函数:

SellerSchema.pre('save', function (next) {
var user = this;
bcrypt.hash(user.password, 10, function (err, hash) {
if (err) {
return next(err);
}
user.password = hash;
next();
});
});

验证部分:

SellerSchema.statics.authenticate = function (email, password, callback) {
Seller.findOne({ email: email })
.exec(function (error, user) {
if (error) return callback(error);
else if (!user) {
var err = new Error('User not found.');
err.status = 401;
return callback(err);
}
bcrypt.compare(password, user.password).then(function (result){
if (result == true) {
return callback(null, user);
} else {
return callback();
}
});
});
};

登录路径:

router.post('/login', function(req, res, next) {
if (req.body.email && req.body.password){
Seller.authenticate(req.body.email,req.body.password,function(error,user) {
if (error || !user) {
console.log("this "+error);
var err = new Error('Wrong email or password.'); // logged everytime the compare result was false
err.status = 401;
return next(err);
} else {
res.json(user);
}
});
} else {
var err = new Error('Email and password are required.');
err.status = 401;
return next(err);
}
});

当注册新用户时,哈希值会被很好地存储,并且使用纯文本登录多次传递compare(),但之后返回 false。

如果我注册一个新用户并登录,它会再次工作一段时间,然后开始返回 false。例如:我仍然可以登录几个小时前注册的用户(10-15 次比较),但无法登录几分钟前创建的用户(1-2 次比较后)

使用 Node :8.10.0,操作系统:Ubuntu 18.04

最佳答案

每次保存对象时,您的 pre('save') 中间件都会更新密码。要停止此操作,请使用 mongoose 的 isModified 函数,如下所示:

SellerSchema.pre('save', function(next) {
if (this.isModified('password')) { // check if password is modified then has it
var user = this;
bcrypt.hash(user.password, 10, function(err, hash) {
if (err) {
return next(err);
}
user.password = hash;
next();
});
} else {
next();
}
});

关于node.js - Bcrypt 比较对于正确的密码随机返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50922453/

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