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

Duvida

Olá, depois de colocar await em frente ao compare, só me retorna "message": "Usuario ou senha inválido!" no postman, sendo a senha correta ou não.

const database = require("../models");
const {compare} = require("bcryptjs")
const {sign} = require("jsonwebtoken")
const jsonSecret = require("../config/jsonSecret")

// dto = "Data Transfer Object"usado para transportar os dados neste caso o login
class AuthService {
  //criar função de usuario no login 
  async login(dto) {
    const usuario = await database.Usuarios.findOne({
      attributes: ["id", "email", "senha"],
      where: {
        email: dto.email,
      },
    });

    if (!usuario) {
      throw new Error("usuario não cadastrado!");
    }

    //verificando senha
    //compare retorna um valor booleano sendo true ou false
    const senhaIguais = await compare(dto.senha, usuario.senha)

    if(!senhaIguais){
        throw new Error('Usuario ou senha inválido!')
    }

    //autenticação- sign tem 3 infos payload secret e options 
    const accessToken = sign({
        id: usuario.id, 
        email: usuario.email
    }, jsonSecret.secret, {
      expiresIn: 86400
    })

    return { accessToken }
  }
}

module.exports = AuthService;
3 respostas
solução!

Depois de colocar await em frente ao compare, o código agora espera o compare retornar antes de continuar. Isso significa que se o compare for rejeitado, o código irá capturar a exceção e retornar o erro "Usuario ou senha inválido!".

Para corrigir isso, você precisa verificar o retorno do compare e retornar um erro diferente se não for verdadeiro. Por exemplo, você pode usar o seguinte código:

const senhaIguais = await compare(dto.senha, usuario.senha)

if(!senhaIguais){ throw new Error('Senha inválida!') } Isso retornará o erro "Senha inválida!" se a senha não for válida.

No postman me retorna agora: Senha inválida! Porém a senha que estou testando na rota /auth/login, é a mesma senha cadastrada na tabela Usuarios no banco de dados.

Criei um arquivo teste e o compare me retorna senha inválida, mesmo colocando senhas fixas iguais.

este é meu codigo atual do projeto real.

const database = require("../models");
const { compare } = require("bcryptjs");
const { sign } = require("jsonwebtoken");
const jsonSecret = require("../config/jsonSecret");

class AuthService {
  async login(dto) {
    console.log("Executando consulta SQL para encontrar o usuário...");
    const usuario = await database.Usuarios.findOne({
      attributes: ["id", "email", "senha"],
      where: {
        email: dto.email,
      },
    });

    if (!usuario) {
      console.log("Usuário não encontrado no banco de dados.");
      throw new Error("Usuário não cadastrado!");
    }

    console.log("Usuário encontrado:", usuario.dataValues);
    console.log("Senha do usuário (do banco de dados):", usuario.senha);
    console.log("Senha do DTO:", dto.senha);

    // Verificando senha
    const senhaIguais = await compare(dto.senha, usuario.senha);

    if (!senhaIguais) {
      console.log("Senha inválida.");
      throw new Error("Senha inválida!");
    }

    // Autenticação - sign tem 3 infos: payload, secret e options
    const accessToken = sign(
      {
        id: usuario.id,
        email: usuario.email,
      },
      jsonSecret.secret,
      {
        expiresIn: 86400,
      }
    );
    console.log(jsonSecret.secret);

    return { accessToken };
  }
}

module.exports = AuthService;

O meu console me retorna os dados mas a comparação das senhas ainda esta dando erro:

Executing (default): SELECT id, email, senha FROM Usuarios AS Usuarios WHERE Usuarios.email = 'teste@teste.com' LIMIT 1; Usuário encontrado: { id: 94, email: 'teste@teste.com', senha: '123' } Senha do usuário (do banco de dados): 123 Senha do DTO: 123 Senha inválida.

Consegui resolver. Eu estava comparando a senha , por exempl: '123' , com a senha criptograda do banco. Realizei alguns ajustes no controller de usuario e no service de usuario. E obtive sucesso, obrigada :)