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.
Défi
FacilePour 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.
- Ouvrez
src/common/api-key.guard.ts. Dans la méthodecanActivatedeApiKeyGuard, lisez l’en-têtex-api-keyde 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. - Renvoyez
trueuniquement lorsque cet en-tête est égal àprocess.env.API_KEY, que cette leçon définit surtasks-key-123. Renvoyezfalsedans tous les autres cas, y compris lorsque l’en-tête est absent. Lorsque le garde renvoiefalse, Nest répond avec le code 403 et n’exécute jamais la méthode de la route. - Dans
src/tasks/tasks.controller.ts, importezApiKeyGuarddepuis../common/api-key.guard, etUseGuardsdepuis@nestjs/common. Ajoutez@UseGuards(ApiKeyGuard)à la méthodecreate(POST /tasks) et à la méthoderemove(DELETE /tasks/:id). Ne l’ajoutez pas à la classe : cela protégerait aussi les routes GET. GET /tasks,GET /tasks/:idetGET /statscontinuent 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;
}
}
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
1Les bases de Nest
Classes et méthodesBonjour, NestEnregistrer un contrôleur4Gardes, filtres, intercepteurs
GardesEntraînez-vous par vous-même : Playground Express