workos/workos-php
Official WorkOS PHP SDK for interacting with the WorkOS API. Includes support for Single Sign-On, Directory Sync, Admin Portal, and Magic Link features. Configure via WORKOS_API_KEY and WORKOS_CLIENT_ID environment variables.
Installation:
composer require workos/workos-php
Ensure WORKOS_API_KEY and WORKOS_CLIENT_ID are set in your .env file.
Initialize the Client:
use WorkOS\WorkOS;
$workos = new WorkOS(
apiKey: env('WORKOS_API_KEY'),
clientId: env('WORKOS_CLIENT_ID')
);
First Use Case: Fetch a User
$user = $workos->userManagement()->getUser('user_123');
$authUrl = $workos->sso()->getAuthorizationUrl(
redirectUri: 'https://your-app.com/callback',
domain: 'your-org.example.com',
state: json_encode(['return_to' => '/dashboard'])
);
$profile = $workos->sso()->getProfileAndToken(
code: $request->input('code'),
clientId: env('WORKOS_CLIENT_ID'),
clientSecret: env('WORKOS_API_KEY')
);
$connections = $workos->directorySync()->listConnections();
$workos->directorySync()->syncUsers(
connectionId: 'conn_123',
users: [
['email' => 'user@example.com', 'status' => 'active']
]
);
$portal = $workos->adminPortal()->createPortal(
name: 'Admin Portal',
domain: 'admin.your-app.com'
);
$portals = $workos->adminPortal()->listPortals();
$users = $workos->userManagement()->listUsers();
foreach ($users->autoPagingIterator() as $user) {
// Process each user
}
try {
$workos->userManagement()->createUser(email: 'user@example.com');
} catch (\WorkOS\Exception\BadRequestException $e) {
// Handle validation errors
dd($e->getErrors());
}
PHP Version Requirement:
Static Methods Deprecated:
WorkOS::setApiKey() or WorkOS::getClientId(). Use the instantiated client.$workos = new WorkOS(apiKey: env('WORKOS_API_KEY'));
Named Arguments:
// ❌ Avoid
$workos->userManagement()->createUser('user@example.com', 'active');
// ✅ Prefer
$workos->userManagement()->createUser(email: 'user@example.com', status: 'active');
Session Handling:
UserManagement no longer handles sessions. Use SessionManager:
$authResult = $workos->sessionManager()->authenticate(
sessionData: $_COOKIE['wos-session'] ?? '',
cookiePassword: env('SESSION_COOKIE_PASSWORD'),
clientId: env('WORKOS_CLIENT_ID')
);
Pagination Changes:
PaginatedResource → PaginatedResponse. Access data via:
$users = $page->data; // Instead of $page->users
$after = $page->listMetadata['after'] ?? null;
Resource Mutability:
$user->status = 'inactive'; // ❌ Fails
toArray() and recreate:
$updatedUser = $workos->userManagement()->updateUser(
userId: $user->id,
status: 'inactive'
);
Enable Guzzle Debugging:
$handler = \Http\Message\Mock\MockHandler::create();
$stack = \Http\Message\Mock\MockClient::create($handler);
$workos = new WorkOS(handler: $stack);
Check HTTP Headers:
Authorization: Bearer headers are included for protected endpoints.Content-Type: application/json for API requests.Rate Limits:
RateLimitExceededException and implement retries with retryAfter:
if ($e instanceof \WorkOS\Exception\RateLimitExceededException) {
sleep($e->retryAfter);
retry();
}
Custom HTTP Client:
HandlerStack for middleware (e.g., logging, retries):
$stack = \GuzzleHttp\HandlerStack::create();
$stack->push(\GuzzleHttp\Middleware::retry());
$workos = new WorkOS(handler: $stack);
Webhook Verification:
WorkOS\Webhook for HMAC validation:
$webhook = new \WorkOS\Webhook(
secret: env('WORKOS_WEBHOOK_SECRET')
);
$valid = $webhook->verify($request->getContent(), $request->headers);
Feature Flags:
$flags = $workos->featureFlags()->listFeatureFlags();
if ($flags->data['new_ui'] === 'enabled') {
// Enable new UI
}
Environment Variables:
WORKOS_API_KEY and WORKOS_CLIENT_ID.$workos = new WorkOS(apiKey: 'custom_key', clientId: 'custom_id');
Beta Features:
composer require workos/workos-php:5.0.0-beta.1
Timeouts:
$workos = new WorkOS(timeout: 30); // 30 seconds
How can I help you explore Laravel packages today?