Menu
CoddyTech

Gardes

Fait partie de la section TypeScript et NestJS du Journey Node.js de Coddy. Leçon 18 sur 24.

N’importe qui peut créer ou supprimer des tâches. Une garde décide si une requête peut atteindre son gestionnaire : Nest appelle son canActivate et, lorsque celui-ci renvoie false, Nest répond 403 Forbidden sans exécuter la méthode.

@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() fournit la requête ; Node stocke les noms de ses en-têtes en minuscules, donc lis request.headers['x-api-key']. @UseGuards sur une méthode protège cette méthode. Sur la classe du contrôleur, il protège toutes les méthodes qu’elle contient.

challenge icon

Défi

Facile

Pour l’instant, tout le monde peut créer ou supprimer des tâches. Protégez les deux routes qui modifient les données à l’aide d’une clé API : un secret que le client envoie dans un en-tête de requête. La lecture reste accessible à tout le monde.

  1. Ouvrez src/common/api-key.guard.ts. Dans la méthode canActivate de ApiKeyGuard, lisez l’en-tête x-api-key de la requête. context.switchToHttp().getRequest() vous donne accès à la requête, et les noms de ses en-têtes sont toujours en minuscules.
  2. Renvoyez true uniquement lorsque cet en-tête est égal à process.env.API_KEY, que cette leçon définit sur tasks-key-123. Renvoyez false dans tous les autres cas, y compris lorsque l’en-tête est absent. Lorsque le garde renvoie false, Nest répond avec le code 403 et n’exécute jamais la méthode de la route.
  3. Dans src/tasks/tasks.controller.ts, importez ApiKeyGuard depuis ../common/api-key.guard, et UseGuards depuis @nestjs/common. Ajoutez @UseGuards(ApiKeyGuard) à la méthode create (POST /tasks) et à la méthode remove (DELETE /tasks/:id). Ne l’ajoutez pas à la classe : cela protégerait aussi les routes GET.
  4. GET /tasks, GET /tasks/:id et GET /stats continuent de fonctionner sans clé.

Essayez : envoyez { "title": "Buy milk" } à /tasks avec une requête POST sans en-tête. Vous obtenez 403 :

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

Ouvrez le champ Headers de la barre de requête, ajoutez la ligne x-api-key: tasks-key-123, puis envoyez à nouveau la requête POST : vous obtenez 201 et la nouvelle tâche. Avec x-api-key: guess, vous obtenez 403. DELETE /tasks/4 nécessite également la clé : 403 sans elle, 204 avec elle. GET /tasks fonctionne sans aucun en-tête.

Essayez vous-même

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

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // N'autoriser la requête que si son en-tête x-api-key
        // est égal à process.env.API_KEY.
        return true;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de TypeScript et NestJS

Entraînez-vous par vous-même : Playground Express