Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Sugestão/Dúvida: Exception no método de extrair token

(É uma sugestão e uma dúvida ao mesmo tempo) No final da aula, na linha 22 a Camila fez um ternário verificando se existe um Bearer no authorization do header, se não existe, ela retorna um undefined. A minha dúvida/sugestão é: Não seria melhor lançar uma Exception ao invés de retornar undefined? pois evitaria fazer aquele if no canActivate e acho que seria uma "boa prática" não retornar undefined?

1 resposta
solução!

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>