私はクライアント API のフレームワークとして NestJS を使用しています。フレームワーク内では、正常に機能している標準的な Passport/JWT 認証インフラストラクチャを使用しています。ベアラー トークンが見つかると AuthGuard が起動し、安全な API エンドポイントでは、'@Res() request' を介して HTTP コンテキストを挿入し、Jwt トークンのペイロードを含む 'request.user' プロパティにアクセスできます。
これに加えて、ドキュメントで提供されているサンプル コードや GitHub のサンプル プロジェクトの一部と非常によく似た方法で「RolesGuard」を実装しようとしています (実際にこのガードを使用しているものはありませんが、サンプル ガードとして含まれています)。
問題は、AuthGuard が起動して Jwt トークンを検証し、その後 RolesGuard が起動するのですが、渡されるリクエスト オブジェクトにリクエストに添付されたユーザー メタデータがないことです。
RolesGuard のキー コードは次のとおりです。
const request = context.switchToHttp().getRequest();
const user = request.user;
if (!user) {
return false;
}
上記の抜粋では、ユーザーは常に false です。現在のユーザーのスコープへのアクセスを正常に取得する、Nest でロール/権限ベースのガードを作成した人はいますか? すべてのコードが実行され、すべてが正しく登録されているように見えます。
-ケビン
ベストアンサー1
結局のところ、これはガードに関する順序の問題のようで、フレームワークで順序を制御できない限り、簡単に解決できるものではないようです。
私の希望は、RolesGuard をグローバルに登録することでしたが、そうすると最初に登録され、最初に起動することになります。
@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles('admin')
これをエンドポイント レベルで登録し、AuthGuard の後に配置すると、2 番目に実行され、ガード自体内で期待するユーザー コンテキストが取得されます。完璧ではありませんが、機能します。
-ケビン