[英]Unable to verify hashed password
大家好 ,
我正在使用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不是一個函數
請幫忙。
在Login Route中 ,您需要實例化Schema:
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);
});
});
您的錯誤是提供給您的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對象。
如果您希望避免在數據層中檢查密碼是否有效,另一種可能的解決方案是簡單地根據用戶文檔的電子郵件獲取用戶文檔,然后在登錄路徑中檢查密碼。
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);
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.