ガード
CoddyのNode.jsジャーニー「TypeScriptとNestJS」セクションの一部。レッスン 14/17。
誰でもタスクを作成または削除できます。ガードは、リクエストがハンドラーに到達してよいかどうかを判断します。Nest はそのcanActivateを呼び出し、falseが返された場合、メソッドを実行せずに 403 Forbidden を返します。
@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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。