Почему хэш пароля утерян? Узел 6.9.1 и мангуст 4.7.4

Я пытаюсь использовать промежуточное ПО mongoose для применения хэша к элементу схемы:

'use strict'

const mongoose = require('mongoose')
mongoose.Promise = global.Promise
const Schema = mongoose.Schema
const bcrypt = require('bcrypt-nodejs')

const userSchema = Schema({
  email: { type: String, unique: true, lowercase: true },
  displayName: String,
  avatar: String, //url donde se almacena
  password: { type: String, select:false } // para que al hacer consultas no lo envíe al cliente
  signupDate: { type: Date, default: Date.now() }
  lastLogin: Date  
})

// Aquí aplica hash en el evento findOne
userSchema.pre('findOne', (next) => {
  let user = this 

  bcrypt.genSalt(10, (err, salt) => {
    if (err) return next(err)

    bcrypt.hash(user.password, salt, null, (err, hash) => {
      if(err) return next(err)

      user.password = hash
      console.log(user.password)
      next()
    })
  })

})

Когда событие выполнено, выведите на консоль пароль с хешем.

Но в этом console.log, когда выполняется событие findOne () , атрибут печатается без хеша .

let usu = new Usuario({
    usuario : req.body.usuario,
    password : req.body.password
  })

Usuario.findOne( {usu_nombre: usu.usuario}, (err, user) => {
    console.log(usu.password)
})

То есть первая консоль схемы печатает пароль с хешем , а второй [console] печатает пароль без хеша.

То, что я хочу, это применять хэш в то время, когда это требуется.

Вот скриншот:

introducir la descripción de la imagen aquí

Есть идеи, почему пароль не поддерживается с помощью хэша?

0
задан 27.12.2016, 20:12
0 ответов

Какая-то идея, почему не держится password с hash?

Объект usu это просто новый документ. Это очевидно, что usu.password дайте тебе плоский password, потому что я схватил, ты распределил это ему (посредством тела просьбы). С другой стороны, middleware/hook - для события findOne. Когда ты просишь находить документ, работает middleware и меняет плоский password на Ваш соответствующий hash.

мое намерение состоит encriptar password в том, чтобы он получил из-за post пользователя, чтобы позже это сравнивать в DB

Если ты хочешь hashear пароли, которые ты получаешь просьбой: почему ты используешь middleware? Концепция middleware состоит в том, чтобы перехватывать событие и "делать инъекцию" логике дела. Здесь нет ничего, что перехватывать, единственное, что нужно делать, hashear полученный пароль.

С другой стороны, hash не сравнивается другим hash, в Вашем месте, нужно сравнивать hash с плоским текстом. Внутри, посредством алгоритма доказано, принадлежит ли hash тексту в консультации.

Такое взятие как пример следующий код:

const salt = bcrypt.genSaltSync(10);
const hash1 = bcrypt.hashSync('mipassword', salt);
const hash2 = bcrypt.hashSync('mipassword', salt);

if (hash1 === hash2) {
  // todos somos felices. El password es correcto... ¿O no?
}

Видимо все правильно, самое логическое состоит в том, чтобы всегда произвелся тот же hash для текста. Но это неправильное и чтобы это понимать, ты должен понимать сначала, как функционирует алгоритм, который ты используешь.

У Bcrypt есть его собственный алгоритм проверки паролей. Ты не должен манипулировать этим, правильным способом проверять, совпадает ли пароль с hash, он используется compare:

if (bcrypt.compareSync(hash1, 'mipassword')) {
  // contraseñas coinciden
}

Ты можешь использовать возможность использовать методы модели, чтобы осуществлять некую логику дела, ассоциируемую с моделью. Например:

UsuarioSchema.statics.login = function ({username, password}, cb) {
  this.findOne({ username }).then(doc => {
    if (!doc) {
      return cb({ success: false, code: 14532 });
    }
    if (!bcrypt.compareSync(doc.password, password)) {
      return cb({ success: false, code: 13622 });
    }
    cb({ success: true, user: doc });
  });
};

И ты бы это использовал так:

Usuario.login(req.body, (response) => {
  if (!response.success) {
    // enviar el mensaje de error de acuerdo al código
  } else {
    // login correcto, generar jwt o sesión
  }
});
0
ответ дан 03.12.2019, 17:58