Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Bcryptjs无法比较密码Nodejs_Javascript_Node.js_Express_Bcrypt - Fatal编程技术网

Javascript Bcryptjs无法比较密码Nodejs

Javascript Bcryptjs无法比较密码Nodejs,javascript,node.js,express,bcrypt,Javascript,Node.js,Express,Bcrypt,尝试使用bcryptjs比较密码,以便我可以签署JWT,但尝试登录时,我无法比较签署令牌并发送到客户端,这是一段非常糟糕的时间 问题 我可以散列密码并将其存储到数据库中,我遇到的问题是使用.compare()方法并传入hash参数。我不太确定要传递什么作为散列值 技术: 节点JS:5.4.1 bcryptjs:2.3.0 快车:4.14.0 正文解析器:1.15.2 MongoDB:3.2.5 猫鼬:4.6.1 user.routes.js var express = require

尝试使用bcryptjs比较密码,以便我可以签署JWT,但尝试登录时,我无法比较签署令牌并发送到客户端,这是一段非常糟糕的时间

问题

我可以散列密码并将其存储到数据库中,我遇到的问题是使用
.compare()
方法并传入
hash
参数。我不太确定要传递什么作为
散列值

技术:

  • 节点JS:5.4.1
  • bcryptjs:2.3.0
  • 快车:4.14.0
  • 正文解析器:1.15.2
  • MongoDB:3.2.5
  • 猫鼬:4.6.1
user.routes.js

var express     = require('express');
var router      = express.Router();
var jwt         = require('jsonwebtoken');
var bcrypt      = require('bcryptjs');
var salt        = bcrypt.genSaltSync(10);
var config      = require('../config/database');

User = require('../models/user.model.js');

// Create new User
router.post('/', function(req, res){
   var user = req.body;
   if(!req.body.email || !req.body.password){
     res.json({success: false, message: 'Please pass email and password'});
   } else {
     User.addUser(user, function(err, user){
      if(err){
        res.send(err);
      }
      bcrypt.genSalt(10, function(err, salt){
       bcrypt.hash(user.password, salt, function(err,hash){
         user.password = hash;
         user.save();
         console.log('new user', user);
         res.json({success: true, message: 'Create user successful'});
       })
      })
    });
  }
});
在密码比较期间获取错误:

// Authenticate a User
//email: test@test.com
//password: password
router.post('/login', function(req, res){
  User.findOne({ email: req.body.email }, function (err, user){
    if (err){
      res.send(err);
    }
    if(!user){
      res.json({ success: false, message: 'Authentication failed. User not found'});
    } else if (user) {
      // where does this hash value get defined and passed in?
      bcrypt.compare(req.body.password, hash, function(err, res){
        if(user.password != req.body.password){
          console.log('password incorrect');
        //res.json({ success: false, message: 'Authentication failed. Password incorrect'});
      } else {
          var token = jwt.sign({
              email: user.email
          }, config.secret, {
            expiresIn: 60 // expressed in seconds
          });
          console.log('token contents', token);
          res.json({
            success: true,
            message: 'Enjoy your token!',
            token: token
          });
        }
      });
    }
  });
});

必须传递给compare方法的哈希值是调用
bcrypt.hash
method时得到的值。我假设您将与用户关联的散列保存在某个数据库中,因此您必须获取该散列并将其作为第二个参数传递给compare方法

我认为您在compare方法的回调中进行了错误的比较。你不应该比较密码,比较方法会帮你。您只需检查
res
是否为真。如果是真的,那么密码是相同的,其他情况下则不同

如果您对本文中的实现有更多疑问,可以举一个非常简单的例子:

它写着承诺,但很容易理解