Passportとは
Laravel Passport は、Laravel アプリを OAuth2 認可サーバーとして動かすための公式パッケージです。
サードパーティアプリ連携や、厳密な OAuth2 フローが必要な API で使います。
Passport vs Sanctum
OAuth2 が必須なら Passport を選びます。
単純な API トークン認証や SPA / モバイル認証が目的なら Sanctum を選びます。
| 観点 | Passport | Sanctum |
|---|
| 目的 | OAuth2サーバー実装 | シンプルなAPI認証 |
| 向いているケース | 外部アプリ連携、OAuth2標準準拠 | 自社SPA、モバイル、個人用トークン |
| 複雑さ | 高い | 低い |
インストール
Laravel 13 の公式推奨は install:api --passport です。
php artisan install:api --passport
既存プロジェクトで手動導入する場合は、次のコマンドでもセットアップできます。
composer require laravel/passport
php artisan passport:install
初回デプロイ時は鍵生成だけ実行したいケースもあります。
php artisan passport:keys
Userモデル
User モデルに HasApiTokens トレイトと OAuthenticatable インターフェースを追加します。
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\Contracts\OAuthenticatable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable implements OAuthenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}
authガード
config/auth.php の api ガードで passport ドライバーを使います。
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
サービスプロバイダー設定
AppServiceProvider の boot() でスコープ定義とトークン有効期限を設定できます。
use Carbon\CarbonInterval;
use Laravel\Passport\Passport;
public function boot(): void
{
Passport::tokensCan([
'orders:read' => '注文の参照',
'orders:create' => '注文の作成',
]);
Passport::defaultScopes(['orders:read']);
Passport::tokensExpireIn(CarbonInterval::days(15));
Passport::refreshTokensExpireIn(CarbonInterval::days(30));
Passport::personalAccessTokensExpireIn(CarbonInterval::months(6));
}
クライアント管理
認可コードグラント用クライアント
php artisan passport:client
このクライアントは、ユーザー同意画面を伴う OAuth2 の標準フローで使います。
クライアントクレデンシャルグラント用クライアント
php artisan passport:client --client
マシン間通信のエンドポイントでは EnsureClientIsResourceOwner ミドルウェアを使います。
use Laravel\Passport\Http\Middleware\EnsureClientIsResourceOwner;
Route::get('/orders', function () {
// ...
})->middleware(EnsureClientIsResourceOwner::using('orders:read'));
トークン管理
スコープ付与
$accessToken = $user->createToken(
'dashboard-token',
['orders:read', 'orders:create']
)->accessToken;
スコープチェック
use Laravel\Passport\Http\Middleware\CheckToken;
Route::get('/orders', function () {
// ...
})->middleware(['auth:api', CheckToken::using('orders:read')]);
use Laravel\Passport\Passport;
$token = Passport::token()->find($tokenId);
$token?->revoke();
APIルートの保護
ユーザーアクセストークンで保護する API には auth:api を付けます。
Route::middleware('auth:api')->group(function () {
Route::get('/user', fn (Request $request) => $request->user());
Route::get('/orders', [OrderController::class, 'index']);
});
クライアントクレデンシャルグラントのルートは auth:api ではなく EnsureClientIsResourceOwner を使ってください。
Personal Access Token
OAuth2 の完全フローを使わず、ユーザー自身が API トークンを発行する用途に向いています。
php artisan passport:client --personal
$token = $request->user()->createToken('cli-token', ['orders:read'])->accessToken;
Personal Access Token が主用途なら、Laravel公式でも Sanctum を検討することが推奨されています。
関連リンク