omnichannel-backend/src/modules/auth/guards/jwt-auth.guard.ts
Rafael Lopes 59db214ed9
Some checks are pending
Deploy Dev / deploy (push) Waiting to run
FEAT: Implementada segurança JWT e controle de acesso
- Adicionado JwtAuthGuard global para validar tokens nas rotas privadas
- Adicionados decorators Public e Roles para separar rotas públicas e permissões
- Adicionado RolesGuard para proteger rotas administrativas por perfil
- Rotas privadas passam a exigir Authorization Bearer Token
- WebSocket do WhatsApp passa a exigir JWT no handshake
- Adicionado rate limit global com @nestjs/throttler
- Adicionado LoginDto e ValidationPipe para validar payload de login
- Extraído SQL de acesso do usuário para UserAccessRepository
- Melhorados logs de login LDAP/Microsoft sem expor dados sensíveis
2026-05-29 12:13:44 -03:00

50 lines
1.2 KiB
TypeScript

import {
CanActivate,
ExecutionContext,
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { IS_PUBLIC_KEY } from '../decorators/public.decorator';
import { AuthTokenService } from '../auth-token.service';
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(
private readonly reflector: Reflector,
private readonly authToken: AuthTokenService,
) {}
canActivate(context: ExecutionContext) {
const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
context.getHandler(),
context.getClass(),
]);
if (isPublic) {
return true;
}
const request = context.switchToHttp().getRequest();
const token = this.extractBearerToken(request.headers?.authorization);
if (!token) {
throw new UnauthorizedException('Token de autenticação não informado');
}
request.user = this.authToken.verifyToken(token);
return true;
}
private extractBearerToken(authorization?: string) {
const [type, token] = String(authorization || '').split(' ');
if (type?.toLowerCase() !== 'bearer' || !token) {
return null;
}
return token;
}
}