第25回: 認証付きAPI(APIトークン) — 「誰がリクエストしているか」をSanctumで確認する

章: 第3章: RESTful API設計

認証なしAPIは、誰でも叩けます

/api/users エンドポイントを作ったとき、認証がなければ世界中の誰でもアクセスできてしまいます。ユーザーデータや機密情報を扱うAPIには必ず「このリクエストは誰から来ているか」を確認する仕組みが必要です。

LaravelのSanctumを使えば、トークンの発行・検証・保護を最小限のコードで実現できます。

APIトークンの実装


<?php
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable {
    use HasApiTokens;
}
// トークン発行
$token = $user->createToken('api-token')->plainTextToken;

// リクエストヘッダ: Authorization: Bearer {token}

// ルート保護
Route::middleware('auth:sanctum')->get('/me', fn(Request $r) => $r->user());

認証なし vs トークン認証

観点 認証なし APIトークン認証
アクセス制御 誰でも利用可 トークン保持者のみ
ユーザー特定 不可能 $request->user() で取得
トークン無効化 $user->tokens()->delete()
複数デバイス デバイスごとにトークン発行可

チェックポイント: plainTextToken はトークン作成時にのみ取得できます。DBには必ずハッシュ化して保存されます。このトークンをユーザーに返したあとは再取得できないので、必ずレスポンスに含めてください。

ログイン・ログアウトフロー


<?php
// ログイン:トークン発行
Route::post('/login', function (Request $request) {
    $credentials = $request->only('email', 'password');
    if (!Auth::attempt($credentials)) {
        return response()->json(['error' => '認証失敗'], 401);
    }
    $token = Auth::user()->createToken('api-token')->plainTextToken;
    return response()->json(['token' => $token]);
});

// ログアウト:トークン削除
Route::middleware('auth:sanctum')->post('/logout', function (Request $request) {
    $request->user()->currentAccessToken()->delete();
    return response()->json(['message' => 'ログアウトしました']);
});

チェックポイント: トークンは Authorization: Bearer {token} ヘッダで送信します。Cookieベースのセッション認証とは異なるため、SPAやモバイルアプリのAPI認証に適しています。

まとめ & 次のステップ

  • Sanctumの HasApiTokens トレイトでトークンの発行・管理が簡単に実現できる
  • auth:sanctum ミドルウェアでルートを保護し、$request->user() で認証ユーザーを取得
  • ログアウト時は currentAccessToken()->delete() でトークンを無効化する

次回はJWTによる認証を学びます。ステートレスな認証方式として、マイクロサービスや複数サーバー環境での認証の仕組みです。

Related Articles