2017-06-26 85 views
0

大家好
無法驗證哈希密碼

我驗證使用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); 
    }); 
}); 


當執行正在此錯誤:類型錯誤:user.validPassword不是一個函數

請幫助。

回答

0

你的錯誤就在於,提供給您的login方法的用戶不是貓鼬DB對象。相反,你的登錄功能應該是這個樣子:

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是一個有效的貓鼬對象,你嘗試驗證密碼之前。

另外一個可能的解決方案,如果你願意,以避免檢查密碼是在您的數據層有效,是簡單地獲取基於其電子郵件的用戶文檔,然後檢查在登錄路由的密碼。

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); 
    }); 
}); 
+0

我不想來處理**登錄** code.Rather我只是想在那裏執行蒙戈查詢條件,檢查結果**登錄**路線。 –

+0

不散列我能夠登錄的用戶。
'module.exports.login =函數(用戶,回調){ User.findOne({ '電子郵件':user.email, '密碼':user.validPassword(此。密碼)},回調); };' –

+0

我認爲這裏最大的區別是通過對密碼進行哈希處理(並使用'bcrypt',其中包括salting),您將刪除在數據庫中查詢特定密碼的功能(一件好事)。 換句話說,'bcrypt'不能告訴你什麼正確的「密碼」(在你的數據庫中)是不知道從數據庫(鹽)的一些信息。 –

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); 
    }); 
}); 
+0

Trindale Tavares:通過這樣做,我得到**不正確的參數**錯誤。 –

+0

你在哪一行出現這個錯誤? –

+0

'User.findOne({'email':user.email,'password':user.validPassword(this.password)},callback);' –