Olá Renan! Tudo bem?
Essa é uma excelente sugestão e uma dúvida muito válida! No contexto de desenvolvimento de aplicações, lançar uma exceção quando algo não está conforme o esperado pode ser uma prática bastante útil para garantir que erros sejam tratados de maneira consistente e que o fluxo de execução do código seja interrompido quando necessário.
No caso específico de extrair um token do cabeçalho de autorização, lançar uma exceção quando o token não está presente ou não está no formato esperado (como "Bearer ") pode ajudar a garantir que o fluxo de autenticação seja interrompido imediatamente, evitando que o código continue a execução com um estado inválido.
Por exemplo, ao lançar uma exceção como UnauthorizedException
, você pode garantir que o usuário receba uma resposta clara e imediata de que algo está errado com a autenticação, sem a necessidade de verificações adicionais no método canActivate
.
Aqui está como você poderia implementar isso:
import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common';
import { Request } from 'express';
@Injectable()
export class AutenticacaoGuard implements CanActivate {
async canActivate(contexto: ExecutionContext): Promise<boolean> {
const requisicao = contexto.switchToHttp().getRequest();
const token = this.extrairTokenDoCabecalho(requisicao);
if (!token) {
throw new UnauthorizedException('Erro de autenticação');
}
return true;
}
private extrairTokenDoCabecalho(requisicao: Request): string {
const [tipo, token] = requisicao.headers.authorization?.split(' ') ?? [];
if (tipo !== 'Bearer' || !token) {
throw new UnauthorizedException('Token inválido ou ausente');
}
return token;
}
}
Neste exemplo, a função extrairTokenDoCabecalho
lança uma exceção se o token não estiver presente ou não estiver no formato correto. Isso elimina a necessidade de verificações adicionais no canActivate
, tornando o código mais limpo e fácil de manter.
Espero ter ajudado e bons estudos!
<div style="display: inline-block; padding: 4px 4px; background: #06B9A1; color: white; font-size: 1em; font-style: italic; border: 1px dashed #FFF">Caso este post tenha lhe ajudado, por favor, <strong>marcar como solucionado <span style="color: white;">✓</span></strong>.</div>