Sistema NEXUS v3.4 migrado con: Estructura principal: - core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles) - core/catalog: Catalogo de funcionalidades reutilizables - shared/knowledge-base: Base de conocimiento compartida - devtools/scripts: Herramientas de desarrollo - control-plane/registries: Control de servicios y CI/CD - orchestration/: Configuracion de orquestacion de agentes Proyectos incluidos (11): - gamilit (submodule -> GitHub) - trading-platform (OrbiquanTIA) - erp-suite con 5 verticales: - erp-core, construccion, vidrio-templado - mecanicas-diesel, retail, clinicas - betting-analytics - inmobiliaria-analytics - platform_marketing_content - pos-micro, erp-basico Configuracion: - .gitignore completo para Node.js/Python/Docker - gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git) - Sistema de puertos estandarizado (3005-3199) Generated with NEXUS v3.4 Migration System EPIC-010: Configuracion Git y Repositorios
91 lines
2.3 KiB
TypeScript
91 lines
2.3 KiB
TypeScript
/**
|
|
* JWT AUTH GUARD - REFERENCE IMPLEMENTATION
|
|
*
|
|
* @description Guard de autenticación JWT para proteger rutas.
|
|
* Activa la estrategia JWT y maneja errores de autenticación.
|
|
*
|
|
* @usage
|
|
* ```typescript
|
|
* @Get('protected')
|
|
* @UseGuards(JwtAuthGuard)
|
|
* getProtectedData(@Request() req) {
|
|
* return req.user;
|
|
* }
|
|
* ```
|
|
*
|
|
* @origin gamilit/apps/backend/src/modules/auth/guards/jwt-auth.guard.ts
|
|
*/
|
|
|
|
import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common';
|
|
import { AuthGuard } from '@nestjs/passport';
|
|
import { Reflector } from '@nestjs/core';
|
|
|
|
/**
|
|
* Metadata key para rutas públicas
|
|
*/
|
|
export const IS_PUBLIC_KEY = 'isPublic';
|
|
|
|
@Injectable()
|
|
export class JwtAuthGuard extends AuthGuard('jwt') {
|
|
constructor(private readonly reflector: Reflector) {
|
|
super();
|
|
}
|
|
|
|
/**
|
|
* Determinar si la ruta requiere autenticación
|
|
*
|
|
* @description Verifica el decorador @Public() antes de activar el guard.
|
|
* Si la ruta es pública, permite el acceso sin token.
|
|
*/
|
|
canActivate(context: ExecutionContext) {
|
|
// Verificar si la ruta tiene @Public()
|
|
const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
|
|
context.getHandler(),
|
|
context.getClass(),
|
|
]);
|
|
|
|
if (isPublic) {
|
|
return true;
|
|
}
|
|
|
|
// Activar validación JWT normal
|
|
return super.canActivate(context);
|
|
}
|
|
|
|
/**
|
|
* Manejar resultado de autenticación
|
|
*
|
|
* @description Personaliza el mensaje de error cuando falla la autenticación.
|
|
*/
|
|
handleRequest(err: Error | null, user: any, info: Error | null) {
|
|
if (err || !user) {
|
|
if (info?.message === 'jwt expired') {
|
|
throw new UnauthorizedException('Token expirado');
|
|
}
|
|
if (info?.message === 'No auth token') {
|
|
throw new UnauthorizedException('Token no proporcionado');
|
|
}
|
|
throw new UnauthorizedException('No autorizado');
|
|
}
|
|
return user;
|
|
}
|
|
}
|
|
|
|
// ============ DECORADOR PUBLIC ============
|
|
|
|
import { SetMetadata } from '@nestjs/common';
|
|
|
|
/**
|
|
* Decorador para marcar rutas como públicas
|
|
*
|
|
* @usage
|
|
* ```typescript
|
|
* @Public()
|
|
* @Get('health')
|
|
* healthCheck() {
|
|
* return { status: 'ok' };
|
|
* }
|
|
* ```
|
|
*/
|
|
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
|