未経験からNestJS入門|ガード

概要

NestJS にはガードと呼ばれる機能が存在しており、CanActive インターフェースを実装することで利用可能です。

これを利用することで、NestJS アプリケーションに認証機能を追加することが可能です。ぜひ使い方を覚えておきましょう。

ガードの機能

ガードの役割は認証を行うことです。
ユーザーからアクセスがあった場合、そのユーザーの権限やロール、ACL の検証を行い処理を続行するかどうかを判定します。

これはミドルウェアとインターセプターの間で処理が行われます。

ガードの利用方法

ガードを作成するとき、Nest CLI を使う方法が一番簡単です。

以下コマンドを実行し、ガードを作成してください。

nest g gu guard/auth

// src/guard/auth.guard.ts

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;
  }
}

次に作成された、auth.guards ファイルにコードを追記していきます。

今回は簡単な例として、クエリパラメーターが存在しない場合、そのユーザーはアクセスできないようにします。

// src/guard/auth.guard.ts

import { Injectable, CanActivate, ExecutionContext } 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();
  if (!request.query.params) {
    return false;
  } else {
    return true;
  }
  }
}

ガードはこのままでは動作しません。

ガードを使用するコントローラーを指定し、@UserGuards デコレータをつけてあげる必要があります。

今回はアプリケーションのルーティングに追記しましょう。

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AppService } from './app.service';
import { AuthGuard } from './guard/auth.guard';
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  @UseGuards(AuthGuard)
  getHello(): string {
    return this.appService.getHello();
  }
}

これで完了しました。
試しに
http://localhost:3000
http://localhost:3000/?params=test
にそれぞれアクセスしてください。
それぞれで表示が変わるはずです。

http://localhost:3000にアクセスした場合

http://localhost:3000/?params=testにアクセスした場合

これだけならば非常に簡単に実装できるかと思います。

終わりに

いかがでしょうか、基本的にインターセプターやパイプのような使い方ですが、
それぞれ役割は決まっているので、認証やロール設定を行う場合はこのガードを使うようにしましょう。