Menu
CoddyTech

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ę.

challenge icon

Wyzwanie

Łatwy

W 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.

  1. Otwórz src/common/api-key.guard.ts. W metodzie canActivate klasy ApiKeyGuard odczytaj nagłówek x-api-key żądania. context.switchToHttp().getRequest() zwraca żądanie, a nazwy jego nagłówków są zawsze zapisane małymi literami.
  2. Zwracaj true tylko wtedy, gdy ten nagłówek jest równy process.env.API_KEY, któremu ta lekcja przypisuje wartość tasks-key-123. We wszystkich pozostałych przypadkach zwracaj false, również wtedy, gdy brakuje nagłówka. Gdy strażnik zwraca false, Nest odpowiada kodem 403 i nie uruchamia metody endpointu.
  3. W pliku src/tasks/tasks.controller.ts zaimportuj ApiKeyGuard z ../common/api-key.guard oraz UseGuards z @nestjs/common. Umieść @UseGuards(ApiKeyGuard) przy metodzie create (POST /tasks) i metodzie remove (DELETE /tasks/:id). Nie umieszczaj go przy klasie, bo wtedy zabezpieczone zostałyby również endpointy GET.
  4. GET /tasks, GET /tasks/:id i GET /stats nadal 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;
    }
}
quiz iconSprawdź się

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