Vai al contenuto principale

Cos’è Passport

Laravel Passport è il pacchetto ufficiale per far funzionare un’app Laravel come server di autorizzazione OAuth2. Si usa per integrazioni con app di terze parti o per API che richiedono un flusso OAuth2 rigoroso.

Passport vs Sanctum

Se OAuth2 è necessario scegli Passport. Se l’obiettivo è una semplice autenticazione tramite API token o l’autenticazione SPA/mobile, scegli Sanctum.
AspettoPassportSanctum
ScopoImplementazione di server OAuth2Autenticazione API semplice
Casi d’usoIntegrazione con app esterne, conformità allo standard OAuth2SPA proprie, mobile, token personali
ComplessitàElevataBassa

Installazione

La raccomandazione ufficiale di Laravel 13 è install:api --passport.
php artisan install:api --passport
Per l’installazione manuale in un progetto esistente puoi usare anche i seguenti comandi.
composer require laravel/passport
php artisan passport:install
Al primo deploy potresti voler eseguire solo la generazione delle chiavi.
php artisan passport:keys

Configurazione

Modello User

Aggiungi al modello User il trait HasApiTokens e l’interfaccia 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;
}

Guard auth

Nella guard api di config/auth.php usa il driver passport.
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Configurazione nel service provider

Nel metodo boot() di AppServiceProvider puoi configurare gli scope e la scadenza dei token.
use Carbon\CarbonInterval;
use Laravel\Passport\Passport;

public function boot(): void
{
    Passport::tokensCan([
        'orders:read' => 'Lettura degli ordini',
        'orders:create' => 'Creazione degli ordini',
    ]);

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

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

Gestione dei client

Client per authorization code grant

php artisan passport:client
Questo client si usa nel flusso OAuth2 standard che prevede una schermata di consenso dell’utente.

Client per client credentials grant

php artisan passport:client --client
Per gli endpoint di comunicazione machine-to-machine usa il middleware EnsureClientIsResourceOwner.
use Laravel\Passport\Http\Middleware\EnsureClientIsResourceOwner;

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

Gestione dei token

Assegnare gli scope

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

Verifica degli scope

use Laravel\Passport\Http\Middleware\CheckToken;

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

Revoca

use Laravel\Passport\Passport;

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

Protezione delle route API

Alle API protette tramite user access token applica auth:api.
Route::middleware('auth:api')->group(function () {
    Route::get('/user', fn (Request $request) => $request->user());
    Route::get('/orders', [OrderController::class, 'index']);
});
Per le route del client credentials grant non usare auth:api, ma EnsureClientIsResourceOwner.

Personal Access Token

Adatti agli scenari in cui gli utenti emettono da soli token API, senza usare il flusso OAuth2 completo.
php artisan passport:client --personal
$token = $request->user()->createToken('cli-token', ['orders:read'])->accessToken;
Se il caso d’uso principale sono i Personal Access Token, anche ufficialmente Laravel consiglia di valutare Sanctum.
Ultima modifica il 13 luglio 2026