No tienes acceso a esta clase

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

Implementando JWT Guard

13/22
Recursos

Aportes 5

Preguntas 1

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

SE TE COMPLICO?

DEJA TE HECHO UNA MANITA

1.- Primero creamos el archivo jwt.strategy.ts en el cual agregaremos lo siguiente

import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './constants';
import { TokenPayloadModel } from './models/token.model';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor() {
        super({
            jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
	    // OBTENDREMOS EL TOKEN LOS HEADERS COMO 'Bearer token'
            ignoreExpiration: false,
	    // IGNORA LA EXPIRACION, EN TU CASO EL TIEMPO QUE LE HAYAS PUESTO
	   // EJE.  signOptions: { expiresIn: '24h' }, YO LE PUSE 1 DIA 
            secretOrKey: jwtConstants.secret,
	    // LA LLAVE SECRETA CON LA QUE FIRMAMOS EL TOKEN AL HACER LOGIN
        });
    }
   
   // ESTA FUNCION LO QUE HARA SERA RECIBIR EL TOKEN DECODIFICADO 
   // CON LA CARGA DE DATOS QUE LE PUSIMOS AL HACER LOGIN
    async validate( payload: TokenPayloadModel ) {
        
        return payload;

    }
}

LA FUNCION VALIDATE ES IMPORTANTE YA QUE SI EL TOKEN ES VALIDO POR NUESTRO SERVIDOR, ESTE RETURN DE LA FUNCION MISMA DEVOLVERA EL PAYLOAD AL REQUEST DE NUESTRA RUTA A LA QUE VAYAMOS A PROTEGER, ESTO TE PUEDE SERVIR PARA A BUSCAR EN TU BD AL USUARIO O ALGUN PROCESO QUE REQUIERAS

2.- Lo siguiente es importar nuestra estrategia en nuestro modulo de autenticaci贸n en los providers

鈥渁uth.module.ts鈥

import { JwtStrategy } from './jwt.strategy';

@Module({
    imports: [
        ...Tus imports
    ],
    controllers: [Tus Controllers...],
    providers: [Tus demas providers..., JwtStrategy]
})
export class AuthModule {} 

3.- Ya casi acabamos!, solo falta crear el guardi谩n que proteger谩 nuestrs rutas, creamos un archivo llamado 鈥渏wt.auth.guard.ts鈥 dentro de nuestor modulo de autenticacion

import { HttpException, HttpStatus, Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
    
    // CON ESTA FUNCION DE PODEMOS PERSONALIZAR SI  
    //  QUEREMOS LANZAR ERRORES PERZONALIZADOS 
    handleRequest(err, user, info) {
        if (err || !user) {
            
            throw new HttpException({
                status: HttpStatus.UNAUTHORIZED,
                error: 'Usuario no autorizado',
            }, HttpStatus.UNAUTHORIZED);

        }
        
        return user;

    }

}

4.- Por ultimo solo importamos nuestro guardi谩n en nuestro controlador que queramos proteger

Yo usare mi controlador llamado Pages

y listo, nuestra ruta quedo protegida, para acceder a ella abr铆a que enviar por los headers nuestro token

import { AuthGuard } from '@nestjs/passport';
import { JwtAuthGuard } from 'src/auth/guards/jwt-auth.guard';

@ApiTags('pages')
@UseGuards(JwtAuthGuard) // colocamos nuestro guardi谩n
@Controller('pages')
export class PagesController {
  constructor(private pageService: PageService) { }

  )
  @Get()
  getPages() {
   
    return this.pageService.getAllPages();

  }
 
}

馃憦

隆Excelente clase!

Para guardar el token en postman como variable y utilizarla en las nuevas requests pueden usar el siguiente c贸digo en la pesta帽a de tests:

var jsonData = JSON.parse(responseBody);
pm.environment.set("token", jsonData["access_token"]);

brutal