【问题标题】:get valid password with bcrypt使用 bcrypt 获取有效密码
【发布时间】:2017-10-13 08:35:45
【问题描述】:

我正在使用带有 sequelize 的 nodejs 来设置我的数据库,目前我正在尝试对我的密码进行散列和加盐,我已经做过散列,但是现在当我登录时我想比较在 req.body 中发送的密码用散列的,所以我这样做了:

router.post('/', function (req, res, next) {
  console.log("hi");
  if (JSON.stringify(req.body) == "{}") {
    return res.status(400).json({ Error: "Login request body is empty" });
  }
  if (!req.body.username || !req.body.password) {
    return res.status(400).json({ Error: "Missing fields for login" });
  }

    var password = User.validPassword(req.body.password);


  // search a user to login
  User.findOne({ where: { username: req.body.username, password: password } }) // searching a user with the same username and password sended in req.body
    .then(function (user) {
      if (!user) {
        return res.status(400).json({ Error: "There is no user with those fields" }); // if there is no user with specific fields send
      }
        return res.status(400).json({ Error: "loged in!" }); // username and password match
    }).catch(function (err) {
      return res.status(200).json({ message: "server issues when trying to login!" }); // server problems
    });
});

我的模型是这样的:

"use strict";
var sequelize = require('./index');
var bcrypt = require('bcrypt-nodejs');

module.exports = function (sequelize, DataTypes) {
  var User = sequelize.define("User", {
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {
      classMethods: {
        generateHash: function (password) {
          console.log("hi");
          return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
        },
        validPassword: function (password) {
          return bcrypt.compareSync(password, this.password);
        }
      }

    });



  return User;
}

我没有收到任何回应

var password = User.validPassword(req.body.password);

我尝试 console.log 但仍然没有响应,当我尝试转到路由器 /login 时,它只是不给我任何响应,它一直在加载,有什么建议吗?

【问题讨论】:

    标签: javascript node.js postgresql express sequelize.js


    【解决方案1】:

    首先,您的路由定义了对/ 而不是/login 的发布操作。如果你还没有前端,可以使用 postman 来试试。

    应在 User 模型的实例上调用 validPassword 方法,因此您应该像这样编写这部分代码

    router.post('/', function (req, res, next) {
      console.log("hi");
      if (JSON.stringify(req.body) == "{}") {
        return res.status(400).json({ Error: "Login request body is empty" });
      }
      if (!req.body.username || !req.body.password) {
        return res.status(400).json({ Error: "Missing fields for login" });
      }
    
      // search a user to login
      User.findOne({ where: { username: req.body.username } }) // searching a user with the same username and password sended in req.body
        .then(function (user) {
          if(user && user.validPassword(req.body.password)) {
             return res.status(200).json({message: "login successful"});
          } else {
             return res.status(401).json({message: "Unauthorized"});
          }
    
        }).catch(function (err) {
          return res.status(200).json({ message: "server issues when trying to login!" }); // server problems
        });
    });
    

    同样在你的 catch 方法中,状态码应该是描述内部服务器错误的东西,比如500200 不合适。

    【讨论】:

    • 还是不行,路由中的/是因为我使用app.use登录
    • 是控制台上登录的“hi”
    • 是的,我总是收到服务器错误,我传递了用户名和密码
    • 我认为用户验证密码不能正常工作:/
    • 你能在方法里面做一个console.log(password, this.password)
    【解决方案2】:

    Soo 似乎我可以在 Femi Oladeji 的帮助下回答我自己的问题,基本上问题与我想通过实例而不是模型访问方法有关。

    所以当我尝试使用用户实例访问它时,没有处理实例的方法,所以对我的模型进行了一些更改。

    "use strict";
    var sequelize = require('./index');
    var bcrypt = require('bcrypt-nodejs');
    
    module.exports = function (sequelize, DataTypes) {
      var User = sequelize.define("User", {
        username: DataTypes.STRING,
        email: DataTypes.STRING,
        password: DataTypes.STRING
      }, {
          classMethods: {
            generateHash: function (password) {
              return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
            },
    
          },
          instanceMethods: {
            validPassword: function (password) {
              console.log(password, this.password)
              return bcrypt.compareSync(password, this.password);
            }
          }
    
    
        });
    
    
    
      return User;
    }
    

    还有可以处理实例的instanceMethods :)

    【讨论】:

    • 感谢您的回答。请注意,“I”在英文中总是大写的。
    • 在 V4 的 sequelize classMethods 和 instanceMethods 被弃用,取而代之的是 User.prototype.validPassword = function() {} 和 User.associate = function() {} --- 请参阅此处的文档:@ 987654321@
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多