Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

senhaHash: undefined

O usuário está vindo com a senhaHash undefined, mesmo no banco de dados estando correto, ao passar para a função verificaSenha(). O Erro que está dando na rota /usuario/login com metodo post:

Error: data and hash arguments required
    at Object.compare (C:\xampp\htdocs\alura-nodeJS\blog-do-codigo-aula-0\node_modules\bcrypt\bcrypt.js:209:17)
    at C:\xampp\htdocs\alura-nodeJS\blog-do-codigo-aula-0\node_modules\bcrypt\promises.js:29:12
    at new Promise (<anonymous>)
    at Object.module.exports.promise (C:\xampp\htdocs\alura-nodeJS\blog-do-codigo-aula-0\node_modules\bcrypt\promises.js:20:12)
    at Object.compare (C:\xampp\htdocs\alura-nodeJS\blog-do-codigo-aula-0\node_modules\bcrypt\bcrypt.js:205:25)
    at verificaSenha (C:\xampp\htdocs\alura-nodeJS\blog-do-codigo-aula-0\src\usuarios\estrategia-autenticacao.js:18:36)
    at Strategy._verify (C:\xampp\htdocs\alura-nodeJS\blog-do-codigo-aula-0\src\usuarios\estrategia-autenticacao.js:38:13)

codigo


async function verificaSenha(senha, senhaHash) {

  const senhaValida = await bcrypt.compare(senha, senhaHash);
  if(!senhaValida) {
    throw new InvalidArgumentError('E-mail ou senha inválidos');
  }
}

passport.use(
  new LocalStrategy({
    usernameField: 'email',
    passwordField: 'senha',
    session: false
  },
  async (email, senha, done) => { 

    try {
      const usuario = await Usuario.buscaPorEmail(email); 
      verificaUsuario(usuario);
      console.log('AQUI', senha , ' || ', usuario.senhaHash, ' || ', usuario, ' || ', usuario.email);
      await verificaSenha(senha, usuario.senhaHash); 

      done(null, usuario);

    } catch(err) {

      done(err);
    }
  })
)
2 respostas

Olá. Resolvi o problema já kkk, eu estava quebrando a cabeça mais aí fiz uns console.log() e achei a raiz do problema. Na função buscaPorEmail(email) no usuarios-modelo.js está retornando um 'new Usuario(usuario)' e assim quebra o usuario pois o atributo senhaHash vem como undefined. Então eu mudei pra retornar somente o 'usuario' mesmo ao invés de retornar uma instância do mesmo... Tem problema se fizer assim?

ficou assim minha function agora

  static async buscaPorEmail(email) {
    const usuario = await usuariosDao.buscaPorEmail(email);
    console.log('Usuario buscaPorEmail() Model: ', usuario);
    if (!usuario) {
      return null;
    }
    // console.log('NEW Usuario: ', new Usuario(usuario));
    // return new Usuario(usuario);
    return usuario;
  }
solução!

Na verdade o real problema é que eu esqueci de mudar lá no constructor do model Usuario para this.senhaHash = usuario.senhaHash Segue como era meu código antes kk, agora arrumei e está funcionando corretamente.

class Usuario {
  constructor(usuario) {
    this.id = usuario.id;
    this.nome = usuario.nome;
    this.email = usuario.email;
    this.senhaHash = usuario.senha;  // aqui estava o problema desde o princípio

    this.valida();
  }