今回は、NestJSのGuardsという機能を使ってを簡単な認証機能を実装していきます。
↓ 基本的なプロジェクトフォルダの作成は以下の記事で作成済み
目次
ゴール
- リクエストに対しての認証ができること
※Authorizationヘッダに含まれる認証用のトークンを使う
参考リンク
開発環境
- VSCode
- 実行環境
- Node.js:
v16.x
- yarn:
v.1.22.x
- Node.js:
- ライブラリ
- @nestjs/cli:
8.2.x
- @nestjs/cli:
導入手順
前提:プロジェクトフォルダが作成されている
- guardの作成
- guardの実装
- guardの適用
- 動作確認
実装
現時点でのディレクトリ構成はコチラ
※初期プロジェクトフォルダと同様
├── README.md
├── nest-cli.json
├── package.json
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── tsconfig.build.json
├── tsconfig.json
└── yarn.lock
guardの作成
Nest CLIを使って、guardを作成します。
以下コマンドを実行する
$ nest g gu guard/auth
CREATE src/guard/auth.guard.spec.ts (160 bytes)
CREATE src/guard/auth.guard.ts (299 bytes)
以下のようなファイルが生成される
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
return true;
}
}
guardの実装
以下のように実装していきます。
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return request.headers.authorization === 'TEST_API_TOKEN';
}
}
request情報を取得し、そこからheaders内のAuthorizationにアプリケーション側で定めた認証用トークンを一致するかで認証結果をreturnするようにします。
guardの適用
guardを作成しただけでは認証機能として動作しないため、
該当のcontrollerに適用させます。
import { Controller, Get, UseGuards } from '@nestjs/common'; //UseGuardsを追加
import { AppService } from './app.service';
import { AuthGuard } from './guard/auth.guard'; //追加
@Controller()
@UseGuards(AuthGuard) //追加
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
controller全体に適用させていますが、各ルーティング毎に適用させることも可能です。
動作確認
サーバーを起動し、以下リクエストを投げてみます。
# 適用前
$ curl -X GET localhost:3000
Hello World!
# 適用後
$ curl -X GET localhost:3000
{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}
$ curl -X GET -H "Authorization:TEST_API_TOKEN" localhost:3000
Hello World!
リクエストヘッダーに認証トークンを含めるかどうかレスポンスが変わることが確認できました
さいごに
実際にはさらに細かい設定や実装が必要になってくるかと思いますが、
ざっくりGuardをどんな感じで使っていくのかをイメージできたと思います。
ご覧頂きありがとうございました。