Sanctum とは
Laravel Sanctum は、SPA(シングルページアプリケーション)・モバイルアプリ・シンプルなAPIに向けた軽量な認証パッケージです。複雑なOAuthの知識がなくても、ユーザーごとに複数のAPIトークンを発行・管理できます。 Sanctum が解決する問題は2つあります。自社SPAからAPIを呼び出す場合はSPA認証を使います。モバイルアプリやサードパーティがAPIを利用する場合はAPIトークン認証を使います。どちらか一方だけを使うことも構いません。
Passport との使い分け
外部サービスに対してOAuth2プロバイダーになる必要がある場合は Passport を選びますが、多くのアプリケーションでは Sanctum で十分です。
インストールと設定
インストール
install:api Artisanコマンドを実行するだけで Sanctum がセットアップされます。
laravel/sanctumパッケージのインストールpersonal_access_tokensテーブルのマイグレーションファイルの公開- マイグレーションの実行
HasApiTokens トレイトを追加する
User モデルに HasApiTokens トレイトを追加します。
$user->createToken() や $user->tokens などのメソッドが使えるようになります。
API トークン認証
トークンフロー
トークンを発行する
createToken() メソッドでトークンを発行します。plainTextToken プロパティから平文のトークン値を取得できます。平文トークンはデータベースには保存されないため、発行直後にユーザーへ返す必要があります。
スコープ(アビリティ)を設定する
トークンに対してアビリティ(スコープ)を付与することで、そのトークンで実行できる操作を制限できます。ミドルウェアでスコープを確認する
bootstrap/app.php にミドルウェアエイリアスを登録します。
トークンの有効期限
デフォルトでは Sanctum トークンに有効期限はありません。config/sanctum.php の expiration オプションで分単位の有効期限を設定できます。
トークンを失効させる
SPA 認証
SPA認証はセッションCookieを使うため、トークンを発行・管理する必要がありません。自社フロントエンド(Vue, React, Next.js等)からAPIを呼び出す場合に適しています。Sanctum ミドルウェアを有効にする
bootstrap/app.php で statefulApi() ミドルウェアを有効にします。
ファーストパーティドメインを設定する
config/sanctum.php の stateful オプションにSPAのドメインを設定します。
CORS の設定
別のサブドメインからAPIを呼び出す場合は、CORS設定が必要です。config/cors.php で supports_credentials を true に設定します。
SPA からの認証フロー
1
CSRF クッキーを取得する
ログイン前に
/sanctum/csrf-cookie エンドポイントを叩いてCSRF保護を初期化します。2
ログインリクエストを送信する
/login エンドポイントにPOSTリクエストを送ります。3
認証済みリクエストを送る
ログイン後のリクエストはセッションCookieで自動的に認証されます。
認証済みルートの保護
auth:sanctum ミドルウェアをルートに適用すると、未認証のリクエストに対して 401 Unauthorized が返されます。APIトークン認証・SPA認証の両方をこのミドルウェア1つで処理できます。
実用例: ログイン API とトークン返却
モバイルアプリ向けのAPIトークン認証を実装する例です。1
ログインエンドポイントを作成する
2
認証済みルートを作成する
3
クライアントからリクエストを送る
テスト
Sanctum のテストではSanctum::actingAs() を使ってユーザーを認証し、付与するアビリティを指定します。
- Pest
- PHPUnit
まとめ
インストール手順の確認
インストール手順の確認
HasApiTokens トレイトを追加:よく使う API まとめ
よく使う API まとめ
APIトークン認証 vs SPA認証の選択
APIトークン認証 vs SPA認証の選択
- APIトークン認証: モバイルアプリ、サードパーティ、CLIツールなど、セッションを持たないクライアントから利用する場合。
- SPA認証: 自社のVue/React/Next.jsフロントエンドなど、同じドメイン(またはサブドメイン)上のSPAから利用する場合。よりセキュアでトークン管理が不要。