- パッケージのインストール:
まず、NestJSアプリケーションに
@nestjs/jwt
パッケージをインストールします。
$ npm install @nestjs/jwt
- 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
には署名に使用される秘密鍵を設定し、signOptions
のexpiresIn
にはアクセストークンの有効期限を設定しています。
- リフレッシュトークンの生成と検証:
ユーザーがログインした後、アクセストークンとリフレッシュトークンを生成します。以下は、
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
メソッドではトークンの検証を行っています。
- リフレッシュトークンの使用:
アクセストークンが期限切れになった場合、リフレッシュトークンを使用して新しいアクセストークンを生成します。以下は、
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リフレッシュトークンを使用する方法の例です。これにより、ユーザーはアクセストークンの有効期限が切れた場合でも、リフレッシュトークンを使用して新しいアクセストークンを取得することができます。これにより、ユーザーのセッションを維持しながらセキュリティを向上させることができます。