38. SCIM 2.0 Implementation Approach
Date: 2025-01-28Status
AcceptedCategory
Authentication & AuthorizationContext
External identity management systems (Azure AD, Okta, Google Workspace, OneLogin) need to programmatically provision/deprovision users and groups. Industry standard is SCIM 2.0 (System for Cross-domain Identity Management), but Keycloak does not have native SCIM 2.0 server support. Requirements:- External systems provision users automatically
- User creation/update/deactivation via API
- Group/role synchronization
- Bulk operations for initial provisioning
- Consistent with Keycloak as authoritative source (ADR-0031)
Decision
Implement FastAPI SCIM 2.0 endpoints that bridge to Keycloak Admin API, providing standard SCIM interface while maintaining Keycloak as authoritative identity store.Architecture
Core Principles
- SCIM 2.0 Compliance: Implement RFC 7643/7644 endpoints
- Keycloak Bridge: All operations proxy to Keycloak Admin API
- Automatic Sync: User provisioning triggers OpenFGA role sync
- JWT Authentication: SCIM endpoints require JWT tokens (service principals)
- Idempotent Operations: Multiple creates/updates safe
- Event-Driven: User events trigger webhooks/notifications
SCIM Endpoints
Users:- POST
/scim/v2/Users- Create user - GET
/scim/v2/Users/{id}- Get user - PUT
/scim/v2/Users/{id}- Replace user - PATCH
/scim/v2/Users/{id}- Update user (partial) - DELETE
/scim/v2/Users/{id}- Deactivate user - GET
/scim/v2/Users?filter=...- Search users
- POST
/scim/v2/Groups- Create group - GET
/scim/v2/Groups/{id}- Get group - PATCH
/scim/v2/Groups/{id}- Update group membership
SCIM Schema
Core User Schema:Configuration
Consequences
Positive Consequences
- Standard SCIM 2.0 interface (works with all SCIM clients)
- Keycloak remains authoritative (no duplicate identity stores)
- Automatic OpenFGA synchronization
- Audit trail (all changes via Keycloak Admin API)
- Deprovisioning support (disable users)
Negative Consequences
- Custom implementation (not standard Keycloak feature)
- Maintenance burden (SCIM spec changes)
- Keycloak Admin API dependency (performance)
- No built-in bulk operations (must implement)
Mitigation Strategies
- Use FastAPI OpenAPI for auto-documentation
- Comprehensive test suite with SCIM client simulation
- Asynchronous provisioning (queue bulk operations)
- Monitor Keycloak Admin API latency
Alternatives Considered
- Keycloak SCIM Extension: Rejected - community extensions unmaintained
- External SCIM Bridge Service: Rejected - additional microservice overhead
- Direct Keycloak Admin API: Rejected - not SCIM standard, client compatibility
- Manual Provisioning: Rejected - doesn’t scale for large orgs
Implementation
SCIM Endpoints (src/mcp_server_langgraph/api/scim.py):
src/mcp_server_langgraph/scim/schema.py):
References
- SCIM API:
src/mcp_server_langgraph/api/scim.py(to be created) - Schema:
src/mcp_server_langgraph/scim/schema.py(to be created) - Provisioning:
src/mcp_server_langgraph/scim/provisioning.py(to be created) - Related ADRs: ADR-0031
- External: RFC 7643 (SCIM Core Schema), RFC 7644 (SCIM Protocol)