首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法比较密码的Bcryptjs

无法比较密码的Bcryptjs
EN

Stack Overflow用户
提问于 2016-10-16 20:05:12
回答 1查看 3.5K关注 0票数 4

尝试使用bcryptjs比较密码非常困难,这样我就可以签署一个JWT,但尝试登录时,我无法比较签署令牌并发送到客户端。

问题

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

技术:

  • NodeJS: 5.4.1
  • bcryptjs: 2.3.0
  • 特快: 4.14.0
  • 正文解析器: 1.15.2
  • MongoDB: 3.2.5
  • 猫鼬: 4.6.1

user.routes.js

代码语言:javascript
复制
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'});
       })
      })
    });
  }
});

在密码比较期间获取错误:

代码语言:javascript
复制
// 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
          });
        }
      });
    }
  });
});
EN

回答 1

Stack Overflow用户

发布于 2017-03-13 08:30:11

必须传递给比较方法的哈希值是调用bcrypt.hash方法时得到的值。我认为您在某些DB中保存了与用户关联的哈希,因此您必须获得该哈希并将其传递给作为第二个参数的比较方法。

我认为您做错了比较方法回调中的比较。您不应该比较密码,比较方法可以帮助您。您只需检查res是真是假。如果这是真的,那么密码是相同的,其他情况下它们是不同的。

如果您对本文中的实现有更多的疑问,那么就有一个非常简单的例子:https://solidgeargroup.com/password-nodejs-mongodb-bcrypt?lang=es

它是用承诺写的,但很容易理解。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40074881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档