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.
Sfida
FacileAl 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.
- Apri
src/common/api-key.guard.ts. Nel metodocanActivatediApiKeyGuard, leggi l'intestazionex-api-keydella richiesta.context.switchToHttp().getRequest()ti restituisce la richiesta e i nomi delle sue intestazioni sono sempre in minuscolo. - Restituisci
truesolo quando quell'intestazione è uguale aprocess.env.API_KEY, che questa lezione imposta sutasks-key-123. Restituiscifalsein tutti gli altri casi, anche quando manca l'intestazione. Quando la guard restituiscefalse, Nest risponde con 403 e non esegue mai il metodo della route. - In
src/tasks/tasks.controller.ts, importaApiKeyGuardda../common/api-key.guardeUseGuardsda@nestjs/common. Aggiungi@UseGuards(ApiKeyGuard)al metodocreate(POST /tasks) e al metodoremove(DELETE /tasks/:id). Non aggiungerlo alla classe: anche le route GET verrebbero protette. GET /tasks,GET /tasks/:ideGET /statscontinuano 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;
}
}
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