¿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.
| Punto | Passport | Sanctum |
|---|
| Objetivo | Implementación de servidor OAuth2 | Autenticación de API sencilla |
| Casos adecuados | Integraciones externas, cumplimiento estricto de OAuth2 | SPAs propias, móvil, tokens personales |
| Complejidad | Alta | Baja |
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