laravel/airlock
Laravel Sanctum (formerly Airlock) provides a lightweight authentication system for Laravel SPAs and simple APIs. Issue and manage API tokens or use cookie-based session auth for first-party SPAs, with minimal setup and seamless integration.
Installation:
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" --tag="sanctum-config"
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" --tag="sanctum-migrations"
php artisan migrate
personal_access_tokens table.Middleware Setup:
Add Sanctum middleware to app/Http/Kernel.php:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
api middleware group is applied to routes requiring auth.First Use Case:
php artisan make:auth
LoginController (or custom auth logic).use Laravel\Sanctum\PersonalAccessToken;
$token = PersonalAccessToken::createToken('token-name', $user);
return $token->plainTextToken; // Return to frontend
Token-Based Authentication:
Authorization: Bearer <token> in requests.HasApiTokens trait (applied to User model by default).Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user(); // Auto-resolved authenticated user
});
Stateful Sessions (SPAs):
X-XSRF-TOKEN header (CSRF protection)./sanctum/csrf-cookie.fetch('/sanctum/csrf-cookie').then(...)).Token Management:
$user->tokens; // Collection of PersonalAccessToken models
$token->delete();
Customizing Token Creation:
PersonalAccessToken or use events:
use Laravel\Sanctum\Events\PersonalAccessTokenCreated;
PersonalAccessTokenCreated::dispatch($token, $abilities);
actingAs() with tokens:
$user = User::factory()->create();
$token = $user->createToken('test-token')->plainTextToken;
$response = $this->withHeader('Authorization', 'Bearer '.$token)
->get('/user');
throttle middleware:
Route::middleware(['throttle:60,1', 'auth:sanctum'])->get('/rate-limited');
CSRF Token Mismatch:
/sanctum/csrf-cookie before authenticated requests.Token Leaks:
.env for sensitive values (e.g., SANCTUM_STATEFUL_DOMAIN).HttpOnly cookies or secure memory (e.g., Vuex/Pinia).Middleware Order:
auth:sanctum must run after EnsureFrontendRequestsAreStateful.app/Http/Kernel.php middleware order.Token Expiration:
PersonalAccessToken model:
use Laravel\Sanctum\PersonalAccessToken;
$token = PersonalAccessToken::createToken('test', $user, now()->addHours(1));
Token Validation Errors:
sanctum.token middleware logs for malformed tokens.SANCTUM_STATEFUL_DOMAIN matches frontend origin (e.g., localhost in dev).Database Issues:
personal_access_tokens table exists and has correct columns (tokenable_id, abilities, etc.).Custom Token Models:
PersonalAccessToken to add metadata:
class CustomToken extends PersonalAccessToken {
protected $casts = ['metadata' => 'array'];
}
Token Events:
PersonalAccessTokenCreated::listen(function ($token, $abilities) {
// Log or notify
});
API Resource Filtering:
$token = $user->createToken('admin-token', ['admin']);
// Then use `can()` in policies:
public function handle(Request $request, Closure $next) {
$request->user()->mustBeAdmin(); // Custom method
return $next($request);
}
Testing Tokens:
$this->actingAs($user, 'sanctum');
// Or with a specific token:
$this->withToken($token->plainTextToken);
How can I help you explore Laravel packages today?