Nodejs Mongoose Bcrypt 当我更改哈希密码时我无法重新登录

Nodejs Mongoose Bcrypt when i change hash password i cant login back

当我更新密码时,我无法重新登录。给出响应密码不匹配错误,但如果我不更新密码,我可以登录。

第 1 步(注册)

  Customer.findOne({$or:[{email:user.email},{username:user.username}]},function(err,data){
    if(!data){
      var tokencreator = generateUUID();
      var customer = new Customer({
        userid:uuidv4(),
        username:req.body.username,
        email:req.body.email,
        password:hashpass(req.body.password),
        token:tokencreator,
        registerdate:new Date(),
        lastlogin:new Date()
      })
   customer.save()

数据库可以看到工作登记表。

步骤 2(更新密码)

app.post('/passnewer', function(req,res){
  console.log(req.body)
  Customer.findOne({passtoken:req.body.token},function(err,data){
    if(data){
      if(req.body.password != data.username){
        if(req.body.password = comparepass(req.body.password,data.password)){
          res.send({"Success":"Your New Password Cannot Be The Same As Your Old Password!","redirect":"false"});
        }
        else{
          Customer.findOne({passtoken:req.body.token},function(err,data){
          data.password = hashpass(req.body.password);
          data.save();
          });
          res.send({"Success":"Password Renewal Successful You Are Redirected!","redirect":"true"});
        }
      }
      else{
        res.send({"Success":"Your password cannot be the as your username!","redirect":"false"});
      }
    }
    else{
      res.send({"Denied":"İnvalid token!"});
    }
  })
})

响应可以看到数据库密码已更改。

数据库

第 3 步(登录帐户)当我尝试登录时出现错误。

app.post('/userlogin', function(req,res){
  Customer.findOne({email:req.body.email},function(err,data){
        if(data){
      if(data.password = comparepass(req.body.password,data.password)){
        if(data.status != "Active"){
          res.send({"Success":"Email verification need!"})
        }
        else{
          req.session.isLoggedIn = true;
          req.session.userID = data.userid;
          Customer.findOne({userid:req.session.userID},function(err,data){
          data.lastlogin = new Date();
          data.save()
          });
          res.send({"Success":"Login Success","redirect":"true"});
        }
            }else{
        res.send({"Success":"Password error!"});
            }
      }else{
        res.send({"Success":"E-Mail error!"});
        }
    });
})

回应

架构我的架构

var mongoose = require("mongoose")
var Schema = mongoose.Schema;

var customerSchema = new Schema({
    userid:String,
    username:String,
    email:String,
    password:String,
    address:String,
    registerdate:String,
    tickets:Array,
    token:String,
    passtoken:String,
    status: {
        type: String, 
        enum: ['Pending', 'Active'],
        default: 'Pending'
      },
      lastlogin:{
        type: String, 
        default: 'TBD'
      },
})

var Customer = mongoose.model('Customer',customerSchema)

module.exports = Customer

散列和比较函数 Bcrypt 函数

function hashpass(passnohash){
  return bcrypt.hashSync(`${hashprefix}${passnohash}`, saltRounds)
}

function comparepass(passnohash, passhash){
  return bcrypt.compareSync(`${hashprefix}${passnohash}`, passhash)
}

我会 console.log 将新密码哈希保存到数据库中,然后 console.log 当您尝试重新登录时(在第 3 步中)保存该哈希。看看是不是一样

然后特别看一下这些行:

  1. 在 POST /userlogin 请求处理程序中:

    if(data.password = comparepass(req.body.password,data.password)){
    
  2. 在 POST /passnewer 请求处理程序中:

    if(req.body.password = comparepass(req.body.password,data.password)){
    

以上两行都进行赋值(不是比较)。所以看起来你用comparepass的return值覆盖了密码(comparepass似乎return一个boolean)。

这可能是一个潜在的错误(如果我没看错的话),因为 req.body.password 似乎被 true/false 覆盖了,这意味着您保存了true/false(而不是用户新密码的哈希值)当您调用 data.save().

(如果comparepassword return是boolean,你可以直接在if语句中使用它的return值。不需要比较它data.passwordreq.body.password.)

在路线 POST /passnewer' you overwrite req.body.passwordbyif(req.body.password = comparepass(req.body.password,data.password))`

现在您的新密码将变为 true(或 false),然后您将此密码散列并保存到您在数据库中的记录中。

if(comparepass(req.body.password,data.password))

够了,为什么你总是在 if 条件下分配一个变量?