Laravel

認証とAPI

利用者を識別し、権限を確かめ、必要なデータだけをAPIで返しましょう。

01

認証と認可を分ける

認証はログイン済みか、認可はその操作を許可するかを判断します。ログイン済みでも、他人の投稿の削除まで許可してはいけません。

未ログインauthで確認Policyで所有者を確認操作実行

認証画面は公式スターターキットを利用できます。自分でパスワード保存やセッション管理を作るより、標準の仕組みと公式の更新情報を優先します。

02

Middlewareで入口を守る

Middlewareは、Controllerへ到達する前に共通の検査を挟む仕組みです。ログイン必須、メール認証済み、レート制限などに使います。

routes/web.phpPHP
Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/dashboard', DashboardController::class)
        ->name('dashboard');
});
Controllerで利用者を得るPHP
public function store(Request $request)
{
    $request->user()->posts()->create(
        $request->validate($this->rules())
    );
}
03

Policyで操作を許可する

Policyは、モデルに対する閲覧・更新・削除などの判断をまとめます。Controllerごとに条件を重複させないために役立ちます。

PolicyPHP
public function delete(User $user, Post $post): bool
{
    return $user->is_admin || $user->id === $post->user_id;
}

public function destroy(Post $post)
{
    $this->authorize('delete', $post);
    $post->delete();
    return to_route('posts.index');
}
IDを隠すだけでは不十分 連番IDをUUIDへ変えても権限確認の代わりにはなりません。URLから他人のデータを推測できないことと、操作を許可することは別の対策です。
04

JSONレスポンスを設計する

APIでは、返す項目とステータスコードを決めます。モデルをそのまま返さず、API Resourceで公開する形を明示します。

ResourceCOMMAND / PHP
php artisan make:resource PostResource

public function toArray(Request $request): array
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        'author' => $this->user->name,
    ];
}
返却PHP
return PostResource::collection(
    Post::with('user')->latest()->paginate()
);
05

Sanctumを使う場面

自分のSPAやモバイルアプリからLaravel APIを呼ぶ場合、SanctumでSPA認証やAPIトークンを扱えます。用途に応じてstatefulなCookie認証とトークン認証を選びます。

認証必須のAPIPHP
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

トークンはログへ出したり、URLへ含めたりしません。権限、失効、HTTPS、CORS、レート制限も含めて設計し、認証の仕組みを理解せずに公開APIを作らないようにします。

PRACTICE

練習問題

ログイン利用者が自分のプロフィールをJSONで取得できるGET /api/meを作り、未認証なら401になるテストを書いてください。

確認ポイント
  • auth:sanctumをルートへ付ける
  • 公開するプロフィール項目をResourceで限定する
  • パスワードやトークンをJSONへ含めない
  • 認証済みと未認証の両方をテストする