Guard
Termasuk bagian TypeScript dan NestJS dalam perjalanan Node.js di Coddy. Pelajaran 18 dari 24.
Siapa pun dapat membuat atau menghapus tugas. Guard menentukan apakah permintaan boleh mencapai handler-nya: Nest memanggil canActivate, dan ketika hasilnya false, Nest memberikan jawaban 403 Forbidden tanpa menjalankan method tersebut.
@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() memberikan request; Node menyimpan nama header dalam huruf kecil, jadi baca request.headers['x-api-key']. @UseGuards pada method melindungi method tersebut. Pada class controller, dekorator itu melindungi setiap method di dalamnya.
Tantangan
MudahSaat ini siapa pun bisa membuat atau menghapus tugas. Lindungi dua rute yang mengubah data dengan API key: rahasia yang dikirim klien di header permintaan. Semua orang tetap bisa membaca tanpa batasan.
- Buka
src/common/api-key.guard.ts. Di methodcanActivatemilikApiKeyGuard, baca headerx-api-keydari permintaan.context.switchToHttp().getRequest()memberikan permintaan itu kepadamu, dan nama header-nya selalu huruf kecil. - Kembalikan
truehanya jika header itu sama denganprocess.env.API_KEY, yang ditetapkan pelajaran ini ketasks-key-123. Kembalikanfalsedalam semua kondisi lainnya, termasuk saat header tidak ada. Saat guard mengembalikanfalse, Nest merespons dengan 403 dan tidak menjalankan method rute tersebut. - Di
src/tasks/tasks.controller.ts, imporApiKeyGuarddari../common/api-key.guard, danUseGuardsdari@nestjs/common. Tambahkan@UseGuards(ApiKeyGuard)pada methodcreate(POST /tasks) dan methodremove(DELETE /tasks/:id). Jangan tambahkan pada class: itu juga akan melindungi rute GET. GET /tasks,GET /tasks/:id, danGET /statstetap berfungsi tanpa key.
Coba: Kirim POST { "title": "Buy milk" } ke /tasks tanpa header. Kamu akan mendapat 403:
{ "message": "Forbidden resource", "error": "Forbidden", "statusCode": 403 }Buka kolom Headers di bilah permintaan, tambahkan baris x-api-key: tasks-key-123, lalu kirim ulang POST: kamu akan mendapat 201 dan tugas baru. Dengan x-api-key: guess, kamu akan mendapat 403. DELETE /tasks/4 juga memerlukan key: 403 tanpa key, 204 dengan key. GET /tasks berfungsi tanpa header sama sekali.
Coba sendiri
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiKeyGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
// Izinkan request hanya jika header x-api-key-nya
// sama dengan process.env.API_KEY.
return true;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di TypeScript dan NestJS
Latihan sendiri: Playground Express