الحراس
جزء من قسم TypeScript وNestJS في رحلة Node.js على Coddy. الدرس 14 من 17.
يمكن لأي شخص إنشاء المهام أو حذفها. يقرر الحارس ما إذا كان بإمكان الطلب الوصول إلى معالجه: يستدعي Nest الدالة canActivate، وعندما تُرجع false، يجيب Nest بالرمز 403 «محظور» من دون تشغيل الطريقة.
@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() الطلب؛ يخزّن Node أسماء الترويسات بأحرف صغيرة، لذا اقرأ request.headers['x-api-key']. يحرس @UseGuards المضافة إلى طريقة تلك الطريقة. أما إضافتها إلى فئة المتحكم فتحرس كل طريقة فيها.
التحدي
سهل- أكمل
ApiKeyGuard: اسمح بمرور الطلب فقط عندما يساوي ترويسهx-api-keyالقيمةprocess.env.API_KEY(تضبط هذه الدرس القيمةtasks-key-123). - احمِ
POST /tasksوDELETE /tasks/:id؛ تظل عمليات القراءة متاحة دون حماية. - أرسل
POST /tasksمع عنوان: ستحصل على 403. أضف الترويسةx-api-key: tasks-key-123وأرسل الطلب مجددًا: ستحصل على 201. يستجيبGET /tasksدونها.
جرّب بنفسك
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiKeyGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
// اسمح بمرور الطلب فقط عندما تكون قيمة الترويسة x-api-key الخاصة به
// مساويةً لـ process.env.API_KEY.
return true;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.