Strażnicy
Część sekcji TypeScript i NestJS ścieżki Node.js w Coddy. Lekcja 18 z 24.
Każdy może tworzyć lub usuwać zadania. Guard decyduje, czy żądanie może dotrzeć do jego obsługi: Nest wywołuje jego canActivate, a gdy zwraca false, Nest odpowiada statusem 403 Forbidden, nie uruchamiając metody.
@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() zwraca żądanie; Node przechowuje nazwy jego nagłówków małymi literami, więc odczytaj request.headers['x-api-key']. @UseGuards zastosowane do metody chroni tę metodę. Zastosowane do klasy kontrolera chroni każdą jej metodę.
Wyzwanie
ŁatwyW tej chwili każdy może tworzyć i usuwać zadania. Zabezpiecz dwa endpointy zmieniające dane za pomocą klucza API: sekretu, który klient wysyła w nagłówku żądania. Odczyt pozostaje dostępny dla wszystkich.
- Otwórz
src/common/api-key.guard.ts. W metodziecanActivateklasyApiKeyGuardodczytaj nagłówekx-api-keyżądania.context.switchToHttp().getRequest()zwraca żądanie, a nazwy jego nagłówków są zawsze zapisane małymi literami. - Zwracaj
truetylko wtedy, gdy ten nagłówek jest równyprocess.env.API_KEY, któremu ta lekcja przypisuje wartośćtasks-key-123. We wszystkich pozostałych przypadkach zwracajfalse, również wtedy, gdy brakuje nagłówka. Gdy strażnik zwracafalse, Nest odpowiada kodem 403 i nie uruchamia metody endpointu. - W pliku
src/tasks/tasks.controller.tszaimportujApiKeyGuardz../common/api-key.guardorazUseGuardsz@nestjs/common. Umieść@UseGuards(ApiKeyGuard)przy metodziecreate(POST /tasks) i metodzieremove(DELETE /tasks/:id). Nie umieszczaj go przy klasie, bo wtedy zabezpieczone zostałyby również endpointy GET. GET /tasks,GET /tasks/:idiGET /statsnadal działają bez klucza.
Wypróbuj: Wyślij POST z treścią { "title": "Buy milk" } do /tasks, bez nagłówka. Otrzymasz kod 403:
{ "message": "Forbidden resource", "error": "Forbidden", "statusCode": 403 }Otwórz pole Headers na pasku żądania, dodaj wiersz x-api-key: tasks-key-123 i ponownie wyślij żądanie POST: otrzymasz kod 201 i nowe zadanie. Przy użyciu x-api-key: guess otrzymasz kod 403. DELETE /tasks/4 również wymaga klucza: bez niego otrzymasz kod 403, a z nim — 204. GET /tasks działa nawet bez nagłówka.
Spróbuj swoich sił
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiKeyGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
// Przepuść żądanie tylko wtedy, gdy jego nagłówek x-api-key
// jest równy process.env.API_KEY.
return true;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji TypeScript i NestJS
Poćwicz samodzielnie: Edytor online Express