SCIM-2.0-Referenz
Technische Referenz für Identity-Management-Teams, die einen IdP (Microsoft Entra ID, SailPoint IdentityIQ, …) mit mTime verbinden: welche SCIM-2.0-Attribute und -Operationen mTime unterstützt und was jede davon bewirkt.
Überblick
| Basis-URL | https://<Ihr mTime-Host>/api/scim/v2 |
| Standards | RFC 7643 (Schema), RFC 7644 (Protokoll) |
| Authentifizierung | Bearer-Token: ein API-Schlüssel des Dienstbenutzers für die Bereitstellung des Arbeitsbereichs (siehe SCIM mit Microsoft Entra ID einrichten) |
| Medientyp | application/scim+json |
| Ressourcen | /Users, /Groups |
| Fehler | SCIM-Fehlerantworten (RFC 7644 §3.12) |
Was SCIM verwaltet und was nicht
mTime trennt den Benutzer (Anmeldung, Rollen, Zugriff) von der bzw. dem Mitarbeitenden und deren Anstellungen:
Benutzer → Mitarbeitende → n Anstellungen
SCIM verwaltet den Benutzer: wer sich anmelden darf, unter welchem Namen und mit welchen Rollen. Mitarbeitende und Anstellungen – Organisationseinheit, Führungskraft, Anstellungsbedingungen, Sollarbeitszeit, Beginn- und Enddatum – sind datierte Daten, mit denen mTime rechnet, und sie kommen aus Ihrer HR-Integration, nicht aus SCIM. Ein SCIM-Benutzer wird über die externalId mit seinem Mitarbeitendendatensatz verknüpft (siehe Wie Benutzer bereitgestellt werden).
Deshalb unterstützt mTime die Enterprise User Extension nicht: department, manager und employeeNumber sind Einzelwerte ohne Gültigkeitsdatum, während eine Person in mTime mehrere datierte Anstellungen haben kann.
Benutzer
Attribute
Schema urn:ietf:params:scim:schemas:core:2.0:User.
| Attribut | Lesen | Anlegen | Aktualisieren | Hinweise |
|---|---|---|---|---|
id | ✅ | — | — | Von mTime vergeben, unveränderlich |
externalId | ✅ | ✅ | ✅ | Stabiler Schlüssel (z. B. Personalnummer), eindeutig pro Arbeitsbereich; ein Duplikat liefert 409 uniqueness. Kann zur Zuordnung mit einem Attribut der Mitarbeitenden verknüpft werden |
userName | ✅ | ✅ | ⚠️ | Die E-Mail-Adresse des Benutzers. Nur änderbar, solange der Benutzer seine Einladung noch nicht aktiviert hat |
emails | ✅ | ✅ | ⚠️ | Der primäre (oder erste) Wert wird verwendet; gleiche Regel wie bei userName. Wird als einzelne primäre E-Mail-Adresse zurückgegeben |
name.givenName, name.familyName | ❌ | ✅ | ⚠️ | Werden zum vollständigen Namen zusammengesetzt – nur wenn beide zusammen gesendet werden (in einem name-Objekt oder beide Pfade im selben PATCH). mTime speichert einen einzigen vollständigen Namen und teilt ihn nie auf, daher wird ein PATCH mit nur einem davon ignoriert. Beim Anlegen und bei PUT wird ein einzelner Vor- oder Nachname nur verwendet, wenn es kein name.formatted und kein displayName gibt. Wird beim Lesen nicht zurückgegeben: Der Name kommt als name.formatted zurück |
name.formatted | ✅ | ✅ | ⚠️ | Vollständiger Name; hat Vorrang vor Vor- und Nachname. Eine Aktualisierung hat bei einem mit einem Mitarbeitendendatensatz verknüpften Benutzer keine sichtbare Wirkung, es sei denn, der IdP bestimmt die Namen der Mitarbeitenden – siehe Welchen Namen SCIM setzt |
displayName | ✅ | ✅ | ⚠️ | Vollständiger Name. Gleiche Aktualisierungsregel wie bei name.formatted |
active | ✅ | — | ✅ | false sperrt den Benutzer; true schaltet ihn wieder frei |
meta.resourceType, meta.location | ✅ | — | — |
Alle anderen Attribute von Core User (nickName, title, phoneNumbers, addresses, password, …) und die Enterprise User Extension (urn:ietf:params:scim:schemas:extension:enterprise:2.0:User) werden nicht unterstützt: Sie werden beim Anlegen und Aktualisieren ignoriert und nie zurückgegeben.
Welchen Namen SCIM setzt
mTime zeigt für eine Person einen einzigen Namen: den Namen des Mitarbeitendendatensatzes, wenn der Benutzer damit verknüpft ist, andernfalls den Namen des Benutzers.
- Ein mit einem Mitarbeitendendatensatz verknüpfter Benutzer zeigt dessen Namen, den Ihre HR-Integration pflegt. Standardmäßig aktualisiert SCIM keinen bestehenden Mitarbeitendendatensatz, ein über SCIM gesendeter Name hat für diesen Benutzer also keine sichtbare Wirkung. Ist Namen des Identitätsanbieters für Mitarbeitende verwenden
aktiviert, schreibt jedes Anlegen,
PUToderPATCHmit einem Namen diesen auch in den verknüpften Mitarbeitendendatensatz – siehe Den Namen aus dem Identitätsanbieter für Mitarbeitende verwenden. - Ein Benutzer ohne Mitarbeitendendatensatz (etwa ein Entwurf) zeigt seinen eigenen Namen. SCIM setzt ihn beim Anlegen und kann ihn ändern, bis die Person ihre Einladung aktiviert; danach folgt er dem Namen in ihrem eigenen mTime-Konto. Legt eine Rolle später ihren Mitarbeitendendatensatz an, beginnt dieser mit diesem Namen.
Um eine Person umzubenennen, die Mitarbeitende bzw. Mitarbeitender ist, ändern Sie den Namen in Ihrem HR-System – oder, bei aktivierter Einstellung, in Ihrem IdP.
Operationen
| Operation | Unterstützt | Verhalten |
|---|---|---|
POST /Users | ✅ | Legt den Benutzer als eingeladen an und sendet die Einladungs-E-Mail. Eine E-Mail-Adresse ist erforderlich (emails oder userName, wenn es eine Adresse ist). Verknüpft mit einem bestehenden Mitarbeitendendatensatz, wenn einer passt; andernfalls wird ein rollenloser Entwurf ohne Mitarbeitendendatensatz und ohne Einladung angelegt. 409, wenn die externalId oder der Mitarbeitendendatensatz bereits vergeben ist |
GET /Users/{id} | ✅ | |
GET /Users?filter=… | ⚠️ | Nur attribute eq "value", auf userName oder externalId. Andere Attribute oder Operatoren liefern 400. Kombinierbar mit Seitenweiser Abfrage |
GET /Users (ohne Filter) | ✅ | Alle Benutzer, seitenweise – siehe Seitenweise Abfrage |
PUT /Users/{id} | ✅ | Wendet die oben genannten unterstützten Attribute an |
PATCH /Users/{id} | ⚠️ | add und replace auf active, userName, emails, displayName, name (Objekt), name.givenName, name.familyName, name.formatted, externalId oder ohne Pfad (Teilressource). Ein Pfad darf das Schemapräfix tragen (urn:ietf:params:scim:schemas:core:2.0:User:name.givenName). remove und andere Pfade werden ignoriert |
DELETE /Users/{id} | ✅ | Löscht das Benutzerkonto (weiche Löschung) und beendet alle Sitzungen. Der Mitarbeitendendatensatz und sein Verlauf bleiben erhalten. Liefert 204 |
Benutzer mit der Rolle owner können über SCIM weder geändert noch gelöscht werden (403).
Deaktivieren oder löschen?
PATCH active=false | DELETE | |
|---|---|---|
| Kann sich anmelden | Nein – Sitzungen enden sofort | Nein – Sitzungen enden sofort |
| Benutzerkonto | Bleibt erhalten, Status gesperrt | Gelöscht (weiche Löschung) |
| Mitarbeitendendatensatz, Zeiteinträge, Genehmigungen | Bleiben erhalten | Bleiben erhalten |
| Rückkehr | PATCH active=true stellt denselben Benutzer wieder her | Ein neues POST legt einen neuen Benutzer an, verknüpft mit demselben Mitarbeitendendatensatz |
Gruppen
Gruppen werden Rollen in mTime zugeordnet: Der IdP bestimmt über Existenz und Mitgliedschaft einer Gruppe, die Admins in mTime über die Berechtigungen der Rolle. Siehe Wie Gruppen zu Rollen werden.
Attribute
Schema urn:ietf:params:scim:schemas:core:2.0:Group.
| Attribut | Lesen | Anlegen | Aktualisieren | Hinweise |
|---|---|---|---|---|
id | ✅ | — | — | Von mTime vergeben |
externalId | ✅ | ✅ | ✅ | |
displayName | ✅ | ✅ | ✅ | Verknüpft mit der gleichnamigen Rolle oder legt eine leere benutzerdefinierte Rolle an. Eine Umbenennung benennt die Rolle um |
members (value, display) | ✅ | ✅ | ✅ | value ist die SCIM-id des Benutzers |
Operationen
| Operation | Unterstützt | Verhalten |
|---|---|---|
POST /Groups | ✅ | Verknüpft mit der Rolle oder legt sie an |
GET /Groups/{id} | ✅ | |
GET /Groups?filter=… | ⚠️ | Nur attribute eq "value", auf displayName oder externalId |
GET /Groups (ohne Filter) | ✅ | Alle vom IdP verwalteten Rollen, seitenweise – siehe Seitenweise Abfrage |
PUT /Groups/{id} | ✅ | Ersetzt Name und Mitglieder |
PATCH /Groups/{id} | ✅ | add, replace und remove auf members (einschließlich members[value eq "…"]) und displayName |
DELETE /Groups/{id} | ✅ | Entfernt die Rolle bei ihren Mitgliedern. Die Rolle selbst wird nur gelöscht, wenn sie nie von Admins konfiguriert wurde |
Seitenweise Abfrage
GET /Users und GET /Groups unterstützen eine indexbasierte seitenweise Abfrage (RFC 7644 §3.4.2.4), mit oder ohne Filter.
| Parameter | Standard | Hinweise |
|---|---|---|
startIndex | 1 | 1-basierte Position des ersten Ergebnisses. Werte unter 1 zählen als 1 |
count | 200 | Ergebnisse pro Seite, höchstens 200. count=0 liefert nur totalResults |
Die Antwort enthält totalResults (alle Treffer), startIndex und itemsPerPage (die Ergebnisse auf dieser Seite). Fordern Sie die nächste Seite mit startIndex + itemsPerPage an, bis Sie totalResults Ergebnisse haben. Die Ergebnisse kommen in einer festen Reihenfolge, sodass Seiten keine Ergebnisse überspringen oder wiederholen, es sei denn, zwischendurch werden Benutzer oder Gruppen hinzugefügt oder gelöscht.
Discovery-Endpunkte
Alle drei erfordern dasselbe Bearer-Token wie die übrigen SCIM-Endpunkte.
| Endpunkt | Inhalt |
|---|---|
GET /ServiceProviderConfig | Fähigkeiten, siehe unten |
GET /Schemas | Core-Schemas User und Group, beschränkt auf die oben genannten Attribute |
GET /ResourceTypes | User (/Users) und Group (/Groups), ohne Schemaerweiterungen |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig"],
"documentationUri": "https://help.mtime.app",
"patch": { "supported": true },
"bulk": { "supported": false, "maxOperations": 0, "maxPayloadSize": 0 },
"filter": { "supported": true, "maxResults": 200 },
"changePassword": { "supported": false },
"sort": { "supported": false },
"etag": { "supported": false },
"authenticationSchemes": [
{
"type": "oauthbearertoken",
"name": "OAuth Bearer Token",
"description": "Bearer token issued for the workspace's provisioning service user",
"primary": true
}
]
}Fehlerbehebung
| Problem | Lösung |
|---|---|
400 Unsupported filter | Verwenden Sie eq auf userName oder externalId (Benutzer) bzw. displayName oder externalId (Gruppen) |
409 uniqueness beim Anlegen | Ein anderer Benutzer hat bereits diese externalId, oder der Mitarbeitendendatensatz hat bereits einen Benutzer. Suchen Sie den Benutzer mit filter=externalId eq "…" und aktualisieren Sie ihn stattdessen |
| Eine Änderung des Vor- oder Nachnamens erscheint nicht | mTime speichert einen einzigen vollständigen Namen und teilt ihn nie auf, kann also nicht nur eine Hälfte ändern. Senden Sie givenName und familyName zusammen im selben PATCH, oder senden Sie name.formatted oder displayName |
| Eine Namensänderung aus dem IdP erscheint nicht | Erwartet bei einem mit einem Mitarbeitendendatensatz verknüpften Benutzer, solange Namen des Identitätsanbieters für Mitarbeitende verwenden deaktiviert ist: Angezeigt wird der Name des Mitarbeitendendatensatzes, der aus Ihrer HR-Integration kommt. Aktivieren Sie die Einstellung, wenn der IdP die Namen der Mitarbeitenden bestimmen soll – siehe Welchen Namen SCIM setzt |
| Eine Änderung der E-Mail-Adresse erscheint nicht | Der Benutzer hat sein Konto bereits aktiviert; seine Anmelde-E-Mail-Adresse wird nicht mehr über die Bereitstellung verwaltet |
403 bei einem Benutzer | Der Benutzer ist Inhaber des Arbeitsbereichs, und solche Benutzer kann SCIM nicht verwalten |