No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
3 Hrs
48 Min
37 Seg

Conectando Passport con JWT

11/22
Recursos

Aportes 9

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Algo a tener en cuenta es que Nico menciona varias veces que el token está “encriptado” y en realidad los JWT están codificados pero no encriptados por eso no es recomendable colocar información sensible ahí ya que cualquiera puede ver su contenido

npm install --save @nestjs/jwt passport-jwt
npm install --save-dev @types/passport-jwt

Para MongoDB viene desde la base de datos misma _id por tanto para que obtengamos el sub correctamente debemos colocarlo tal como viene de la base de datos.

generateJWT(user: User) {
    const payload: PayloadToken = { role: user.role, sub: user._id };
    return {
      access_token: this.jwtService.sign(payload),
      user,
    };
  }

Para verificar los JWT token generados, pueden utilizar esta herramienta: https://jwt.io

Conectando Passport con JWT

Los JWT nos permiten tener una verificación de que un usuario se a loggeado en la aplicación de manera satisfactoria, validando en nuestra base de datos y si el usuario es correcto, este token actúa como sesión que permite entrar a los Endpoints que deseamos, y con este token le damos permisos al usuario para hacer request.

Los JWT también sirven en aplicaciones móviles.

Nest.js también tiene un paquete para manejar los JWT, veamos que dependencias debemos instalar para manejar JWT con Nest y Passport:

# dependencias
npm install --save @nestjs/jwt passport-jwt

# tipos para desarrollo
npm install --save-dev @types/passport-jwt

Una vez hecho esto, vamos a ir a nuestro servicio de autenticación para pedirle que cuando un usuario haga loggin, genere un JWT.

  • **src/auth/service/auth.service.ts**:
@Injectable()
export class AuthService {

  async generateJwt(user: User) {
    const payload = {
      role: user.role,
      sub: user.id,
    };

    // ...
  }
}

Bien, ahora, como buena práctica deberíamos crear un modelo del payload que estamos retornando, esto en caso de que necesitemos reutilizarlo en nuestra aplicación:

  • **src/auth/models/token.model.ts**:
// exportamos una interfaz que sea lo que esperamos de el token
export interface PayloadToken {
  role: string;
  sub: string;
}

Y luego, lo que nos quedaría sería importar el modelo utilizarlo:

  • **src/auth/service/auth.service.ts**:
import { PayloadToken } from '../models/token.model';
  
@Injectable()
export class AuthService {
	
	async generateJwt(user: User) {
    const payload: PayloadToken = {
      role: user.role,
      sub: user.id,
    };

    // ...
  }
}

Y listo, de esta forma ya tenemos la configuración inicial para crear los JWT.

Para quitar __v y reemplazar _id por id

@Schema()
class User extends Document {
  @Prop({ required: true, unique: true })
  email: string;

  @Prop({ required: true })
  password: string;

  @Prop({ required: true })
  role: string;
}

const UserSchema = SchemaFactory.createForClass(User);

UserSchema.method('toJSON', function () {
  const { __v, _id, password, ...object } = this.toObject();
  object.id = _id;
  return object;
});

export { User, UserSchema };

Si antes de pasar a la siguiente clase tienen un error es por que en la siguiente clase lo resuelven.

No olviden cambiar el Http code: 200 OK

auth.controller.ts

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

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

👏