2016-09-09 3 views
0

Я проверил, что в моем db я сохраняю имя пользователя и хэш пароля. Я могу получить имя из db, однако, когда я проверяю пароль, он всегда возвращает false. Не уверен, что не так.bcrypt.compareSync всегда возвращает false

Вот мой HTML

<div ng-controller="userController"> 
    <div class=user> 
     <form name="login_form"> 
      <h2 class>Login</h2> 
      <h3 class = "login_page">UserName</h3> 
      <input ng-model="user" type="text" ng-minlength="1" required> 
      <h3 class = "login_page">Password</h3> 
      <input ng-model="password" type="password" name="password" ng-minlength="4" required> 
      <input type="submit" value="Login" ng-click="login()" > 
      <div ng-if ="login_form.$submitted" ng-messages="login_form.password.$error" style="color:maroon" role="alert"> 
       <div ng-message="minlength">Your field is too short</div> 
      </div> 
      <p ng-if="error">Username or login is incorrect</p> 
     </form> 
    </div> 
    <div class=user> 
     <form name = "register_form"> 
      <h2 class>Register</h2> 
      <h3 class = "login_page">UserName</h3> 
      <input ng-model="reg.name" type="text" required> 
      <h3 class = "login_page">Password</h3> 
      <input ng-model="reg.password" type="password"> 
      <input type="submit" value="Register" ng-click="register()" required > 
      <div ng-if ="login_form.$submitted" ng-messages="login_form.password.$error" style="color:maroon" role="alert"> 
       <div ng-message="minlength">Your field is too short</div> 
      </div> 
      <p ng-if="duplicate">That user name is taken, please choose another</p> 
      <p ng-if="correct">Registration Succesfull</p> 
     </form> 
    </div> 
</div> 

Вот мой контроллер на стороне сервера

var mongoose = require('mongoose'), 
Todo = mongoose.model('Todo'); 
Login = mongoose.model('Login'); 
var bcrypt = require('bcrypt'); 
var name = "" 

module.exports = (function(){ 
    return { 
    save_name:function(req, res){ 
     req.session.user = req.body.user 
     Login.findOne({name: req.body.user}, 
     function(err, user) { 
     if(user){ 
      console.log(user.password); 
      console.log(bcrypt.compareSync(req.body.password, user.password)); 
      res.json({'error': false}); 
      }else { 
      res.json({'error': true}); 
      } 
     }) 
    }, //end of save name method 
    register:function(req, res){ 
     bcrypt.hashSync(req.body.password, bcrypt.genSaltSync(8)); 
     login = new Login({ 
     name:req.body.user, 
     password: bcrypt.genSaltSync(8) 
     }) 
     login.save(function(err){ 
     if(err){ 
      res.json({'error': true}); 
     } else { 
      res.json({'sucess': true}) 
     } 
     }) 
    } // end of register user function 
    } 
})(); 

ответ

2

Вы сохраняете сгенерированную соль в качестве пароля вместо самого реального хэша. Кроме того, явно не требуется genSalt*(). Наконец, вы действительно должны использовать функции async вместо этого, чтобы избежать излишней блокировки цикла событий. Так со всем этим в виду, вы можете в конечном итоге что-то вроде:

module.exports = { 
    save_name: function(req, res) { 
    req.session.user = req.body.user; 
    Login.findOne({ name: req.body.user }, 
        function(err, user) { 
     if (err) 
     return res.json({ error: true }); 
     bcrypt.compare(req.body.password, 
        user.password, 
        function(err, valid) { 
     res.json({ error: !!(err || !valid) }); 
     }); 
    }); 
    }, // end of save name method 
    register: function(req, res) { 
    bcrypt.hash(req.body.password, 8, function(err, hash) { 
     if (err) 
     return res.json({ error: true }); 
     login = new Login({ 
     name: req.body.user, 
     password: hash 
     }) 
     login.save(function(err) { 
     res.json({ error: !!err }); 
     }) 
    }); 
    } // end of register user function 
}; 
0

Непосредственной причиной ваша ошибка в register вы должны использовать bcrypt.hashSync(myPlaintextPassword, saltRounds) вместо genSaltSync. Фиксация, которая должна заставить вещи «работать».

Однако вам необходимо перекодировать все это, чтобы использовать API-интерфейс async bcrypt, или ваше приложение будет очень плохо реагировать под нагрузкой (например, искалечено и непригодно, а не просто «медленно»). Общее правило: нет вызовов синхронизации на сервере node.js.