繁体   English   中英

使用bcrypt获取有效密码

[英]get valid password with bcrypt

我正在使用带有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时,它并没有给我任何响应,它一直在加载,没有任何提示?

首先,您的路线将后动作定义为/ not /login 如果您还没有前端,可以使用邮递员进行尝试。

应该在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方法中,状态代码应该是描述内部服务器错误的内容,例如500 200是不合适的。

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,可以处理实例:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM