簡體   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