Menu
CoddyTech

ガード

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は、そのメソッドをガードします。コントローラークラスに付けると、そのクラス内のすべてのメソッドをガードします。

challenge icon

チャレンジ

簡単
  • 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;
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

TypeScriptとNestJSのすべてのレッスン