LaravelとAPI開発【Sanctum & Passport】

はじめに

モダンなウェブアプリケーション開発において、APIの重要性は日々高まっています。特にSPA(Single Page Application)やモバイルアプリケーションとの連携が必要な場合、堅牢なAPI開発は不可欠です。PHPフレームワークとして人気の高いLaravelでは、API開発を効率的に行うための機能が充実しています。特に認証システムとして、SanctumとPassportという2つの強力なパッケージが提供されています。この記事では、これらの特徴と使い分けについて詳しく解説します。

LaravelにおけるAPI開発の基礎

LaravelでAPI開発を行う場合、主に以下の要素を考慮する必要があります:

  1. ルーティング設定
  2. コントローラーの実装
  3. リソースの定義
  4. 認証システムの構築
  5. レート制限の設定

特に認証システムは、APIのセキュリティを確保するために極めて重要です。Laravelでは、SanctumとPassportという2つの認証パッケージが提供されています。

Laravel Sanctum

Laravel Sanctumは、SPAやモバイルアプリケーション、シンプルなトークンベースのAPIのための軽量な認証システムです。

Sanctumの主な特徴

  • 簡単なトークン発行と管理
  • SPAのためのCSRF保護とセッション認証
  • APIトークンの有効期限設定
  • シンプルな実装と設定

Sanctumのインストールと設定

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

// マイグレーションの実行
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

Sanctumを使った認証の実装例

// ユーザー登録
public function register(Request $request)
{
    $validatedData = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8|confirmed',
    ]);

    $user = User::create([
        'name' => $validatedData['name'],
        'email' => $validatedData['email'],
        'password' => Hash::make($validatedData['password']),
    ]);

    $token = $user->createToken('auth_token')->plainTextToken;

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

// ログイン
public function login(Request $request)
{
    if (!Auth::attempt($request->only('email', 'password'))) {
        return response()->json([
            'message' => '認証に失敗しました'
        ], 401);
    }

    $user = User::where('email', $request->email)->firstOrFail();
    $token = $user->createToken('auth_token')->plainTextToken;

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

Laravel Passport

Laravel Passportは、OAuth2.0規格に準拠した完全な認証サーバーを実装できるパッケージです。複雑なAPI認証要件がある場合に適しています。

Passportの主な特徴

  • OAuth2.0フルサポート
  • クライアントIDとシークレットの管理
  • アクセストークンとリフレッシュトークンの発行
  • スコープによる権限管理
  • パーソナルアクセストークンの発行

Passportのインストールと設定

// Passportのインストール
composer require laravel/passport

// マイグレーションとキーの生成
php artisan migrate
php artisan passport:install

モデルの設定

// User.php
namespace App\Models;

use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens;
    
    // ...
}

Passportを使った認証の実装例

// AuthServiceProvider.php
public function boot()
{
    $this->registerPolicies();
    
    if (! $this->app->routesAreCached()) {
        Passport::routes();
    }
    
    Passport::tokensExpireIn(now()->addDays(15));
    Passport::refreshTokensExpireIn(now()->addDays(30));
    
    Passport::tokensCan([
        'read-user' => 'ユーザー情報の読み取り',
        'update-user' => 'ユーザー情報の更新',
    ]);
}

SanctumとPassportの比較

機能SanctumPassport
複雑さシンプル複雑
OAuth2.0対応×
SPA認証△ (追加設定必要)
モバイルアプリ連携
スコープ管理×
リフレッシュトークン×
設定の容易さ非常に簡単やや複雑

使い分けのポイント

Sanctumを選ぶケース

  • シンプルなAPIトークン認証が必要な場合
  • SPAと同じドメインのAPIを開発する場合
  • 軽量な認証システムが好ましい場合
  • OAuth2.0が不要な場合

Passportを選ぶケース

  • OAuth2.0の機能が必要な場合
  • サードパーティアプリケーションにAPIを公開する場合
  • 高度なトークン管理(有効期限、スコープなど)が必要な場合
  • リフレッシュトークンの機能が必要な場合

セキュリティ対策

APIの開発においては、セキュリティ対策も重要です。以下のポイントに注意しましょう:

  1. HTTPSの使用
  2. トークンの有効期限の設定
  3. 適切な権限管理
  4. レート制限の実装
  5. 不要なデータの露出防止

まとめ

LaravelにおけるAPI開発では、SanctumとPassportという2つの認証パッケージが提供されています。用途や要件に応じて適切に選択することで、堅牢で効率的なAPI開発が可能です。Sanctumはシンプルさと導入のしやすさが特徴であり、Passportは高度な認証機能と柔軟性が特徴です。プロジェクトの規模や要件に合わせて、最適な選択をしましょう。

APIの設計段階から認証方式を慎重に検討し、セキュリティと使いやすさのバランスを考慮したAPI開発を心がけることが重要です。

コメント

タイトルとURLをコピーしました