はじめに
これまでの記事では、Laravel 12 + Fortifyの基本認証やUI連携、認証情報の取得方法などを紹介してきました。
今回は「トークン」を活用し、APIや外部クライアントからも安全に認証できる仕組みを構築する方法を解説します。
1. Fortifyとトークン認証
Fortify自体は「ログイン/登録/パスワードリセットなどのエンドポイント提供」が主な役割で、
API用のトークン認証機能は内包していません。
そのため、トークン認証にはSanctumやPassportと組み合わせて使うのが一般的です。
ここでは「Fortify + Sanctum」を例にします。
2. Sanctumのインストールとセットアップ
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
config/sanctum.php
が生成されます。
3. Sanctumミドルウェアの有効化
app/Http/Kernel.php
のAPIミドルウェアグループに \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class
を追加(デフォルトで含まれています)。
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
4. Fortifyのエンドポイントでトークンを発行する
Fortifyの/login
エンドポイントにPOSTすると、通常はセッション認証ですが、APIの場合はコントローラで「トークン発行」を追加します。
例:routes/api.php
に独自のトークン発行エンドポイントを作成
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
Route::post('/token-login', function (Request $request) {
$request->validate([
'email' => 'required|email',
'password' => 'required',
// カスタム認証の場合、user_codeなども追加
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! \Hash::check($request->password, $user->password)) {
return response()->json(['message' => '認証失敗'], 401);
}
// トークンを発行
$token = $user->createToken('api-token')->plainTextToken;
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
'user' => $user,
]);
});
5. トークンでAPIを認証する
APIリクエスト時、Authorization: Bearer {トークン}
ヘッダーを付与します。
curl -H "Authorization: Bearer {発行されたトークン}" https://your-domain/api/user
routes/api.php
の保護ルート例:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
6. セキュリティのポイント
- トークンは漏洩しないよう厳重に管理
- 必要に応じて「トークン失効」や「スコープ(権限)」の設計も検討
- HTTPS通信を必須にする
まとめ
- Fortifyで認証エンドポイントを構築しつつ、Sanctumでトークン認証APIも簡単に追加できる
- SPAやモバイルアプリ、外部サービス連携でも「安全なログイン環境」を実現
- ユースケースに応じてセッション認証・トークン認証を使い分けよう