Overview
SCIM (System for Cross-domain Identity Management) enables:- Automated User Provisioning: Create users from Azure AD, Okta, Google Workspace
- Attribute Synchronization: Keep user profiles in sync
- Deprovisioning: Automatically disable users when removed from source
- Group Management: Sync group memberships
- Bulk Operations: Provision hundreds of users at once
SCIM Provisioning Lifecycle Flow
Supported Endpoints
Users
POST /scim/v2/Users- Create userGET /scim/v2/Users/{id}- Get userPUT /scim/v2/Users/{id}- Replace userPATCH /scim/v2/Users/{id}- Update user (partial)DELETE /scim/v2/Users/{id}- Deactivate userGET /scim/v2/Users?filter=...- Search users
Groups
POST /scim/v2/Groups- Create groupGET /scim/v2/Groups/{id}- Get groupPATCH /scim/v2/Groups/{id}- Update group membership
Quick Start
1. Enable SCIM
2. Create Service Principal for SCIM
3. Configure External System
Configure your identity provider to use SCIM: Azure AD:- Enterprise Applications → Your App → Provisioning
- Set Tenant URL:
https://api.example.com/scim/v2 - Set Secret Token:
Bearer <JWT_TOKEN> - Test connection
- Enable provisioning
- Applications → Your App → Provisioning → Integration
- Set SCIM Base URL:
https://api.example.com/scim/v2 - Set Authentication: OAuth2 Client Credentials
- Set Client ID/Secret from service principal
SCIM Examples
Create User
Update User (PATCH)
Deactivate User (DELETE)
Search Users
Create Group
Enterprise User Extension
SCIM supports enterprise-specific attributes:employeeNumber→employeeNumberdepartment→departmentorganization→organization
OpenFGA Synchronization
When users are provisioned via SCIM, roles are automatically synced to OpenFGA:["user"]
Configure in .env:
Monitoring
Prometheus Metrics
Audit Logs
All SCIM operations are logged:Troubleshooting
401 Unauthorized
Issue: SCIM client cannot authenticate Solutions:- Verify JWT token is valid
- Check service principal credentials
- Ensure token not expired (refresh if needed)
409 Conflict (User Exists)
Issue: User already exists in Keycloak Solutions:- Use PATCH to update instead of POST
- Check userName field (must be unique)
- Query before creating:
GET /scim/v2/Users?filter=userName eq "alice@example.com"
Attribute Not Mapped
Issue: Enterprise attributes not appearing in Keycloak Solutions:- Check schema includes enterprise extension
- Verify attribute mapping in
user_to_keycloak() - Check Keycloak user attributes in Admin Console
References
Architecture & API Docs
- ADR: ADR-0038: SCIM Implementation
- API Reference: SCIM 2.0 API
- RFC 7643: SCIM Core Schema
- RFC 7644: SCIM Protocol
Related Guides
- Service Principals - Provision service principals via SCIM
- API Key Management - Create API keys for provisioned users
- OpenFGA Setup - Automatic permission sync with SCIM
- Permission Model - Understanding role-based access control