未経験から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にアクセスした場合
これだけならば非常に簡単に実装できるかと思います。
終わりに
いかがでしょうか、基本的にインターセプターやパイプのような使い方ですが、
それぞれ役割は決まっているので、認証やロール設定を行う場合はこのガードを使うようにしましょう。