【Laravel】Laravelの主な認証方法

Laravelの主な認証方法たち

Laravel Breeze

  • 🐣 シンプルな認証スターターキット。
  • Blade or Inertia(Vue/React)対応。
  • ログイン、登録、パスワードリセットなど、基本機能がすぐ使える。
  • 学習目的・小〜中規模アプリにぴったり

Laravel Jetstream

  • Breezeの進化系。
  • Inertia(Vue)か Livewire が前提。
  • チーム管理、2要素認証、セッション管理など高機能。
  • 大規模 or ユーザー管理が複雑なアプリ向け
  • UIの自由度はちょっと低め。

Laravel Fortify

  • Jetstreamの「バックエンドだけ版」。
  • 自分でフロントを作りたい人向け。
  • APIベースで、SPAやモバイルアプリと相性よし。
  • 独自UIを作るけど認証ロジックは任せたい派向け。

Laravel Sanctum

  • API認証用のトークンベース認証(SPAやモバイル向け)。
  • セッションクッキーを使ったSPA向け認証 or APIトークン認証どちらも可。
  • トークン制御が柔軟で、SPA開発によく使われる

Laravel Passport

  • OAuth2対応のがっつりAPI認証。
  • 外部サービスへの提供とか、本格的なAPI認証に。
  • 重たい & 学習コスト高め、なので今はSanctumのほうが人気。
シナリオよく使われる認証方式
通常のWebアプリ(Blade)Breeze 👍
SPA(Vue/React)Breeze + Sanctum or Fortify + Sanctum
チーム・2FAなど高度な機能Jetstream
API単体・OAuth対応が必要Passport

Sanctumでシンプルな認証

トークンベースの認証により、ステートレスなAPI通信が可能

シンプルなメモアプリのAPI

1. ログイン email + password → トークン取得 2. メモ作成 認証済みユーザーのみ メモの作成が可能 3. メモ取得 自分のメモのみ 取得可能 POST /api/login → トークン取得 POST /api/memos → メモ作成 (要トークン) GET /api/memos → メモ一覧取得 (要トークン)
// routes/api.php
// ユーザー登録
Route::post('/register', function (Request $request) {
    $user = User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
    ]);
    
    $token = $user->createToken('auth-token')->plainTextToken;
    
    return response()->json([
        'token' => $token
    ]);
});

// ログイン
Route::post('/login', function (Request $request) {
    $user = User::where('email', $request->email)->first();
    
    if (!$user || !Hash::check($request->password, $user->password)) {
        return response()->json(['message' => 'Unauthorized'], 401);
    }
    
    $token = $user->createToken('auth-token')->plainTextToken;
    
    return response()->json([
        'token' => $token
    ]);
});
// routes/api.php
Route::middleware('auth:sanctum')->group(function () {
    // メモの作成
    Route::post('/memos', function (Request $request) {
        $memo = $request->user()->memos()->create([
            'title' => $request->title,
            'content' => $request->content
        ]);
        
        return response()->json($memo);
    });
    
    // メモの取得
    Route::get('/memos', function (Request $request) {
        $memos = $request->user()->memos;
        return response()->json($memos);
    });
});
// ログイン
async function login() {
    const response = await fetch('api/login', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            email: 'user@example.com',
            password: 'password123'
        })
    });
    const data = await response.json();
    // トークンを保存
    localStorage.setItem('token', data.token);
}

// メモを作成
async function createMemo() {
    const response = await fetch('api/memos', {
        method: 'POST',
        headers: {
            'Authorization': `Bearer ${localStorage.getItem('token')}`,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            title: '新しいメモ',
            content: 'メモの内容'
        })
    });
    const memo = await response.json();
    console.log('作成されたメモ:', memo);
}