Menu
CoddyTech

Гарды

Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 14 из 17.

Любой может создавать или удалять задачи. Защитник решает, может ли запрос попасть в обработчик: Nest вызывает его canActivate, и если метод возвращает false, Nest отвечает 403 Forbidden, не запуская метод.

@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() возвращает запрос; Node хранит названия его заголовков в нижнем регистре, поэтому читайте request.headers['x-api-key']. @UseGuards у метода защищает этот метод. У класса контроллера он защищает каждый метод в нём.

challenge icon

Задание

Легко
  • Заверши ApiKeyGuard: пропускай запрос только в том случае, если его заголовок x-api-key совпадает с process.env.API_KEY (в этом уроке задано значение tasks-key-123).
  • Защити POST /tasks и DELETE /tasks/:id; чтение остаётся открытым.
  • Отправь POST /tasks с заголовком title: 403. Добавь заголовок x-api-key: tasks-key-123 и отправь запрос ещё раз: 201. На GET /tasks приходит ответ и без него.

Попробуйте сами

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

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // Пропускайте запрос только тогда, когда его заголовок x-api-key
        // совпадает с process.env.API_KEY.
        return true;
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела TypeScript и NestJS