1. パッケージをインストール
認証ライブラリのPassport.jsと、Basic認証を使うのに必要なpassport-httpを入れます。
yarn add passport passport-http @nestjs/passport
yarn add -D @types/passport @types/passport-http
2. Basic認証のストラテジーを作成
basic.strategy.ts
import {BasicStrategy as Strategy} from 'passport-http';
import {PassportStrategy} from '@nestjs/passport';
import {Injectable, UnauthorizedException} from '@nestjs/common';
@Injectable()
export class BasicStrategy extends PassportStrategy(Strategy) {
constructor() {
super();
}
validate(username: string, password: string): boolean {
if (username === 'admin' && password === 'changeme') return true;
else throw new UnauthorizedException();
}
}
(ハードコーディングなので、username
、password
はconfigにするなりしたほうがよいでしょう)
3. Basic認証のGuardを作成
AuthGuard('basic')
で直接利用できますが、'basic'
がMagicStringになるため、Guardにします。
basic-auth.guard.ts
import {Injectable} from '@nestjs/common';
import {AuthGuard} from '@nestjs/passport';
@Injectable()
export class BasicAuthGuard extends AuthGuard('basic') {}
4. Basic認証利用したいモジュールでimportする
Basic認証を利用したいモジュールに、以下のimportsとprovidersを追記してください。
your.module.ts
import {Module} from '@nestjs/common';
import {PassportModule} from '@nestjs/passport';
import {BasicStrategy} from '@strategies/basic.strategy'; // 2で作成したファイル
@Module({
imports: [PassportModule],
providers: [BasicStrategy],
})
export class YourModule {}
5. ControllerでBasic認証を利用する
@UseGuards(BasicAuthGuard)
のデコレータをつければ完了です。
your.module.ts
import {Controller, Post, UseGuards} from '@nestjs/common';
import {BasicAuthGuard} from '@guards/basic-auth.guard'; // 3で作成したファイル
@Controller('sample')
export class YourController {
@Post('/test')
@UseGuards(BasicAuthGuard) // ←これ
restrictedRoute() {
return true;
}
}