← NestJS コース
20. 認証の流れ — Passportと戦略
認証とは「あなたは誰か」を確かめる処理です。典型的なログインの流れは、クライアントが送ったメールアドレスとパスワードをサービスで検証し、正しければ本人であることを示すトークンを発行して返す、というものです。以降のリクエストではそのトークンを提示してもらい、毎回ログインし直さずに本人だと判断します。
NestJS では認証の定番ライブラリ Passport を @nestjs/passport で統合します。Passport は「戦略(Strategy)」という単位で認証方式を切り替える設計で、ID とパスワードで検証する LocalStrategy、トークンで検証する JwtStrategy などを差し替えて使えます。戦略の中で検証に成功して返した値が、既習のガードを通してリクエストの user としてハンドラから参照できるようになります。
つまずきポイントは、認証(誰か)と認可(何をしてよいか)を混同することです。このレッスンは「本人確認をしてトークンを渡すまで」が対象で、そのトークンの具体的な中身は次レッスンの JWT、権限の判定はその次の RBAC で扱います。まずは「検証 → トークン発行 → 以降はトークンで本人確認」という大枠を押さえましょう。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { Injectable, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy } from "passport-local";
// ID/パスワードで検証する「戦略」。validate の戻り値が user になる
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super(); // 既定で username / password フィールドを読む
}
async validate(username: string, password: string) {
const user = await this.authService.validateUser(username, password);
if (!user) throw new UnauthorizedException(); // 401 になる
return user; // 認証成功。これが request.user に入る
}
}
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗