laravel/workos
Laravel utilities used by Laravel starter kits to integrate WorkOS AuthKit. Provides the glue for authentication flows and configuration so you can add WorkOS-powered login to a Laravel app quickly and consistently.
Installation:
composer require laravel/workos
Add the WorkOS service provider to config/app.php:
'providers' => [
// ...
Laravel\Workos\WorkosServiceProvider::class,
],
Configuration: Publish the config file:
php artisan vendor:publish --provider="Laravel\Workos\WorkosServiceProvider" --tag="config"
Update .env with your WorkOS credentials:
WORKOS_API_KEY=your_api_key_here
WORKOS_SECRET_KEY=your_secret_key_here
First Use Case:
Integrate WorkOS AuthKit into your Laravel app by extending the WorkosAuthKit facade:
use Laravel\Workos\Facades\WorkosAuthKit;
// Verify a user's session
$user = WorkosAuthKit::verifySession();
// Redirect to WorkOS login if needed
if (!$user) {
return redirect()->away(WorkosAuthKit::loginUrl());
}
WorkosAuthKit facade: Central interface for authentication flows.workos.auth middleware to protect routes.WorkosEvents for custom logic (e.g., user provisioning).Authentication Flow:
WorkosAuthKit::loginUrl()./workos/callback route (configured in routes/web.php):
Route::get('/workos/callback', [WorkosAuthKit::class, 'handleCallback']);
WorkosAuthKit::verifySession() in controllers/middleware.User Provisioning:
Workos\Events\UserProvisioned to sync WorkOS users with your database:
WorkosAuthKit::provisionUser($workosUser, function ($workosUser) {
return User::firstOrCreate([
'email' => $workosUser->email,
]);
});
Directory Sync:
$directories = WorkosAuthKit::getDirectories();
foreach ($directories as $directory) {
// Map to your local groups/roles
}
WorkosAuthKit to add custom claims to tokens:
WorkosAuthKit::extendClaims(function ($user) {
return ['custom_claim' => 'value'];
});
WorkosAuthKit mock in tests:
WorkosAuthKit::shouldReceive('verifySession')->andReturn($mockUser);
Protect routes with the built-in middleware:
Route::middleware(['workos.auth'])->group(function () {
// Protected routes
});
API Key Misconfiguration:
WORKOS_API_KEY and WORKOS_SECRET_KEY are set in .env and match WorkOS dashboard credentials.config/workos.php for overrides and validate keys there.Callback Route Conflicts:
/workos/callback route must be publicly accessible. Avoid naming conflicts with other routes.Route::get('/workos/callback', [WorkosAuthKit::class, 'handleCallback'])
->name('workos.callback');
Session Expiry:
Workos\Exceptions\SessionExpired gracefully:
try {
$user = WorkosAuthKit::verifySession();
} catch (SessionExpired $e) {
return redirect()->away(WorkosAuthKit::loginUrl());
}
Directory Sync Delays:
$directories = Cache::remember('workos.directories', now()->addHours(1), function () {
return WorkosAuthKit::getDirectories();
});
Log WorkOS Responses:
Enable debug mode in config/workos.php:
'debug' => env('WORKOS_DEBUG', false),
Logs will appear in storage/logs/laravel.log.
Token Validation: If tokens fail validation, verify:
WORKOS_SECRET_KEY is correct.iss claim).exp claim).Custom Providers: Override the default WorkOS provider by binding a custom implementation:
$this->app->bind(
Laravel\Workos\Contracts\WorkosProvider::class,
App\Services\CustomWorkosProvider::class
);
Event Hooks:
Extend the WorkosEvents class to add custom logic:
WorkosAuthKit::on('user.provisioned', function ($user) {
// Custom logic (e.g., send welcome email)
});
Token Claims: Modify claims before they’re sent to WorkOS:
WorkosAuthKit::extendClaims(function ($user) {
return [
'department' => $user->department,
'is_admin' => $user->isAdmin(),
];
});
WORKOS_* env vars to override config values (e.g., WORKOS_API_URL for custom WorkOS instances).APP_URL=https://localhost
How can I help you explore Laravel packages today?