Eine eigene Anwendung anbinden

Wenn Sie eine eigene Anwendung oder ein eigenes Werkzeug an die Documents Partner API anbinden wollen, brauchen Sie dafür eine Applikation in der Benutzerverwaltung Ihres Mandanten. Diese Anleitung führt Schritt für Schritt durch die Anlage.

Zu den Abbildungen. Sie stammen aus einer Testumgebung. Der Mandantenname und die Namen der handelnden Personen sind geschwärzt; an ihrer Stelle steht bei Ihnen der eigene Mandant. Die gezeigte Client-Kennung gehört zu einer Testapplikation und ist nur ein Beispiel für das Format.

⚠️ Das setzt die Volllizenz voraus. Nur sie schließt im Regelfall das Recht ein, eigene Applikationen zu registrieren. Mit einer partnergebundenen Lizenz ist der Zugang an das jeweilige Partnerprodukt geknüpft, und eine selbst angelegte Applikation würde mit 403 CLIENT_NOT_LICENSED abgewiesen. Der Unterschied steht in Lizenzen und Berechtigungen.

Maßgeblich ist Ihr Vertrag – er kann im Einzelfall abweichende Regelungen enthalten. Wenn Sie unsicher sind, ob dieser Weg für Ihre Kanzlei offensteht, klären Sie das vorher mit Ihrem Ansprechpartner bei STP.

Was Sie dabei erhalten – und was nicht

Gilt für Ausschließlich Ihren Mandanten und dessen Untermandanten
Anzeigename Frei wählbar
Client-Kennung Wird erzeugt, nicht selbst vergeben – Sie erhalten eine GUID
Anmeldeverfahren Für die Documents Partner API ist nur Authorization Code freigeschaltet
Berechtigungsbereiche Nur aus der für Ihren Mandanten freigegebenen Auswahl
Client-Geheimnis Pflicht – die Applikation ist immer vertraulich

Dass die Client-Kennung erzeugt wird, ist der Punkt, der am ehesten überrascht: Sie können sie nicht bestimmen. Die Anwendung muss die erzeugte GUID übernehmen.

STP-Administratoren sehen die von Ihnen angelegten Applikationen ebenfalls – hilfreich, wenn Sie beim Support nachfragen.

Sie sind Partner und wollen Ihr Produkt mehreren Kanzleien anbieten? Dann ist dieser Weg nicht der richtige – eine mandantenspezifische Applikation gilt nur für einen einzigen Mandanten. Ein Client, der bei allen lizenzierten Kanzleien funktioniert, wird zentral von STP registriert; wenden Sie sich dafür an den STP-Support.

Schritt eins: Zur Applikationsübersicht

Melden Sie sich als Administrator Ihres Mandanten an und öffnen Sie Identity Admin. In der linken Leiste finden Sie den Eintrag Applikationen.

Identity Admin mit der leeren Applikationsliste und der Schaltfläche neue Applikation

Die Liste ist zu Beginn leer („keine Applikationen“). Rechts oben legt „+ neue Applikation“ eine an.

Schritt zwei: Grunddaten und Verhalten

Formular einer neuen Applikation mit Anzeigename, Schalterliste, Laufzeiten und Gewährungsart

Tragen Sie zunächst den Anzeigenamen ein – er erscheint später auf der Zustimmungsseite, sollte für Ihre Anwender also verständlich sein. Im Beispiel oben ist das Mein Test Client.

Darunter stehen die Schalter. Diese müssen gesetzt sein:

Schalter Warum
aktiviert Sonst ist die Applikation angelegt, aber nicht benutzbar
bedarf der Zustimmung des Anwenders Der Anwender bestätigt einmalig, was die Anwendung darf
bedarf eines Proof Key für Code Exchange (PKCE) Pflicht für den Authorization-Code-Ablauf
Zugriffsmarken über den Browser zulassen Nötig, wenn die Anmeldung im Browser stattfindet
Benutzereigenschaften in ID-Marke aufnehmen Liefert die Angaben zum angemeldeten Benutzer mit
Benutzer Xid-Eigenschaft Der wichtigste Schalter überhaupt – siehe unten
Offline-Zugriff zulassen Stellt Aktualisierungsmarken aus, damit die Anwendung ohne stündliche Neuanmeldung weiterläuft

⚠️ Ohne „Benutzer Xid-Eigenschaft“ scheitert später jeder Aufruf. Die Sitzung im Dokumentenmanagement wird im Namen des anfragenden Benutzers geführt, und dessen Kennung kommt genau aus dieser Eigenschaft. Fehlt sie, läuft die Anmeldung fehlerfrei durch, und trotzdem antwortet jeder Fachaufruf mit 403 MISSING_USER_IDENTITY – ein Fehlerbild, das ohne diesen Hinweis kaum zu deuten ist.

Diese Schalter bleiben leer:

Schalter Warum nicht
Zugriff nur am internen Host zulassen Würde den Zugriff von außen unterbinden
Aktualisierungsmarken wiederverwenden Nur mit gutem Grund; die Oberfläche warnt zu Recht
Benutzereigenschaften mit Aktualisierungsmarken aktualisieren Für diesen Zweck nicht nötig
Referenzmarken verwenden Verlangt zusätzliche Prüfmöglichkeiten auf Seite der API

Die Felder „Aktualisierungsmarkenlänge in Bytes“ und „linker Bereich URI“ bleiben leer. Bei ersterem warnt die Oberfläche zu Recht – zu wenige Bytes führen zu Kollisionen.

Die Laufzeiten darunter können Sie unverändert lassen. Die Vorgabewerte:

Feld Vorgabe
Lebenszeit der Identitätsmarken 300 Sekunden
Lebenszeit der Zugriffsmarken 3600 Sekunden (eine Stunde)
Lebenszeit der Autorisierungskennungen 300 Sekunden
Lebenszeit der Gerätekennungen 300 Sekunden
Absolute Lebenszeit der Aktualisierungsmarken 2592000 Sekunden (30 Tage)

Schritt drei: Gewährungsart

Unter zulässige Gewährungsarten wählen Sie Authorization Code.

Für die Documents Partner API ist das die einzige freigeschaltete Wahl – und das ist kein Versehen: Die Anwendung handelt im Namen eines Benutzers, und nur dieser Ablauf bringt eine Benutzerkennung mit. Ein Ablauf ohne Benutzeranmeldung würde an derselben Stelle scheitern wie eine fehlende Xid-Eigenschaft.

Schritt vier: Berechtigungsbereiche

Erlaubte Bereiche, die Tabelle der vereinbarten Geheimnisse und der Schalter für das Client-Geheimnis

Unter erlaubte Bereiche wählen Sie aus, was die Anwendung anfordern darf. Für die Documents Partner API sind das:

Bereich in der Oberfläche Technischer Name Wofür
ID / Your user identifier openid Anmeldung
ID / User profile profile Benutzerprofil
ID / Your user email address email E-Mail-Adresse des Benutzers
UserManagement.Identity.Account / read my profile um.acc.profile.read Profil des angemeldeten Benutzers lesen
Documents Partner API: standalone reach dms.cloud.api.standalone Zwingend erforderlich – siehe unten
Documents Partner API: read documents (list, download) dms.cloud.api.documents.read Dokumente lesen
Documents Partner API: write documents (upload/import) dms.cloud.api.documents.write Dokumente schreiben
Documents Partner API: stage content via presigned upload URLs dms.cloud.api.uploads Dateien bereitstellen

Eine reine Auswertungsanwendung kommt ohne documents.write und uploads aus. Alles, was Dokumente ablegen soll, braucht beide.

Warum dms.cloud.api.standalone nicht weggelassen werden darf

Jeder Aufruf wird gegen zwei Arten von Bereichen geprüft: den fachlichen und den Lizenzbereich. Fehlt der Lizenzbereich, wird schon abgewiesen, bevor der fachliche überhaupt betrachtet wird – mit 403 LICENSE_MISSING.

Für eine selbst angelegte Applikation ist dms.cloud.api.standalone der einzige Lizenzbereich, der zur Auswahl steht – die partnergebundene Variante gehört zum jeweiligen Partnerprodukt.

Ohne diesen Bereich ist die Applikation also vollständig eingerichtet und trotzdem bei jedem Aufruf abgewiesen. Die Prüfreihenfolge im Einzelnen steht in Lizenzen und Berechtigungen.

Schritt fünf: Client-Geheimnis

Der Schalter „bedarf eines Client Geheimnisses“ ist für mandantenspezifische Applikationen Pflicht – er bleibt gesetzt. Legen Sie darüber unter „Vorher vereinbartes Geheimnisse“ mit Neu ein Geheimnis an.

Ihre Anwendung muss es also sicher aufbewahren können. Für eine reine Browseranwendung, die das nicht kann, ist dieser Weg nicht geeignet – dort gehört die Anmeldung auf einen Server Ihrer Seite, der das Geheimnis hält.

Das Geheimnis wird nur einmal im Klartext angezeigt. In der Tabelle sehen Sie danach nur noch den Hashwert in der Spalte Value; Value (unhashed) bleibt leer. Notieren Sie das Geheimnis sofort an einem sicheren Ort – es lässt sich nicht wieder sichtbar machen, nur löschen und neu anlegen.

Die zweite Tabelle, Zertifikat Geheimnisse, bleibt leer. Sie wird für die Documents Partner API nicht benötigt.

Schritt sechs: Adressen

Weiterleitungsadressen nach dem An- und Abmelden, CORS-Herkünfte und die Schaltfläche Speichern

Zuletzt die Adressen Ihrer Anwendung:

Feld Was hineingehört Pflicht
Weiterleitung-URIs nach dem Anmelden Die Adresse, an die nach erfolgreicher Anmeldung zurückgeleitet wird, z. B. http://localhost:5099/callback ja
Weiterleitung-URIs nach dem Abmelden Die Adresse nach dem Abmelden, z. B. http://localhost:5099/ empfohlen
erlaubte CORS-Herkünfte Nur nötig, wenn die Anwendung im Browser läuft und die Schnittstelle direkt aufruft, z. B. http://localhost:5099 optional

Die Adressen müssen exakt mit dem übereinstimmen, was Ihre Anwendung beim Anmelden angibt – einschließlich Schema, Port und abschließendem Schrägstrich.

Ein Server-Dienst ohne Browseroberfläche braucht keine CORS-Herkunft.

Mit Speichern ist die Applikation angelegt.

Änderungen wirken nicht sofort. Die Oberfläche weist selbst darauf hin: Es kann bis zu 15 Minuten dauern, bis eine Änderung greift. Wenn direkt nach dem Speichern noch etwas nicht funktioniert, lohnt sich zuerst Abwarten und ein erneuter Versuch.

Schritt sieben: Die Client-Kennung übernehmen

Die angelegte Applikation mit erzeugter Client-Kennung und den vergebenen Bereichen

In der Liste steht die Applikation nun mit ihrer erzeugten Client-Kennung – einer GUID wie 303be097-b510-4436-95ac-f804f8933439. Daneben stehen Inhaber (Ihr Mandant) und Schöpfer (wer sie angelegt hat). Darunter zeigt die Übersicht die vergebenen Bereiche, zum Beispiel:

"dms.cloud.api.documents.read" "dms.cloud.api.documents.write"
"dms.cloud.api.standalone" "dms.cloud.api.uploads"
"email" "openid" "profile" "um.acc.profile.read"

Diese GUID ist die client_id, die Ihre Anwendung beim Anmelden verwendet. Zusammen mit dem Mandantennamen haben Sie damit alles, was Erste Schritte für den Anmeldeablauf beschreibt.

Schritt acht: Die Anmeldung durchführen

Mit der Client-Kennung ist der Ablauf derselbe wie für jede andere Anwendung. Die Endpunkte stehen unter der Anmeldeadresse Ihres Mandanten:

https://<mandant>.stp-cloud.de/identity/.well-known/openid-configuration

Die Subdomain muss der Mandant sein, zu dem das handelnde Benutzerkonto gehört – bei authorize und bei token. Ein Aufruf gegen einen anderen Mandanten schlägt fehl, auch wenn Client-Kennung und Geheimnis stimmen.

Erstens: Den Benutzer zur Anmeldung schicken

GET https://<mandant>.stp-cloud.de/identity/connect/authorize
      ?client_id=303be097-b510-4436-95ac-f804f8933439
      &redirect_uri=http%3A%2F%2Flocalhost%3A5099%2Fcallback
      &response_type=code
      &scope=*
      &state=<eigener-Zufallswert>
      &code_challenge=<BASE64URL-SHA256-des-Verifiers>
      &code_challenge_method=S256

Nach der Anmeldung und der Zustimmung wird der Benutzer an die Rückleitungsadresse geschickt, die code und state als Abfrageparameter trägt.

scope=* ist der empfohlene Weg. STP-IAM beantwortet eine Wildcard – ebenso einen leeren scope – mit allen Bereichen, die die Applikation anfordern darf. Was tatsächlich im Token landet, ist ohnehin die Schnittmenge mit Lizenz und Rollen.

Der Grund, das einer festen Liste vorzuziehen: Ein Anmeldedienst lässt die gesamte Anfrage mit invalid_scope scheitern, wenn auch nur ein einziger genannter Bereich unbekannt ist. Eine fest verdrahtete Liste ist damit eine Umbenennung davon entfernt, die Anmeldung komplett lahmzulegen. Eine ausdrückliche Liste ist nur dann sinnvoll, wenn eine Anwendung bewusst weniger anfordern soll, als sie dürfte.

Zweitens: Den Code gegen ein Token tauschen

POST an den Token-Endpunkt, Inhalt als application/x-www-form-urlencoded:

Feld Wert
grant_type authorization_code
code Der code aus der Rückleitung
client_id Die erzeugte GUID der Applikation
redirect_uri Exakt dieselbe wie in der Anfrage zuvor
code_verifier Das Geheimnis, aus dem die code_challenge gebildet wurde
client_secret Das in Schritt fünf angelegte Geheimnis
curl -sS -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=$CODE" \
  -d "client_id=303be097-b510-4436-95ac-f804f8933439" \
  -d "redirect_uri=http://localhost:5099/callback" \
  -d "code_verifier=$CODE_VERIFIER" \
  -d "client_secret=$CLIENT_SECRET" \
  "https://<mandant>.stp-cloud.de/identity/connect/token"

Zwei Punkte, an denen dieser Aufruf regelmäßig scheitert:

  • code_verifier ist Pflicht, sobald PKCE gesetzt ist – und das ist es hier. Der Anmeldedienst prüft ihn gegen die zuvor gesendete code_challenge. Ohne ihn wird der Tausch abgelehnt, obwohl code und Geheimnis stimmen.
  • client_secret gehört hier immer dazu. Mandantenspezifische Applikationen sind stets vertraulich, also erwartet der Anmeldedienst das Geheimnis. (Nur bei einem öffentlichen Client – den es auf diesem Weg nicht gibt – entfiele das Feld ersatzlos; leer mitschicken wäre auch dann falsch.)

Der weitere Ablauf – Erneuerung über grant_type=refresh_token, Inhalt des Tokens – steht in Erste Schritte.

Schritt neun: Der erste Aufruf

Die Schnittstelle liegt unter demselben Mandanten:

https://<mandant>.stp-cloud.de/documents/dms-cloud-api/api

Die Versionsangabe gehört nicht in die Basisadresse, sondern an den Anfang jedes Pfades. Der erste Aufruf sollte eine Suche sein – sie beweist die ganze Kette vom Token über die Lizenz bis in das Dokumentenmanagement:

curl -sS \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Correlation-Id: mein-erster-aufruf" \
  "https://<mandant>.stp-cloud.de/documents/dms-cloud-api/api/v1/dms/documents/container?pageSize=5"

Kommt eine Liste zurück – und sei sie leer –, funktioniert die Integration. Wie es von dort weitergeht, zeigt Schnellstart.

Wenn stattdessen ein Fehler kommt

Antwort Bedeutung Was zu tun ist
401 (ohne Fehlerumschlag) Kein, abgelaufenes oder ungültiges Token Token erneut holen
403 LICENSE_MISSING Der Mandant hat keine Lizenz, oder das Token trägt keinen Lizenzbereich Lizenzierung prüfen lassen
403 CLIENT_NOT_LICENSED Der Lizenzbereich im Token gehört zu einer anderen Anwendung Prüfen, ob dms.cloud.api.standalone in den erlaubten Bereichen steht
403 INSUFFICIENT_SCOPE Lizenz vorhanden, aber es fehlt der Capability-Scope Rolle des Kontos prüfen – und ob die Applikation den Scope anfordern darf
403 MISSING_USER_IDENTITY Das Token trägt keine Benutzerkennung „Benutzer Xid-Eigenschaft“ in der Applikation setzen (Schritt zwei)
403 ON_PREM_PERMISSION_DENIED Das Dokumentenmanagement hat abgelehnt Rechte des Kontos im Dokumentenmanagement prüfen
502 CONNECTOR_OFFLINE Der Connector der Kanzlei ist nicht erreichbar Zustand des Connectors prüfen lassen

Die vollständige Liste steht in Fehlercodes.

Was Sie danach noch brauchen

Die Applikation allein genügt nicht – sie legt nur die Obergrenze fest. Es fehlen noch:

  1. Die Rolle für die handelnden Benutzerkonten. Ohne sie fehlt im Token der fachliche Bereich, und der Aufruf endet mit 403 INSUFFICIENT_SCOPE – siehe Rollen und Gruppen.
  2. Ein installierter und angemeldeter Connector, sonst antwortet jeder Aufruf mit 502 CONNECTOR_OFFLINE.

Was tatsächlich im Token landet, ist die Schnittmenge aus dem, was die Applikation anfordern darf, was die Lizenz hergibt und was die Rollen des Benutzers hergeben. Ein Bereich, der in der Applikation fehlt, kommt nie an – ganz gleich wie gut lizenziert und berechtigt der Benutzer ist.

Weiterführend