Гарды
Часть раздела 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 у метода защищает этот метод. У класса контроллера он защищает каждый метод в нём.
Задание
Легко- Заверши
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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.