No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Ruta de login

10/22
Recursos

Aportes 16

Preguntas 8

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

No es mejor practica crear un LoginDto?

  login(@Body() loginDTO: LoginDto) {
    return this.authService.generateJWT(loginDTO);
  }

En mongo puedes pasar un segundo parametro al find o findOne que te permite ocultar o mostrar los campos que te devuelve la consulta, para el caso seria:

userModel.find({ email: email }, { password: 0 } )

Creo que el codigo del final del metodo validateUser quedaria mas limpio si lo tenemos de la siguiente manera:

async validateUser(email: string, password: string) {
    const user = await this.usersService.findByEmail(email)
    if (!user) {
      return null
    }
    const isMatch = await bcrypt.compare(password, user.password)
    if (isMatch) {
      const { password, ...rta } = user.toJSON()
      return rta
    }
    return null
  }

En vez de usar if鈥檚 nidados, mejor tenemos un early return. Asi nos aseguramos que user exista y podemos acceder a user.password.

Buenas, el Login no me funcionaba

Estuve teniendo un 401 鈥渘ot allow鈥 al intentar loguearme y lo correg铆 de la siguiente manera.
El problema que ten铆a ven铆a de src/users/users.service.ts
En el c贸digo que venimos trabajando la conuslta por email est谩 de la siguiente forma:

findByEmail(email: string) {
    return this.userModel.findOne({ email }).exec();
  }

Mi problema era que nunca pod铆a loguearme, la razon es que la consulta a la BD es una promesa que no se resolv铆a antes de continuar con el flujo. Obteniendo siempre un user=null.
Desde entonces la tengo como una funci贸n as铆ncrona. Ej:

   async findByEmail(email: string) {
        const userEncontrado = await this.userModel.findOne({ email }).exec();
        return userEncontrado;
    }

De 茅sta forma resolv铆 el problema que ten铆a. Lo dejo ac谩 por si alguno tiene el mismo problema.
Saludos

Error en la salida (req.user) Property 鈥渦ser鈥 doesn鈥檛 exist


Me salio este error cuando intente de ejecutar la aplicaci贸n, encontre que tenia que ver con el namespace, pero las soluciones estaban muy confusas, pero en la documentaci贸n hay otro metodo sin usar express.

import { Controller, Post, Request, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller('auth')
export class AuthController {
  @UseGuards(AuthGuard('local'))
  @Post()
  login(@Request() req) {
    return req.user;
  }
}

En el controlador importamos de common el decorador Request y nuestra funci贸n login colocamos el decorador con el 鈥渞eq鈥 y funciona igual. 馃樃

nest generate controller auth/controllers/auth

Para evitar enviar informaci贸n sensible en mi respuesta del controlador (passwords, etc) la mejor t茅cnica es serializar, defino desde mi entity que info no debo compartir asi evito tener que hacer modificaciones de mi respuesta en cada enpoint https://platzi.com/clases/2282-nestjs-typeorm/37326-serializar/

Esta Clase, al finalizar鈥alta a 鈥淐onfigurando mongo atlas鈥 y no a 鈥渃onectando passport con jwt鈥.

Usando Postgrest con Swagger

Usuario con datos err贸neos:

Usuario con datos correctos:

Configurar VSCODE para hacer debugging en NestJs

Para configurar vscode para debuguear el c贸digo, demos:

  • Ir a a la pesta帽a Run and Debug o Ctrl + Shipt + D

  • Crear un archivo launch.json con create a launch.json file.

  • Pegar el siguiente c贸digo.

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${file}",
            "preLaunchTask": "tsc: build - tsconfig.json",
            "outFiles": [
                "${workspaceFolder}/dist/**/*.js"
            ]
        }
    ]
}
  • En la pesta帽a Run and Debug abrimos la lista desplegable, seleccionamos Run Script: start:debug

  • Dejamos que nuestro sistema transpile.

  • Una vez terminada la transpilaci贸n, podremos debuguear nuestro c贸digo con nestjs.

nest g co auth/controllers/auth --flat

hice una cambio de estructura en la validaci贸n para una mejor lectura del c贸digo, se las comparto:

async validateUSer(email: string, password: string) {
    const user = await this.userService.findByEmail(email);
    if (!user) {
      return null;
    }
    const isMatch = await bcrypt.compare(password, user.password);
    return isMatch ? user : null;
  }

Les dejo por aca algo que hice para reciba email o username, espero les sirva

  async findOneByEmailOrUsername(username: string) {
    const type = isEmail(username);
    if (type) {
      return await this.usersRepository.findOne({
        where: { email: username },
      });
    }
    if (!type) {
      return await this.usersRepository.findOne({
        where: { username },
      });
    }
  }

Login exitoso

Login fallido

馃憦