No tienes acceso a esta clase

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

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谩 鈥渆ncriptado鈥 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

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 };

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.

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;
  }
}

馃憦