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.
Aufgabe
EinfachIm 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.
- Öffne
src/common/api-key.guard.ts. Lies in der MethodecanActivatevonApiKeyGuarddenx-api-key-Header der Anfrage aus.context.switchToHttp().getRequest()liefert dir die Anfrage, und ihre Header-Namen sind immer kleingeschrieben. - Gib nur dann
truezurück, wenn dieser Header mitprocess.env.API_KEYübereinstimmt, das in dieser Lektion auftasks-key-123gesetzt wird. Gib in allen anderen Fällenfalsezurück, auch wenn der Header fehlt. Wenn der Guardfalsezurückgibt, antwortet Nest mit 403 und führt die Methoden der Route nicht aus. - Importiere in
src/tasks/tasks.controller.tsApiKeyGuardaus../common/api-key.guardundUseGuardsaus@nestjs/common. Setze@UseGuards(ApiKeyGuard)auf die Methodecreate(POST /tasks) und auf die Methoderemove(DELETE /tasks/:id). Setze es nicht auf die Klasse: Dadurch würden auch die GET-Routen gesperrt. GET /tasks,GET /tasks/:idundGET /statsfunktionieren 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;
}
}
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