Skip to main content

Documentation Index

Fetch the complete documentation index at: https://kawax.biz/llms.txt

Use this file to discover all available pages before exploring further.

What is Passport

Laravel Passport is Laravel’s official package for running your app as an OAuth2 authorization server. Use it when your API must support standard OAuth2 flows for third-party clients.

Passport vs Sanctum

Choose Passport only when you need OAuth2. Choose Sanctum for simpler API token auth, SPA auth, or mobile auth.
CriteriaPassportSanctum
Primary goalOAuth2 serverSimple API authentication
Best fitThird-party app integrations, OAuth2 complianceFirst-party SPAs, mobile apps, personal tokens
ComplexityHigherLower

Installation

On Laravel 13, the official recommended setup is:
php artisan install:api --passport
For manual setup in an existing app, you can also use:
composer require laravel/passport
php artisan passport:install
For first deployment scenarios where you only need keys:
php artisan passport:keys

Configuration

User model

Add the HasApiTokens trait and OAuthenticatable interface to your User model.
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 guard

Configure the api guard in config/auth.php to use the passport driver.
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Service provider configuration

In AppServiceProvider::boot(), you can define scopes and token lifetimes.
use Carbon\CarbonInterval;
use Laravel\Passport\Passport;

public function boot(): void
{
    Passport::tokensCan([
        'orders:read' => 'Read orders',
        'orders:create' => 'Create orders',
    ]);

    Passport::defaultScopes(['orders:read']);

    Passport::tokensExpireIn(CarbonInterval::days(15));
    Passport::refreshTokensExpireIn(CarbonInterval::days(30));
    Passport::personalAccessTokensExpireIn(CarbonInterval::months(6));
}

Client management

Authorization code grant client

php artisan passport:client
Use this client for the standard OAuth2 flow with user consent.

Client credentials grant client

php artisan passport:client --client
For machine-to-machine routes, use EnsureClientIsResourceOwner.
use Laravel\Passport\Http\Middleware\EnsureClientIsResourceOwner;

Route::get('/orders', function () {
    // ...
})->middleware(EnsureClientIsResourceOwner::using('orders:read'));

Token management

Assign scopes

$accessToken = $user->createToken(
    'dashboard-token',
    ['orders:read', 'orders:create']
)->accessToken;

Check scopes

use Laravel\Passport\Http\Middleware\CheckToken;

Route::get('/orders', function () {
    // ...
})->middleware(['auth:api', CheckToken::using('orders:read')]);

Revoke tokens

use Laravel\Passport\Passport;

$token = Passport::token()->find($tokenId);
$token?->revoke();

Protecting API routes

Use auth:api on routes that require a valid user access token.
Route::middleware('auth:api')->group(function () {
    Route::get('/user', fn (Request $request) => $request->user());
    Route::get('/orders', [OrderController::class, 'index']);
});
For client credentials grant routes, use EnsureClientIsResourceOwner instead of auth:api.

Personal access token

This is useful when users need to issue tokens for themselves without the full OAuth2 redirect flow.
php artisan passport:client --personal
$token = $request->user()->createToken('cli-token', ['orders:read'])->accessToken;
If your main use case is personal access tokens only, the Laravel docs recommend considering Sanctum.
Last modified on April 17, 2026