Skip to main content

38. SCIM 2.0 Implementation Approach

Date: 2025-01-28

Status

Accepted

Category

Authentication & Authorization

Context

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)
Keycloak gap: No built-in SCIM 2.0 server endpoints.

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

  1. SCIM 2.0 Compliance: Implement RFC 7643/7644 endpoints
  2. Keycloak Bridge: All operations proxy to Keycloak Admin API
  3. Automatic Sync: User provisioning triggers OpenFGA role sync
  4. JWT Authentication: SCIM endpoints require JWT tokens (service principals)
  5. Idempotent Operations: Multiple creates/updates safe
  6. 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
Groups:
  • 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:
Enterprise Extension:

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

  1. Keycloak SCIM Extension: Rejected - community extensions unmaintained
  2. External SCIM Bridge Service: Rejected - additional microservice overhead
  3. Direct Keycloak Admin API: Rejected - not SCIM standard, client compatibility
  4. Manual Provisioning: Rejected - doesn’t scale for large orgs

Implementation

SCIM Endpoints (src/mcp_server_langgraph/api/scim.py):
SCIM Schema Validation (src/mcp_server_langgraph/scim/schema.py):

References