0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel 12 + Fortify その5 トークンで安全なログイン環境を構築

Posted at

はじめに

これまでの記事では、Laravel 12 + Fortifyの基本認証やUI連携、認証情報の取得方法などを紹介してきました。
今回は「トークン」を活用し、APIや外部クライアントからも安全に認証できる仕組みを構築する方法を解説します。


1. Fortifyとトークン認証

Fortify自体は「ログイン/登録/パスワードリセットなどのエンドポイント提供」が主な役割で、
API用のトークン認証機能は内包していません。
そのため、トークン認証にはSanctumPassportと組み合わせて使うのが一般的です。
ここでは「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やモバイルアプリ、外部サービス連携でも「安全なログイン環境」を実現
  • ユースケースに応じてセッション認証・トークン認証を使い分けよう

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?