Saltar al contenido principal

¿Qué es Passport?

Laravel Passport es el paquete oficial para hacer que una aplicación Laravel funcione como servidor de autorización OAuth2. Se usa en integraciones con aplicaciones de terceros o en APIs que requieren un flujo OAuth2 estricto.

Passport vs Sanctum

Si necesitas OAuth2, elige Passport. Si tu objetivo es simplemente autenticación por API tokens o autenticación de SPA / móvil, elige Sanctum.
PuntoPassportSanctum
ObjetivoImplementación de servidor OAuth2Autenticación de API sencilla
Casos adecuadosIntegraciones externas, cumplimiento estricto de OAuth2SPAs propias, móvil, tokens personales
ComplejidadAltaBaja

Instalación

La recomendación oficial en Laravel 13 es install:api --passport.
php artisan install:api --passport
Para instalarlo manualmente en un proyecto existente, también puedes usar:
composer require laravel/passport
php artisan passport:install
En un primer despliegue puede que solo quieras generar las claves:
php artisan passport:keys

Configuración

Modelo User

Añade al modelo User el trait HasApiTokens y la interfaz 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

En la guard api de config/auth.php, usa el driver passport.
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Configuración en el service provider

En el boot() de AppServiceProvider puedes definir los scopes y la vida útil de los tokens.
use Carbon\CarbonInterval;
use Laravel\Passport\Passport;

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

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

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

Gestión de clientes

Cliente para authorization code grant

php artisan passport:client
Este cliente se usa en el flujo estándar de OAuth2 con pantalla de consentimiento del usuario.

Cliente para client credentials grant

php artisan passport:client --client
En endpoints de comunicación máquina a máquina usa el middleware EnsureClientIsResourceOwner.
use Laravel\Passport\Http\Middleware\EnsureClientIsResourceOwner;

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

Gestión de tokens

Asignar scopes

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

Verificar scopes

use Laravel\Passport\Http\Middleware\CheckToken;

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

Revocación

use Laravel\Passport\Passport;

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

Protección de rutas de API

Añade auth:api a las APIs que quieras proteger con el access token del usuario.
Route::middleware('auth:api')->group(function () {
    Route::get('/user', fn (Request $request) => $request->user());
    Route::get('/orders', [OrderController::class, 'index']);
});
Para las rutas del client credentials grant, usa EnsureClientIsResourceOwner en lugar de auth:api.

Personal Access Token

Adecuados para casos en los que el propio usuario emite API tokens, sin usar el flujo OAuth2 completo.
php artisan passport:client --personal
$token = $request->user()->createToken('cli-token', ['orders:read'])->accessToken;
Si tu uso principal son los personal access tokens, la propia documentación oficial de Laravel recomienda considerar Sanctum.

Enlaces relacionados

Última modificación el 13 de julio de 2026