Menu
CoddyTech

Guards

Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 18 von 24.

Jeder kann Aufgaben erstellen oder löschen. Ein Guard entscheidet, ob eine Anfrage ihren Handler erreichen darf: Nest ruft dessen canActivate auf, und wenn dieser false zurückgibt, antwortet Nest mit 403 (Zugriff verboten), ohne die Methode auszuführen.

@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() liefert die Anfrage. Node speichert die Namen ihrer Header in Kleinbuchstaben, lies also request.headers['x-api-key']. @UseGuards an einer Methode schützt diese Methode. An der Controller-Klasse schützt es jede darin enthaltene Methode.

challenge icon

Aufgabe

Einfach

Im Moment kann jeder Aufgaben erstellen oder löschen. Sichere die beiden Routen, die Daten ändern, mit einem API-Schlüssel: einem Geheimnis, das der Client in einem Anfrage-Header mitsendet. Das Lesen bleibt für alle offen.

  1. Öffne src/common/api-key.guard.ts. Lies in der Methode canActivate von ApiKeyGuard den x-api-key-Header der Anfrage aus. context.switchToHttp().getRequest() liefert dir die Anfrage, und ihre Header-Namen sind immer kleingeschrieben.
  2. Gib nur dann true zurück, wenn dieser Header mit process.env.API_KEY übereinstimmt, das in dieser Lektion auf tasks-key-123 gesetzt wird. Gib in allen anderen Fällen false zurück, auch wenn der Header fehlt. Wenn der Guard false zurückgibt, antwortet Nest mit 403 und führt die Methoden der Route nicht aus.
  3. Importiere in src/tasks/tasks.controller.ts ApiKeyGuard aus ../common/api-key.guard und UseGuards aus @nestjs/common. Setze @UseGuards(ApiKeyGuard) auf die Methode create (POST /tasks) und auf die Methode remove (DELETE /tasks/:id). Setze es nicht auf die Klasse: Dadurch würden auch die GET-Routen gesperrt.
  4. GET /tasks, GET /tasks/:id und GET /stats funktionieren weiterhin ohne Schlüssel.

Probiere es aus: Sende { "title": "Buy milk" } per POST an /tasks, ohne Header. Du erhältst 403:

{ "message": "Forbidden resource", "error": "Forbidden", "statusCode": 403 }

Öffne das Feld „Headers“ in der Anfrageleiste, füge die Zeile x-api-key: tasks-key-123 hinzu und sende die POST-Anfrage erneut: Du erhältst 201 und die neue Aufgabe. Mit x-api-key: guess erhältst du 403. Auch für DELETE /tasks/4 wird der Schlüssel benötigt: ohne Schlüssel 403, mit Schlüssel 204. GET /tasks funktioniert ganz ohne Header.

Probier es selbst

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

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // Lasse die Anfrage nur durch, wenn ihr x-api-key-Header
        // mit process.env.API_KEY übereinstimmt.
        return true;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in TypeScript und NestJS

Übe selbstständig: Express-Playground