Persönliche API-Schlüssel für Integrationen
Diese Seite richtet sich an Integratoren, die einen eigenen Server (ein ERP, ein PIM, einen CI-Job) mit der REST-API von Exponential verbinden. Die übliche Antwort für Aufrufe von Maschine zu Maschine ist ein persönlicher API-Schlüssel eines Dienstkontos: ein Schlüssel, der einem eigens für die Integration angelegten Benutzer gehört und auf die Scopes begrenzt ist, die die Integration braucht. Die vollständige Anleitung für alle Leser ist Persönliche API-Schlüssel.
Inhalt
- Die Einrichtung in sechs Schritten
- Scopes und die Routen, die sie öffnen
- Rotieren ohne Ausfall
- Grenzen und Audit
- Eigene REST-Routen für Schlüssel öffnen
- Fehlersuche
Die Einrichtung in sechs Schritten
Legen Sie das Dienstkonto an, zum Beispiel
svc-erp-import, in einer eigenen Benutzergruppe (Dienstkonten und Rollen).Legen Sie dafür eine Rolle an mit genau den Inhaltsrechten, die die Integration braucht:
content/readauf den Teilbäumen, die sie liest,content/create, nach Klasse und Teilbaum begrenzt, für das, was sie veröffentlicht,content/removenur, wenn sie entfernt.Fügen Sie die Richtlinie
apikey/createzu dieser Rolle hinzu, mit der Einschränkung Scope auf die Scopes, die der Schlüssel erhalten darf.Melden Sie sich als Dienstkonto an (einmal, in einem privaten Browserfenster), öffnen Sie Mein Konto > API-Zugang (
/apikey/list), benennen Sie den Schlüssel nach Programm und Umgebung ("ERP-Import, Produktion"), haken Sie die Scopes an und wählen Sie eine Laufzeit (standardmäßig 7, 30, 90 oder 365 Tage).Kopieren Sie den Schlüssel von der Seite, die ihn einmal zeigt (
expk_und 53 weitere Zeichen), in den Geheimnisspeicher des aufrufenden Systems. Er wird nie wieder angezeigt; gespeichert wird nur ein HMAC-SHA-256-Hash.Testen Sie ihn:
curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer $EXP_API_KEY" \ https://example.com/api/ezp/v2/content/node/2200bedeutet, dass der Schlüssel funktioniert und Knoten 2 lesen darf;403bedeutet, dass das Konto diesen Knoten nicht lesen darf.
Scopes und die Routen, die sie öffnen
| Scope | Steht für die Richtlinie | Öffnet |
|---|---|---|
read | content/read | Jede GET- und HEAD-Route (DefaultReadScope=read) |
publish | content/create | ezp7xRestContentController_CreateContentNode |
edit | content/edit | ezp7xRestContentController_UpdateContentNode |
remove | content/remove | ezp7xRestContentController_DeleteContentNode |
Bei jeder Anfrage laufen drei Prüfungen: Der Schlüssel hat den Scope, der Besitzer hält noch die Richtlinie des
Scopes, und bei schreibenden Routen, die in RouteGuards[] stehen, die Rechte des Besitzers am beschriebenen Knoten.
Die Anfrage läuft dann als der Besitzer, sodass auch die eigenen Rechteprüfungen des Controllers greifen. Eine
schreibende Route einer Erweiterung, die nicht in RouteScopes[] steht, ist für Schlüssel geschlossen.
Rotieren ohne Ausfall
- Erstellen Sie einen zweiten Schlüssel mit denselben Scopes, benannt mit dem Datum ("ERP-Import, Produktion, 2027-01").
- Hinterlegen Sie ihn im aufrufenden System und führen Sie einen Aufruf aus.
- Prüfen Sie, dass sich Zuletzt benutzt des neuen Schlüssels auf
/apikey/listfüllt. - Widerrufen Sie den alten Schlüssel. Jede Anfrage damit wird ab der nächsten abgelehnt, auf jedem Server.
Planen Sie die Rotation, bevor der Schlüssel abläuft: Tragen Sie das Enddatum beim Erstellen des Schlüssels in den
Betriebskalender ein. Administratoren sehen jeden Schlüssel, mit Filtern für "läuft innerhalb von sieben Tagen ab" und
"aktiv, aber nie benutzt", unter Setup > oAuth-Verwaltung > API-Schlüssel (/oauthadmin/keys).
Grenzen und Audit
Einstellung (rest.ini [ApiKeySettings]) | Standard | Bedeutung für eine Integration |
|---|---|---|
RateLimitPerMinute | 120 | Anfragen je Schlüssel und Minute, gezählt in APCu je PHP-FPM-Pool oder Velocity-Server; darüber: 429 mit Retry-After |
MaxKeysPerUser | 10 | Gültige Schlüssel je Benutzer |
MaxExpiryDays | 365 | Die längste Laufzeit; 0 erlaubt Schlüssel ohne Enddatum |
LastUsedInterval | 60 | Sekunden zwischen zwei Schreibvorgängen der letzten Verwendung eines Schlüssels |
Ein Massenjob, der mehr als 120 Anfragen pro Minute braucht, ist ein Zeichen, dass er als Cronjob-Teil auf den Server gehört (Eine Integrationsschnittstelle wählen), nicht, dass die Grenze fallen sollte.
Der Kanal access des Audits zeichnet access.apikey.create, access.apikey.revoke, das erste access.apikey.use
und jede Ablehnung als access.apikey.use.failed mit ihrem Grund auf (unknown, revoked, expired, scope,
policy, permission, rate_limited ...).
Eigene REST-Routen für Schlüssel öffnen
Wenn Ihre Erweiterung einen REST-Controller hinzufügt, nennen Sie in settings/rest.ini.append.php Ihrer Erweiterung
den Scope, den jede schreibende Route braucht:
[ApiKeySettings]
RouteScopes[myExtRestController_doImport]=publishGET- und HEAD-Routen, die nicht aufgeführt sind, brauchen DefaultReadScope.
Fehlersuche
| Symptom | Ursache |
|---|---|
| Kein Link API-Zugang im Profil des Dienstkontos | Der Rolle fehlt apikey/create |
401 invalid_token mit einem frischen Schlüssel | Der Schlüssel wurde beim Kopieren abgeschnitten (er hat 58 Zeichen), in der Adresse gesendet oder ohne Bearer gesendet |
401 nur auf einem Server | Ein Proxy verwirft den Header Authorization; reichen Sie ihn durch (CGIPassAuth On) |
403 insufficient_scope | Fehlender Scope, verlorene Richtlinie oder ein Schreibvorgang außerhalb der Rechte des Besitzers; das Audit-Ereignis nennt den Grund |
429 | Über der Ratenbegrenzung; beachten Sie Retry-After |
Verwandte Seiten
- Persönliche API-Schlüssel, die vollständige Anleitung
- Die REST-API für Integratoren
- Dienstkonten, Rollen und Richtlinien
- Zugangsdaten für eine Integration wählen
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.