SCIM 2.0 server for inbound user provisioning from external identity providers (Azure AD / Entra ID, Okta, Workday, ...).
This guide covers setting up the module and connecting an identity provider (IdP). For the architecture and development setup see ?#developer.
/scim/admin.A tenant is one IdP connection. Each tenant has its own endpoint URL, bearer token and attribute mapping.
/scim/admin, click Create tenant.entra) and a
name.In your IdP's provisioning / SCIM connector, enter:
| Setting | Value |
|---|---|
| SCIM endpoint | https://<your-humhub>/scim/v2/<tenant-id>/ |
| Authentication | Bearer token (the value shown at create time) |
The exact endpoint URL is also displayed on the tenant edit page. The IdP will
verify the connection against /ServiceProviderConfig and then start syncing.
Each tenant maps HumHub profile fields to SCIM attributes as a newline-separated list on the tenant edit page. The preset fills this in; adjust it to match your profile fields.
Each line is one of:
firstname, lastname, title, externalId map to their
standard SCIM paths;language maps to preferredLanguage, time_zone to timezone;urn:humhub:scim:2.0:User.field=>scimPath — maps a HumHub field to an explicit SCIM path, e.g. the
enterprise extension:
department=>urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department
Notes:
userName, the primary email, active (enabled/disabled) and password
have fixed handling and are always mapped — you do not list them.On the tenant edit page:
password sent by the IdP is stored as the user's HumHub
password (write-only, never returned). The IdP's value is stored as-is;
HumHub's local password-strength rules are not enforced.scim.requests category (method, path, status, body with
password redacted). Useful when debugging an IdP integration. Off by
default.When the IdP provisions groups, each SCIM group is mapped to a HumHub group and its membership is kept in sync. Members are referenced by their SCIM user id and restricted to users the same tenant provisioned — a tenant can never touch identities it does not own.
Group creation is strict: a 409 uniqueness is returned if a HumHub group with
the same name already exists, so an IdP never silently takes over a pre-existing
group (e.g. the admin or default group). SCIM-managed groups are labelled
SCIM Managed Group (<tenant name>): <externalId> in the HumHub group list.
Run from the HumHub protected/ directory:
# Create an enabled tenant and print its bearer token once
./yii scim/create-tenant <id> <name>
# List and hard-delete every user and group a tenant provisioned
# (prompts for confirmation) so the tenant can be removed
./yii scim/delete-users <tenant-id>
Some deviations are forced by HumHub's data model and are expected:
emails entries only round-trips the primary work address;
the others are dropped.preferredLanguage set — only languages installed in HumHub are
accepted. An unrecognised locale falls back to its base language
(it-IT → it) or is ignored, so a POST/PATCH stays non-destructive.Both surface as failures in the Microsoft SCIM Validator even on an otherwise-green run, which is expected.