Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Saat 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.

  1. Buka src/common/api-key.guard.ts. Di method canActivate milik ApiKeyGuard, baca header x-api-key dari permintaan. context.switchToHttp().getRequest() memberikan permintaan itu kepadamu, dan nama header-nya selalu huruf kecil.
  2. Kembalikan true hanya jika header itu sama dengan process.env.API_KEY, yang ditetapkan pelajaran ini ke tasks-key-123. Kembalikan false dalam semua kondisi lainnya, termasuk saat header tidak ada. Saat guard mengembalikan false, Nest merespons dengan 403 dan tidak menjalankan method rute tersebut.
  3. Di src/tasks/tasks.controller.ts, impor ApiKeyGuard dari ../common/api-key.guard, dan UseGuards dari @nestjs/common. Tambahkan @UseGuards(ApiKeyGuard) pada method create (POST /tasks) dan method remove (DELETE /tasks/:id). Jangan tambahkan pada class: itu juga akan melindungi rute GET.
  4. GET /tasks, GET /tasks/:id, dan GET /stats tetap 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;
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di TypeScript dan NestJS

Latihan sendiri: Playground Express