Menu
CoddyTech

Guard’lar

Coddy'nin Node.js Journey'sinin TypeScript ve NestJS bölümünün bir parçası. Ders 18 / 24.

Herkes görev oluşturabilir veya silebilir. Bir guard, isteğin işleyiciye ulaşıp ulaşamayacağına karar verir: Nest, canActivate metodunu çağırır ve bu metot false döndürdüğünde Nest, metodu çalıştırmadan 403 Forbidden yanıtı verir.

@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() isteği verir; Node, başlık adlarını küçük harflerle saklar, bu nedenle request.headers['x-api-key'] şeklinde okuyun. Bir metot üzerindeki @UseGuards, o metodu korur. Denetleyici sınıfı üzerindeyse sınıftaki her metodu korur.

challenge icon

Görev

Kolay

Şu anda herkes görev oluşturabilir veya silebilir. Verileri değiştiren iki rotayı bir API anahtarının arkasında kilitle: istemcinin istek başlığında gönderdiği bir gizli değer. Okuma işlemleri herkese açık kalır.

  1. src/common/api-key.guard.ts dosyasını aç. ApiKeyGuard sınıfının canActivate metodunda isteğin x-api-key başlığını oku. context.switchToHttp().getRequest() sana isteği verir ve başlık adları her zaman küçük harflidir.
  2. Yalnızca bu başlık process.env.API_KEY değerine eşitse true döndür; bu derste bu değer tasks-key-123 olarak ayarlanır. Başlığın eksik olduğu durum da dâhil olmak üzere diğer tüm durumlarda false döndür. Koruma false döndürdüğünde Nest 403 yanıtı verir ve rotanın metodunu çalıştırmaz.
  3. src/tasks/tasks.controller.ts dosyasında ApiKeyGuard öğesini ../common/api-key.guard dosyasından, UseGuards öğesini de @nestjs/common paketinden içe aktar. @UseGuards(ApiKeyGuard) satırını create metoduna (POST /tasks) ve remove metoduna (DELETE /tasks/:id) ekle. Sınıfa ekleme; bu, GET rotalarını da kilitler.
  4. GET /tasks, GET /tasks/:id ve GET /stats anahtar olmadan da çalışmaya devam eder.

Deneyin: /tasks adresine başlık olmadan { "title": "Buy milk" } içeriğiyle POST isteği gönder. 403 yanıtı alırsın:

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

İstek çubuğundaki Headers alanını aç, x-api-key: tasks-key-123 satırını ekle ve POST isteğini yeniden gönder: 201 yanıtını ve yeni görevi alırsın. x-api-key: guess ile 403 yanıtı alırsın. DELETE /tasks/4 için de anahtar gerekir: anahtar olmadan 403, anahtarla 204 yanıtı alırsın. GET /tasks hiçbir başlık olmadan çalışır.

Kendin dene

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

@Injectable()
export class ApiKeyGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        // İsteğe yalnızca x-api-key başlığı
        // process.env.API_KEY değerine eşit olduğunda izin ver.
        return true;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

TypeScript ve NestJS bölümündeki tüm dersler

Kendi başına pratik yap: Express playground