Menu
CoddyTech

Guardie

Fa parte della sezione TypeScript e NestJS del percorso Node.js di Coddy. Lezione 18 di 24.

Chiunque può creare o eliminare attività. Una guardia decide se una richiesta può raggiungere il relativo gestore: Nest chiama il suo canActivate e, quando restituisce false, Nest risponde con 403 Forbidden senza eseguire il metodo.

@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() restituisce la richiesta; Node memorizza i nomi delle intestazioni in minuscolo, quindi leggi request.headers['x-api-key']. @UseGuards su un metodo protegge quel metodo. Sulla classe del controller protegge tutti i metodi al suo interno.

challenge icon

Sfida

Facile

Al momento chiunque può creare o eliminare attività. Proteggi le due route che modificano i dati con una chiave API: un segreto che il client invia nell'intestazione di una richiesta. La lettura resta accessibile a tutti.

  1. Apri src/common/api-key.guard.ts. Nel metodo canActivate di ApiKeyGuard, leggi l'intestazione x-api-key della richiesta. context.switchToHttp().getRequest() ti restituisce la richiesta e i nomi delle sue intestazioni sono sempre in minuscolo.
  2. Restituisci true solo quando quell'intestazione è uguale a process.env.API_KEY, che questa lezione imposta su tasks-key-123. Restituisci false in tutti gli altri casi, anche quando manca l'intestazione. Quando la guard restituisce false, Nest risponde con 403 e non esegue mai il metodo della route.
  3. In src/tasks/tasks.controller.ts, importa ApiKeyGuard da ../common/api-key.guard e UseGuards da @nestjs/common. Aggiungi @UseGuards(ApiKeyGuard) al metodo create (POST /tasks) e al metodo remove (DELETE /tasks/:id). Non aggiungerlo alla classe: anche le route GET verrebbero protette.
  4. GET /tasks, GET /tasks/:id e GET /stats continuano a funzionare senza chiave.

Prova: invia { "title": "Buy milk" } tramite POST a /tasks senza intestazione. Riceverai 403:

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

Apri il campo Headers della barra della richiesta, aggiungi la riga x-api-key: tasks-key-123 e invia di nuovo la richiesta POST: riceverai 201 e la nuova attività. Con x-api-key: guess riceverai 403. Anche DELETE /tasks/4 richiede la chiave: 403 senza, 204 con la chiave. GET /tasks funziona anche senza alcuna intestazione.

Provalo tu

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

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // Consenti il passaggio della richiesta solo quando il suo header x-api-key
        // è uguale a process.env.API_KEY.
        return true;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di TypeScript e NestJS

Esercitati da solo: Playground Express