NestJSでJWTリフレッシュトークンを使用する方法


  1. パッケージのインストール: まず、NestJSアプリケーションに@nestjs/jwtパッケージをインストールします。
$ npm install @nestjs/jwt
  1. JWTモジュールの設定: NestJSのJwtModuleを使用して、JWTの設定を行います。JwtModuleをインポートし、forRootメソッドを呼び出して設定を定義します。
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
@Module({
  imports: [
    JwtModule.forRoot({
      secret: 'YOUR_SECRET_KEY',
      signOptions: { expiresIn: '15m' },
    }),
  ],
})
export class AppModule {}

上記の例では、secretには署名に使用される秘密鍵を設定し、signOptionsexpiresInにはアクセストークンの有効期限を設定しています。

  1. リフレッシュトークンの生成と検証: ユーザーがログインした後、アクセストークンとリフレッシュトークンを生成します。以下は、AuthServiceクラス内での例です。
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
  constructor(private readonly jwtService: JwtService) {}
  generateTokens(userId: number): {
    accessToken: string;
    refreshToken: string;
  } {
    const payload = { userId };
    const accessToken = this.jwtService.sign(payload);
    const refreshToken = this.jwtService.sign(payload, {
      expiresIn: '7d',
    });
    return { accessToken, refreshToken };
  }
  verifyToken(token: string): any {
    return this.jwtService.verify(token);
  }
}

generateTokensメソッドでは、アクセストークンとリフレッシュトークンを生成し、verifyTokenメソッドではトークンの検証を行っています。

  1. リフレッシュトークンの使用: アクセストークンが期限切れになった場合、リフレッシュトークンを使用して新しいアクセストークンを生成します。以下は、AuthControllerクラス内での例です。
import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';
@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}
  @Post('refresh-token')
  refreshToken(@Body('refreshToken') refreshToken: string) {
    try {
      const { userId } = this.authService.verifyToken(refreshToken);
      const { accessToken } = this.authService.generateTokens(userId);
      return { accessToken };
    } catch (error) {
      throw new UnauthorizedException('Invalid refresh token');
    }
  }
}

上記の例では、refresh-tokenエンドポイントでリフレッシュトークンを受け取り、新しいアクセストークンを生成して返します。リフレッシュトークンが無効な場合は、UnauthorizedExceptionがスローされます。

以上が、NestJSでJWTリフレッシュトークンを使用する方法の例です。これにより、ユーザーはアクセストークンの有効期限が切れた場合でも、リフレッシュトークンを使用して新しいアクセストークンを取得することができます。これにより、ユーザーのセッションを維持しながらセキュリティを向上させることができます。