Menu
CoddyTech

Guardas

Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 18 de 24.

Qualquer pessoa pode criar ou excluir tarefas. Um guard decide se uma solicitação pode chegar ao seu manipulador: o Nest chama seu canActivate e, quando ele retorna false, o Nest responde com 403 Forbidden sem executar o método.

@Injectable()
export class OpenHoursGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        const hour = new Date().getHours();
        return hour >= 9 && hour < 17;
    }
}

@Post()
@UseGuards(OpenHoursGuard)
book() {}

context.switchToHttp().getRequest() fornece a solicitação; o Node armazena os nomes dos cabeçalhos em minúsculas, então leia request.headers['x-api-key']. @UseGuards em um método protege esse método. Na classe do controlador, protege todos os métodos dela.

challenge icon

Desafio

Fácil

No momento, qualquer pessoa pode criar ou excluir tarefas. Proteja as duas rotas que alteram dados com uma chave de API: um segredo que o cliente envia em um cabeçalho da solicitação. A leitura continua aberta a todos.

  1. Abra src/common/api-key.guard.ts. No método canActivate de ApiKeyGuard, leia o cabeçalho x-api-key da solicitação. context.switchToHttp().getRequest() fornece a solicitação, e os nomes dos cabeçalhos são sempre escritos em minúsculas.
  2. Retorne true somente quando esse cabeçalho for igual a process.env.API_KEY, que esta lição define como tasks-key-123. Retorne false em todos os outros casos, inclusive quando o cabeçalho estiver ausente. Quando o guard retorna false, o Nest responde com 403 e não executa o método da rota.
  3. Em src/tasks/tasks.controller.ts, importe ApiKeyGuard de ../common/api-key.guard e UseGuards de @nestjs/common. Coloque @UseGuards(ApiKeyGuard) no método create (POST /tasks) e no método remove (DELETE /tasks/:id). Não o coloque na classe: isso também protegeria as rotas GET.
  4. GET /tasks, GET /tasks/:id e GET /stats continuam funcionando sem uma chave.

Experimente: envie POST { "title": "Buy milk" } para /tasks sem cabeçalho. Você recebe 403:

{ "message": "Forbidden resource", "error": "Forbidden", "statusCode": 403 }

Abra o campo Headers da barra de solicitação, adicione a linha x-api-key: tasks-key-123 e envie o POST novamente: 201 e a nova tarefa. Com x-api-key: guess, você recebe 403. DELETE /tasks/4 também precisa da chave: 403 sem ela, 204 com ela. GET /tasks funciona sem nenhum cabeçalho.

Experimente você mesmo

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // Permita a passagem da requisição somente quando seu cabeçalho x-api-key
        // for igual a process.env.API_KEY.
        return true;
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de TypeScript e NestJS

Pratique por conta própria: Playground de Express