この記事では、Clerk を使用して NestJS バックエンド アプリケーションに認証と認可を実装するための包括的なステップバイステップ ガイドを提供します。
Clerk は、埋め込み可能なユーザー インターフェイス、柔軟な API、シームレスなユーザー認証と管理のための直感的で堅牢なダッシュボードを提供する包括的なプラットフォームです。セッション管理や多要素認証からソーシャル サインオン、マジック リンク、電子メールや SMS のワンタイム パスコードなど、あらゆるものをカバーします。
データ保護とプライバシーの重要性がますます高まっているため、認証とセキュリティの要件、トレンド、ベストプラクティスは常に進化しています。これらの責任を専門のサービス プロバイダーに任せることで、アプリケーションのコア機能の構築に集中し、より迅速に出荷できるようになります。
これらのセキュリティ タスクを代わりに引き受ける Clerk のようなプラットフォームが存在します。
このプロジェクトには、新規または既存の NestJS プロジェクト、Clerk アカウントとアプリケーション、および Passport、Passport Strategy、Clerk バックエンド SDK などのライブラリが必要です。
Nest CLI を使用して、新しい NestJS プロジェクトを簡単にセットアップできます。任意のパッケージ マネージャーを使用して、次のコマンドを実行して新しい Nest アプリケーションを作成します。
$ pnpm add -g @nestjs/cli $ nest new clerk-auth
詳細については、NestJS のドキュメントを確認してください。
まだお持ちでない場合は、Clerk アカウントを作成し、Clerk ダッシュボードで新しいアプリケーションをセットアップします。 Clerk の Web サイトから始めることができます。
このプロジェクトに必要なライブラリは、次のコマンドでインストールできます:
$ pnpm add @clerk/backend @nestjs/config @nestjs/passport passport passport-custom
実稼働、開発、ステージングなど、さまざまな環境の変数を管理するには、プロジェクトのルート ディレクトリに .env ファイルを作成します。
次の変数を追加し、プレースホルダーを Clerk アカウント ダッシュボードから取得した実際のキーに置き換えます。
# .env CLERK_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY CLERK_SECRET_KEY=YOUR_SECRET_KEY
ConfigService を使用してアプリケーション全体の環境変数にアクセスするには、ConfigModule をルート AppModule にインポートします。
// src/app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, }), ], }) export class AppModule {}
このセクションでは、Clerk バックエンド SDK を NestJS プロジェクトに統合して利用する方法について説明します。
Clerk クライアントをプロバイダーとして登録すると、デコレーターを使用してクラスに注入できるようになり、次のセクションで説明するように、コードベース全体で必要な場所で使用できるようになります。
$ pnpm add -g @nestjs/cli $ nest new clerk-auth
次に、依存関係の注入を有効にするためにプロバイダーを Nest に登録する必要があります。
$ pnpm add @clerk/backend @nestjs/config @nestjs/passport passport passport-custom
Clerk は、ユーザーが Clerk のホストされたページまたはフロントエンド アプリを通じてサインアップまたはログインすると、JWT トークンを発行します。このトークンは、NestJS バックエンド アプリケーションに対して行われたリクエストの Authorization ヘッダー内のベアラー トークンとして送信されます。
NestJS では、認証戦略を実装するために Passport が推奨される方法です。 Clerk クライアントでトークンを検証するカスタム Clerk 戦略を作成します。
# .env CLERK_PUBLISHABLE_KEY=YOUR_PUBLISHABLE_KEY CLERK_SECRET_KEY=YOUR_SECRET_KEY
validate() メソッドは、NestJS が request.user に自動的に添付するユーザー データを返します。
Clerk 戦略を提供し、PassportModule と統合する AuthModule を作成します。次に、AppModule に AuthModule を登録します。
// src/app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, }), ], }) export class AppModule {}
// src/providers/clerk-client.provider.ts import { createClerkClient } from '@clerk/backend'; import { ConfigService } from '@nestjs/config'; export const ClerkClientProvider = { provide: 'ClerkClient', useFactory: (configService: ConfigService) => { return createClerkClient({ publishableKey: configService.get('CLERK_PUBLISHABLE_KEY'), secretKey: configService.get('CLERK_SECRET_KEY'), }); }, inject: [ConfigService], };
保護されたルートは、ユーザーがアクセスする前に認証を必要とするルートです。
ガードは、特定の実行時条件に基づいて、特定のリクエストをルート ハンドラーで処理する必要があるかどうかを決定します。
アプリケーション内のすべてのルートをデフォルトで保護したい場合は、次の手順を実行する必要があります:
// src/app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ClerkClientProvider } from 'src/providers/clerk-client.provider'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, }), ], providers: [ClerkClientProvider], }) export class AppModule {}
// src/auth/clerk.strategy.ts import { User, verifyToken } from '@clerk/backend'; import { Injectable, Injectable, UnauthorizedException } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { PassportStrategy } from '@nestjs/passport'; import { Strategy } from 'passport-custom'; import { UsersService } from 'src/users/users.service'; import { Request } from 'express'; import { ClerkClient } from '@clerk/backend'; @Injectable() export class ClerkStrategy extends PassportStrategy(Strategy, 'clerk') { constructor( @Inject('ClerkClient') private readonly clerkClient: ClerkClient, private readonly configService: ConfigService, ) { super(); } async validate(req: Request): Promise<User> { const token = req.headers.authorization?.split(' ').pop(); if (!token) { throw new UnauthorizedException('No token provided'); } try { const tokenPayload = await verifyToken(token, { secretKey: this.configService.get('CLERK_SECRET_KEY'), }); const user = await this.clerkClient.users.getUser(tokenPayload.sub); return user; } catch (error) { console.error(error); throw new UnauthorizedException('Invalid token'); } } }
ほとんどのエンドポイントはデフォルトで保護されるため、認証ガードをグローバル ガードとして構成できます。
// src/auth/auth.module.ts import { Module } from '@nestjs/common'; import { ClerkStrategy } from './clerk.strategy'; import { PassportModule } from '@nestjs/passport'; import { ClerkClientProvider } from 'src/providers/clerk-client.provider'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [PassportModule, ConfigModule], providers: [ClerkStrategy, ClerkClientProvider], exports: [PassportModule], }) export class AuthModule {}
これらの 2 つのコントローラーでは、AppController で Public デコレーターが使用され、ルートをパブリックとして指定します。対照的に、認証ガードはデフォルトでグローバルに適用されるため、ルートを保護されたものとして指定するために AuthController でデコレータは必要ありません。
// src/app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ClerkClientProvider } from 'src/providers/clerk-client.provider'; import { AuthModule } from 'src/auth/auth.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, }), AuthModule, ], providers: [ClerkClientProvider], }) export class AppModule {}
// src/decorators/public.decorator.ts import { SetMetadata } from '@nestjs/common'; export const IS_PUBLIC_KEY = 'isPublic'; export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
注: AppController を AppModule に登録し、AuthController を AuthModule に登録することを忘れないでください。
プラットフォームとしての Clerk は、認証とセキュリティの責任を処理し、最新のトレンドとベスト プラクティスに対応します。これにより、アプリケーションのコア機能の構築と開発プロセスの加速に集中できます。
このガイドでは、プロジェクトの設定からルートの保護まで、Clerk 認証を実装する手順を説明しました。これらの基本的な手順は、認証サービス プラットフォームの可能性を探る旅を始めるのに役立ちます。
このプロジェクトの完全に機能する例は、この記事の最後に記載されています。
NestJS バックエンド アプリケーションでの Clerk 認証とユーザー管理の使用
このモノリポジトリには次のパッケージとアプリが含まれています:
各パッケージとアプリは 100% TypeScript です。
このモノレポには、いくつかの追加ツールがすでにセットアップされています。
以上がNestJS サーバー アプリケーションでのクラークによる認証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。