章: 第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による認証を学びます。ステートレスな認証方式として、マイクロサービスや複数サーバー環境での認証の仕組みです。