Authentifizierung#
Die API nutzt OAuth2 client_credentials — den Grant für Maschine-zu-Maschine. Es gibt keinen Benutzer, keine Browser-Weiterleitung und keinen Zustimmungsbildschirm.
Zwei Hosts sind beteiligt, und dein Client spricht mit beiden:
Rolle |
Host |
Zweck |
|---|---|---|
Identitätsanbieter |
|
stellt Token aus |
Shard |
aus dem Claim |
liefert die Daten |
Deine Zugangsdaten übermitteln#
Beide Standardverfahren zur Client-Authentifizierung aus OAuth2 (RFC 6749 §2.3.1) werden akzeptiert. Nimm das, was deine HTTP- oder OAuth-Bibliothek dir leicht macht — hier sind sie gleichwertig.
client_secret_post — Zugangsdaten im Formular-Body:
POST /identity/o/api/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
client_id=cust-acme-integration
client_secret=<secret>
scope=shifts.read
client_secret_basic — Zugangsdaten in einem HTTP-Basic-Header, nur client_id im Body:
POST /identity/o/api/token HTTP/1.1
Authorization: Basic base64("cust-acme-integration:<secret>")
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
client_id=cust-acme-integration
scope=shifts.read
client_secret_basic ist der Standard der Spezifikation und das, was die meisten fertigen OAuth-Bibliotheken senden; client_secret_post lässt sich von Hand einfacher bauen, ganz ohne Base64-Schritt.
Ablauf und Erneuerung#
Token laufen standardmässig nach 1800 Sekunden ab. Der Grant client_credentials hat kein Refresh-Token — so vorgesehen (RFC 6749 §4.4.3), und es kostet dich nichts: Dein Client hält client_id und client_secret ohnehin, das «Erneuern» ist also nur ein neuer Token-Aufruf mit denselben Daten. Ein Refresh-Token wäre bloss ein weiteres Geheimnis zum Aufbewahren.
Zwei Regeln machen einen Client robust:
Speichere das Token zwischen und verwende es bis kurz vor
expires_in. Wer rund 30 Sekunden früher erneuert, vermeidet Rennen am Ablaufrand.Bei einem
401von der Daten-API — ein Token kann vorzeitig ungültig werden, etwa durch eine Schlüsselrotation — verwirf das zwischengespeicherte Token, hol ein neues und wiederhol die Anfrage einmal.
Routing: der Claim api_base#
Das Token ist ein JWT. Über die üblichen OAuth-Felder hinaus enthält es:
Claim |
Beispiel |
Bedeutung |
|---|---|---|
|
|
Basis-URL des aufzurufenden Hosts |
|
|
API des Ziel-Shards |
|
|
Das Unternehmen, an das du gebunden bist |
|
|
Anzeigename |
|
|
Nicht aktive Unternehmen erhalten kein Token |
Lies api_base und ruf diesen Host auf. Halte einen konfigurierten Rückfallwert bereit, falls der Claim fehlt, aber bevorzug den Claim: Er ist es, der uns erlaubt, einen Shard hinzuzufügen oder zu verschieben, ohne dass sich bei dir etwas ändert.
aud und die Unternehmensbindung werden serverseitig aus dem Mandanten gesetzt, zu dem deine Zugangsdaten gehören. Sie sind nicht anforderbar — ein Client kann schlicht kein anderes Unternehmen und keinen anderen Shard ansprechen.
Was ein Maschinentoken nicht ist#
Maschinentoken haben kein sub und keine Benutzer- oder Mitgliedschafts-Claims. Jeder Aufruf handelt als die Anbindung selbst, begrenzt durch ihre Scopes. Zwei Folgen:
Die API kann nicht ableiten, wer für einen Schreibvorgang verantwortlich ist; deshalb verlangen manche Schreibvorgänge, dass du eine Person ausdrücklich nennst — siehe Den Menschen hinter einem Schreibvorgang benennen.
Ein Benutzertoken aus unseren eigenen Apps (Web oder Mobile) wird auf dieser Schnittstelle abgelehnt. Sie ist ausschliesslich für Maschinen.
Fehler in dieser Phase#
Symptom |
Ursache |
|---|---|
|
falsche |
|
du hast einen Scope angefordert, der deinem Client nicht erteilt wurde |
|
abgelaufenes, ungültiges oder vorzeitig entwertetes Token — erneuern und einmal wiederholen |
|
gültiges Token, fehlende Berechtigung — siehe Scopes |