#23 Laravel基礎

API認証 — Laravel Sanctum

Sanctumとは

Laravel Sanctumは、モバイルアプリや外部クライアント向けのAPIトークン認証と、SPA(シングルページアプリケーション)向けのCookieセッション認証の2つを提供する軽量な認証パッケージです。

この回ではよく使われるAPIトークン認証を解説します。


インストール

# Sanctumのインストール
composer require laravel/sanctum

# マイグレーションの実行(personal_access_tokens テーブルが作られる)
php artisan migrate

User モデルに HasApiTokens を追加

<?php
// 📁 app/Models/User.php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens; // ← インポート

class User extends Authenticatable
{
    use HasApiTokens; // ← トレイトを追加
}

認証APIを作る

<?php
// 📁 routes/api.php

use App\Http\Controllers\Api\AuthController;

Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->group(function () {
    Route::post('/logout', [AuthController::class, 'logout']);
    Route::get('/user',    [AuthController::class, 'me']);
});
<?php
// 📁 app/Http/Controllers/Api/AuthController.php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    // ログイン → トークン発行
    public function login(Request $request)
    {
        $request->validate([
            'email'    => 'required|email',
            'password' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (! $user || ! Hash::check($request->password, $user->password)) {
            return response()->json(['message' => 'メールアドレスまたはパスワードが正しくありません'], 401);
        }

        // トークンを生成(第1引数はトークン名)
        $token = $user->createToken('api-token')->plainTextToken;

        return response()->json([
            'token' => $token,
            'user'  => $user,
        ]);
    }

    // ログアウト → 現在のトークンを削除
    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        return response()->json(['message' => 'ログアウトしました']);
    }

    // 現在のユーザー情報を返す
    public function me(Request $request)
    {
        return response()->json($request->user());
    }
}

APIを呼び出す側(クライアント)

クライアント(モバイルアプリなど)はログインで取得したトークンを Authorization ヘッダーに付けてリクエストします。

GET /api/user
Authorization: Bearer 1|your_token_here

トークンの管理

// ユーザーの全トークンを取得
$user->tokens;

// 特定のトークンを削除
$user->tokens()->where('name', 'api-token')->delete();

// 全トークンを削除(全デバイスからログアウト)
$user->tokens()->delete();

トークンにアビリティ(権限)を付ける

// 読み取りだけできるトークンを発行
$token = $user->createToken('read-only', ['read'])->plainTextToken;

// 書き込みもできるトークンを発行
$token = $user->createToken('full-access', ['read', 'write'])->plainTextToken;

コントローラーで確認:

if ($request->user()->tokenCan('write')) {
    // 書き込み権限あり
}

まとめ

  • composer require laravel/sanctum でインストール
  • User モデルに HasApiTokens トレイトを追加する
  • $user->createToken('名前')->plainTextToken でトークンを発行する
  • APIルートに auth:sanctum ミドルウェアを付けてトークン認証を要求する
  • クライアントは Authorization: Bearer {token} ヘッダーでリクエストする

次回はイベントとリスナーを使ったデカップリングを学びます。