Bộ bảo vệ
Thuộc phần TypeScript và NestJS trong hành trình Node.js của Coddy. Bài học 18 trên 24.
Bất kỳ ai cũng có thể tạo hoặc xóa tác vụ. Guard quyết định liệu một yêu cầu có thể đến trình xử lý hay không: Nest gọi canActivate, và khi phương thức này trả về false, Nest phản hồi 403 Forbidden mà không chạy phương thức.
@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() cung cấp yêu cầu; Node lưu tên header ở dạng chữ thường, vì vậy hãy đọc request.headers['x-api-key']. @UseGuards trên một phương thức sẽ bảo vệ phương thức đó. Trên lớp controller, nó bảo vệ mọi phương thức trong lớp.
Thử thách
DễHiện tại, bất kỳ ai cũng có thể tạo hoặc xóa tác vụ. Khóa hai tuyến thay đổi dữ liệu bằng API key: một bí mật mà máy khách gửi trong tiêu đề yêu cầu. Mọi người vẫn có thể đọc dữ liệu.
- Mở
src/common/api-key.guard.ts. Trong phương thứccanActivatecủaApiKeyGuard, đọc tiêu đềx-api-keycủa yêu cầu.context.switchToHttp().getRequest()trả về yêu cầu, và tên tiêu đề luôn viết thường. - Chỉ trả về
truekhi tiêu đề đó bằngprocess.env.API_KEY, giá trị mà bài học này đặt làtasks-key-123. Trong mọi trường hợp khác, kể cả khi thiếu tiêu đề, hãy trả vềfalse. Khi guard trả vềfalse, Nest phản hồi bằng mã 403 và không chạy phương thức của tuyến đó. - Trong
src/tasks/tasks.controller.ts, nhậpApiKeyGuardtừ../common/api-key.guardvàUseGuardstừ@nestjs/common. Đặt@UseGuards(ApiKeyGuard)trên phương thứccreate(POST /tasks) và phương thứcremove(DELETE /tasks/:id). Đừng đặt nó trên lớp, vì như vậy các tuyến GET cũng bị khóa. GET /tasks,GET /tasks/:idvàGET /statsvẫn hoạt động mà không cần key.
Thử nhé: Gửi POST { "title": "Buy milk" } đến /tasks mà không có tiêu đề. Bạn sẽ nhận được mã 403:
{ "message": "Forbidden resource", "error": "Forbidden", "statusCode": 403 }Mở trường Headers trên thanh yêu cầu, thêm dòng x-api-key: tasks-key-123, rồi gửi lại POST: bạn sẽ nhận được mã 201 cùng tác vụ mới. Với x-api-key: guess, bạn sẽ nhận được mã 403. DELETE /tasks/4 cũng cần key: mã 403 nếu thiếu key, mã 204 nếu có key. GET /tasks hoạt động mà không cần tiêu đề nào.
Tự làm thử
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiKeyGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
// Chỉ cho phép yêu cầu đi qua khi header x-api-key của yêu cầu
// trùng với process.env.API_KEY.
return true;
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong TypeScript và NestJS
1Nest cơ bản
Lớp và phương thứcXin chào, NestĐăng ký controller4Bộ bảo vệ, bộ lọc và bộ đánh chặn
Bộ bảo vệTự luyện tập: Playground Express