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.
Desafio
FácilNo 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.
- Abra
src/common/api-key.guard.ts. No métodocanActivatedeApiKeyGuard, leia o cabeçalhox-api-keyda solicitação.context.switchToHttp().getRequest()fornece a solicitação, e os nomes dos cabeçalhos são sempre escritos em minúsculas. - Retorne
truesomente quando esse cabeçalho for igual aprocess.env.API_KEY, que esta lição define comotasks-key-123. Retornefalseem todos os outros casos, inclusive quando o cabeçalho estiver ausente. Quando o guard retornafalse, o Nest responde com 403 e não executa o método da rota. - Em
src/tasks/tasks.controller.ts, importeApiKeyGuardde../common/api-key.guardeUseGuardsde@nestjs/common. Coloque@UseGuards(ApiKeyGuard)no métodocreate(POST /tasks) e no métodoremove(DELETE /tasks/:id). Não o coloque na classe: isso também protegeria as rotas GET. GET /tasks,GET /tasks/:ideGET /statscontinuam 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;
}
}
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
1Fundamentos do Nest
Classes e métodosOlá, NestRegistrando um controller4Guardas, filtros e interceptadores
GuardasPratique por conta própria: Playground de Express