🛡️

Módulo 18: Guards e Interceptors (Segurança)

2. Resumo da Aula Anterior

No Módulo 17, vimos como passar parâmetros pelas rotas e como tornar o site super rápido com o Lazy Loading. Agora, vamos lidar com a segurança: como impedir que utilizadores não autorizados entrem em certas páginas e como gerir tokens de autenticação de forma automática.

3. O Que Vais Aprender Hoje

4. Teoria: Os Sentinelas da App

Route Guards: São funções que o Router executa antes de carregar um componente. Se a função devolver `false`, a navegação é cancelada e o utilizador não entra.

Interceptors: São "filtros" para as tuas chamadas HTTP. Imagina que tens 50 serviços a pedir dados à API. Em vez de escreveres o código do Token (JWT) em todos eles, o Interceptor "agarra" no pedido antes de ele sair do browser e coloca o selo de segurança.

🛂 Analogia: O Prédio de Escritórios

Imagina um edifício empresarial de alta segurança:

  • Route Guard (O Segurança da Porta): Tu tentas carregar o elevador para o 10º andar (Área Admin). O segurança pede-te o cartão. Se não tiveres, ele nem te deixa entrar no elevador.
  • Interceptor (O Estafeta Interno): Tu escreves uma carta (Pedido HTTP) para o armazém. Tu apenas escreves o conteúdo. O estafeta pega na tua carta e, antes de a enviar pelo correio, coloca-lhe o carimbo oficial da empresa e o selo de prioridade (Headers/Tokens) automaticamente.

5. Exemplos Práticos

Exemplo 1: Functional Guard (canActivate)

Uma função simples que verifica o acesso.

export const authGuard: CanActivateFn = (route, state) => {
  const authService = inject(AuthService);
  const router = inject(Router);

  if (authService.isLoggedIn()) {
    return true; // Pode passar!
  } else {
    return router.parseUrl('/login'); // Redireciona para o login
  }
};

// Nas rotas:
{ path: 'admin', component: AdminComp, canActivate: [authGuard] }

Exemplo 2: O Interceptor de Tokens

Adicionar o Header de autorização a todos os pedidos.

export const authInterceptor: HttpInterceptorFn = (req, next) => {
  const token = localStorage.getItem('token');

  // Clonamos o pedido para adicionar o cabeçalho
  const authReq = req.clone({
    setHeaders: { Authorization: `Bearer ${token}` }
  });

  return next(authReq); // Deixa o pedido seguir viagem
};

Exemplo 3: Registro no app.config.js

Dizer ao Angular para usar o interceptor.

providers: [
  provideHttpClient(
    withInterceptors([authInterceptor])
  )
]

6. Agora é a Tua Vez!

Vamos criar o "Cofre Digital":

  1. Cria uma rota /cofre que aponte para um CofreComponent.
  2. Cria um **Functional Guard** que verifica se existe uma variável no localStorage chamada 'acessoPermitido'.
  3. Aplica o guard à rota do cofre. Se tentares entrar sem o valor no storage, o Angular deve barrar-te!
  4. Cria um **Interceptor** que faz um console.log de toda a URL de cada pedido que o site fizer.
  5. Regista o interceptor no teu app.config.ts e observa a magia na consola enquanto navegas.

7. Verificação de Conhecimento

Carregando quiz...

8. Resumo do Que Aprendemos

9. Desafios Práticos

Desafio 1: Invasão de URL

Se um "hacker" mudar o código do teu Guard no browser para return true, ele consegue ver os teus dados privados?

Desafio 2: Interceptor de Erros

É possível usar um Interceptor para mostrar um alert() automaticamente se o servidor devolver um erro 500?

Desafio 3: Guard de Saída

Imagina que o utilizador está a preencher um formulário gigante e clica num link para sair sem sem querer. Que tipo de Guard podes usar para mostrar um aviso "Tens a certeza que queres sair sem guardar?"

« Aula Anterior Próxima Aula »