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.
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.
src/common/api-key.guard.tsdosyasını aç.ApiKeyGuardsınıfınıncanActivatemetodunda isteğinx-api-keybaşlığını oku.context.switchToHttp().getRequest()sana isteği verir ve başlık adları her zaman küçük harflidir.- Yalnızca bu başlık
process.env.API_KEYdeğerine eşitsetruedöndür; bu derste bu değertasks-key-123olarak ayarlanır. Başlığın eksik olduğu durum da dâhil olmak üzere diğer tüm durumlardafalsedöndür. Korumafalsedöndürdüğünde Nest 403 yanıtı verir ve rotanın metodunu çalıştırmaz. src/tasks/tasks.controller.tsdosyasındaApiKeyGuardöğesini../common/api-key.guarddosyasından,UseGuardsöğesini de@nestjs/commonpaketinden içe aktar.@UseGuards(ApiKeyGuard)satırınıcreatemetoduna (POST /tasks) veremovemetoduna (DELETE /tasks/:id) ekle. Sınıfa ekleme; bu, GET rotalarını da kilitler.GET /tasks,GET /tasks/:idveGET /statsanahtar 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;
}
}
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
1Nest Temelleri
Sınıflar ve MetotlarMerhaba, NestBir Controller Kaydetme4Guard’lar, Filtreler, Interceptor’lar
Guard’larKendi başına pratik yap: Express playground