#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}ヘッダーでリクエストする
次回はイベントとリスナーを使ったデカップリングを学びます。