Inhalt
Erste Schritte mit der formcycle REST-API
Diese Anleitung zeigt, wie die Authentifizierung an der formcycle REST-API mit Benutzername und Passwort (formcycle-Systemanmeldung oder LDAP) erfolgt und wie die API über die API-Referenz oder curl genutzt wird.
Für die Nutzung der REST-API ist Folgendes sicherzustellen:
In den Systemeinstellungen im Menüpunkt Allgemein ist unter dem Punkt REST-API die Option für das Aktivieren der REST-API angehakt.
Überblick
| Was | Wert |
|---|---|
| Base URL | https://<server>/<context-path>/api/rest/public/ |
| API-Referenz | https://<server>/<context-path>/api/rest/public/doc/openapi.html |
| Format der Antworten | JSON |
| Format der Anfragen an die Security-API | application/x-www-form-urlencoded |
API-Referenz aufrufen
Die API-Referenz ist an zwei Stellen verfügbar:
- Auf dem eigenen formcycle-Server unter den unten aufgeführten Adressen. Diese Referenz passt immer genau zur installierten Version.
- Unter docs.formcycle.eu: Dort die eingesetzte formcycle-Version auswählen und den Ordner rest-api öffnen.
Unter docs.formcycle.eu gibt es die REST-API-Dokumentation erst ab formcycle Version 8.5.6Die API ist in mehrere Bereiche aufgeteilt. In der API-Referenz kann über die API-Auswahl zwischen ihnen gewechselt werden:
|
| Bereich | Inhalt | API-Referenz |
|---|---|---|
| Generic | Einstiegspunkt mit Links zu allen Bereichen, Erreichbarkeitsprüfung (/ping) | https://<server>/<context-path>/api/rest/public/doc/openapi.html |
| Security | Authentifizierung und Token-Verwaltung | https://<server>/<context-path>/api/rest/public/security/doc/openapi.html |
| Forms | Formulare | https://<server>/<context-path>/api/rest/public/forms/doc/openapi.html |
| Form records | Vorgänge | https://<server>/<context-path>/api/rest/public/form-records/doc/openapi.html |
| Users | Profil des angemeldeten Benutzers | https://<server>/<context-path>/api/rest/public/users/doc/openapi.html |
| User portals | Benutzerportale | https://<server>/<context-path>/api/rest/public/user-portals/doc/openapi.html |
Unterstützte Anmeldearten
Für die Anmeldung an der REST-API werden derzeit folgende Login-Dienste unterstützt:
- formcycle-Systemanmeldung
- LDAP
Externe Login-Dienste (z. B. OAuth 2.0, OpenID Connect oder SAML-basierte Dienste wie BundID) können derzeit nicht für die Anmeldung von eigenen Anwendungen an der REST-API verwendet werden.
Schnellstart: In zwei Schritten an die Daten
Das folgende Beispiel zeigt den kompletten Weg von der Anmeldung bis zum Abruf von Daten. Nach diesem Prinzip funktionieren alle geschützten Endpunkte der API. Details zu den einzelnen Schritten (Token erneuern, MFA, Fehlerbehandlung usw.) folgen weiter unten.
Schritt 1: Token anfordern
Mit Benutzername und Passwort wird ein Access Token angefordert. form steht hier für die formcycle-Systemanmeldung (zu LDAP siehe Authentifizierung).
curl -X POST "https://<server>/<context-path>/api/rest/public/security/auth/form/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "username=<benutzername>" \ --data-urlencode "password=<passwort>"
Antwort (gekürzt):
{
"status_type": "SUCCESS",
"token_response": {
"access_token": "eyJhbGciOi...",
"refresh_token": "eyJhbGciOi...",
"expires_in": 300
}
}Benötigt wird der Wert von token_response.access_token. Ist für den Benutzer eine Multi-Faktor-Authentifizierung aktiv, enthält status_type stattdessen den Wert MFA_REQUIRED (siehe Anmeldung mit Multi-Faktor-Authentifizierung).
Schritt 2: Token verwenden
Das Access Token wird bei jedem weiteren Request an geschützte Endpunkte im Authorization-Header mitgeschickt. Im Beispiel wird eine Liste der Vorgänge abgerufen, die der angemeldete Benutzer selbst eingereicht hat:
curl -X GET "https://<server>/<context-path>/api/rest/public/form-records" \ -H "Authorization: Bearer <access_token>" \ -H "Accept: application/json"
Nach genau diesem Muster (Token im Header mitschicken, Antwort im JSON-Format auswerten) funktionieren alle geschützten Endpunkte der API. Welche Endpunkte im Detail zur Verfügung stehen, zeigt die API-Referenz.
Authentifizierung (formcycle-Systemanmeldung / LDAP)
Alle geschützten Endpunkte benötigen ein Access Token. Dieses wird über die Security-API mit Benutzername und Passwort angefordert.
Endpunkt:
POST /api/rest/public/security/auth/{clientName}/tokenDie Parameter username und password werden als application/x-www-form-urlencoded übertragen. Ein JSON-Body wird nicht unterstützt und mit dem Status 415 Unsupported Media Type abgelehnt.
clientName ermitteln
{clientName} ist der technische Name des Login-Dienstes:
| Anmeldeart | clientName |
|---|---|
| formcycle-Systemanmeldung | form |
| LDAP | UUID des LDAP-Login-Dienstes |
Für LDAP ist nicht ldap anzugeben, sondern die UUID des jeweiligen LDAP-Login-Dienstes. Da mehrere LDAP-Login-Dienste eingerichtet sein können, hat jeder seine eigene UUID.Die UUID lässt sich auf zwei Wegen ermitteln:
- In der Oberfläche: In den Einstellungen des LDAP-Login-Dienstes im Feld Alias für Callback-URL (UUID).
- Über die REST-API: Ist der LDAP-Login-Dienst einem Benutzerportal zugeordnet, liefert der Endpunkt
GET /api/rest/public/user-portals/{userPortalUuid}/authenticatorsalle Login-Dienste des Portals mit ihremclientName. DieuserPortalUuidliefertGET /api/rest/public/user-portalsim Felduuid(nicht zu verwechseln mit dem Feldalias).
Beispiel-Antwort von /user-portals/{userPortalUuid}/authenticators (gekürzt):
{
"results": [
{
"clientName": "a5c24bf2-8702-4777-b586-cdb6d3e593dd",
"displayName": "LDAP firma.local",
"renderType": "FORM_INPUT_USERNAME_PASSWORD"
},
{
"clientName": "form",
"displayName": "Systemanmeldung",
"renderType": "FORM_INPUT_USERNAME_PASSWORD"
}
]
}Beispiel: Token per curl anfordern (formcycle-Systemanmeldung)
curl -X POST "https://<server>/<context-path>/api/rest/public/security/auth/form/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "username=<benutzername>" \ --data-urlencode "password=<passwort>"
Beispiel: Token per curl anfordern (LDAP)
curl -X POST "https://<server>/<context-path>/api/rest/public/security/auth/<uuid-des-ldap-login-dienstes>/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "username=<benutzername>" \ --data-urlencode "password=<passwort>"
Antwort
{
"status_type": "SUCCESS",
"token_response": {
"access_token": "eyJhbGciOi...",
"expires_in": 300,
"refresh_token": "eyJhbGciOi...",
"refresh_expires_in": 1800,
"id_token": "eyJhbGciOi...",
"id_token_expires_in": 3600,
"token_type": "Bearer"
}
}| Feld | Bedeutung |
|---|---|
status_type | SUCCESS bei erfolgreicher Anmeldung, MFA_REQUIRED wenn eine Multi-Faktor-Authentifizierung erforderlich ist |
token_response.access_token | Das Token für alle weiteren Requests an geschützte Endpunkte |
token_response.expires_in | Gültigkeit des Access Tokens in Sekunden |
token_response.refresh_token | Das Token zum Erneuern des Access Tokens |
token_response.refresh_expires_in | Gültigkeit des Refresh Tokens in Sekunden |
Geschützten Endpunkt aufrufen
Endpunkte, die eine Authentifizierung erfordern, können nur mit einem gültigen Access Token aufgerufen werden. Geschützt sind z. B.:
- die Vorgangs-Endpunkte (siehe
https://<server>/<context-path>/api/rest/public/form-records/doc/openapi.html) - die Endpunkte für das Profil des angemeldeten Benutzers (siehe
https://<server>/<context-path>/api/rest/public/users/doc/openapi.html)
Das Access Token wird als Authorization-Header mitgeschickt.
Beispiel:
Im Beispiel werden die Vorgänge abgerufen, die der angemeldete Benutzer selbst eingereicht hat.
Die Vorgangs-Endpunkte liefern ausschließlich Vorgänge aus Sicht des Antragstellers, also Vorgänge, die der angemeldete Benutzer zu irgendeinem Zeitpunkt selbst eingereicht hat. Ein Zugriff auf alle Vorgänge eines Mandanten, wie etwa im Postfach, ist über die REST-API nicht möglich.
curl -X GET "https://<server>/<context-path>/api/rest/public/form-records" \ -H "Authorization: Bearer <access_token>" \ -H "Accept: application/json"
Beispiel-Antwort:
{
"results": [
{
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"displayName": "Testformular",
"state": {
"type": "END_STATE",
"displayName": "Abgeschlossen"
},
"submitTimestamp": 1780307759.981574,
"applicantName": "Max Mustermann",
"attachmentCount": 0,
"chatCount": 0
}
],
"resultCount": 10,
"page": 1,
"pageSize": 10,
"totalCount": 30,
"totalPages": 3
}Listen werden seitenweise ausgeliefert. Über die Query-Parameter page und size lässt sich steuern, welche Seite in welcher Größe geliefert wird, z. B. /form-records?page=2&size=20.
Access Token erneuern
Access Tokens sind nur begrenzt gültig (siehe expires_in). Mit dem Refresh Token lässt sich ein neues Access Token anfordern, ohne Benutzername und Passwort erneut zu übermitteln.
Endpunkt:
POST /api/rest/public/security/auth/{clientName}/token/refreshBeispiel:
curl -X POST "https://<server>/<context-path>/api/rest/public/security/auth/form/token/refresh" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "refresh_token=<refresh_token>"
Antwort:
Die Antwort enthält die Token direkt, also ohne die Felder status_type und token_response:
{
"access_token": "eyJhbGciOi...",
"expires_in": 300,
"refresh_token": "eyJhbGciOi...",
"refresh_expires_in": 1800,
"id_token": "eyJhbGciOi...",
"id_token_expires_in": 3600,
"token_type": "Bearer"
}Ein Refresh Token kann nur einmal verwendet werden. Für die nächste Erneuerung ist immer das neuerefresh_tokenaus der letzten Antwort zu verwenden. Ein bereits verwendetes Refresh Token wird mit dem Status404abgelehnt.
Refresh Token widerrufen
Wird ein Refresh Token nicht mehr benötigt (z. B. beim Abmelden), kann es widerrufen werden. Danach lässt es sich nicht mehr zum Erneuern verwenden.
Endpunkt:
POST /api/rest/public/security/auth/{clientName}/token/revokeBeispiel:
curl -X POST "https://<server>/<context-path>/api/rest/public/security/auth/form/token/revoke" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "refresh_token=<refresh_token>"
Anmeldung mit Multi-Faktor-Authentifizierung (MFA)
Ist für den Benutzer MFA aktiviert, läuft die Anmeldung in zwei Schritten ab. Der Benutzer ist dabei aktiv beteiligt, da er einen MFA-Code eingeben muss.
Ablauf:
- Anmeldung: Der Request an
/security/auth/{clientName}/token(siehe Authentifizierung) liefert noch kein Access Token, sondern ein temporäres MFA-Token. Dieses verknüpft den nachfolgenden Verify-Request mit der begonnenen Anmeldung. - Code-Eingabe durch den Benutzer: Der Benutzer liest den aktuellen MFA-Code aus seiner Authenticator-App ab oder erhält ihn per E-Mail (siehe
mfa_type) und gibt ihn ein. - Verifikation: Der Code wird zusammen mit dem temporären MFA-Token an den Verify-Endpunkt gesendet. Ist er korrekt, enthält die Antwort das Access Token.
Antwort der Anmeldung bei aktiver MFA:
{
"status_type": "MFA_REQUIRED",
"mfa_required_response": {
"temp_token": "…",
"message": "…",
"expires_in": 300,
"mfa_type": "TOTP"
}
}| Feld | Bedeutung |
|---|---|
temp_token | Temporäres MFA-Token, das beim Verify-Request als token übergeben wird |
message | Hinweistext zur Anzeige für den Benutzer, in der Sprache aus dem Accept-Language-Header |
expires_in | Gültigkeit des temporären MFA-Tokens in Sekunden |
mfa_type | Art der MFA: TOTP (Authenticator-App) oder EMAIL (Code per E-Mail) |
Endpunkt für die Verifikation:
POST /api/rest/public/security/auth/mfa/verify
| Feld | Beschreibung |
|---|---|
code | MFA-Code aus der Benutzereingabe |
token | Temporäres MFA-Token (temp_token) aus der Antwort der Anmeldung |
save | Optional, Standard false: merkt sich die MFA-Bestätigung für dieses Gerät |
Beispiel:
curl -X POST "https://<server>/<context-path>/api/rest/public/security/auth/mfa/verify" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "code=123456" \ --data-urlencode "token=<temp_token>" \ --data-urlencode "save=false"
Antwort:
{
"success": true,
"token": {
"access_token": "eyJhbGciOi...",
"expires_in": 300,
"refresh_token": "eyJhbGciOi...",
"refresh_expires_in": 1800,
"id_token": "eyJhbGciOi...",
"id_token_expires_in": 3600,
"token_type": "Bearer"
}
}Das Access Token steht in token.access_token.
Falscher Code:
Ist der Code falsch, antwortet der Endpunkt trotzdem mit dem Status 200, aber mit success: false und ohne Token:
{
"success": false
}Es reicht nicht, nur den HTTP-Status zu prüfen. Ausschlaggebend ist das Feld success. Der Benutzer kann den Code anschließend erneut eingeben.Neuen Code anfordern:
Ist der Code abgelaufen oder nicht angekommen, lässt sich über folgenden Endpunkt ein neues temporäres MFA-Token anfordern. Bei mfa_type EMAIL wird dabei ein neuer Code per E-Mail versendet.
POST /api/rest/public/security/auth/mfa/refresh/{temp_token}Die Antwort enthält die Felder aus mfa_required_response direkt:
{
"temp_token": "…",
"message": "…",
"expires_in": 600,
"mfa_type": "EMAIL"
}Für die anschließende Verifikation den neuen Code zusammen mit dem neuen temp_token verwenden.
Token in der API-Referenz verwenden
- Die API-Referenz des Bereichs Security im Browser öffnen.
- Den Endpunkt
POST /security/auth/{clientName}/tokenaufklappen. - Auf Try it out klicken.
clientName(formbzw. die UUID des LDAP-Login-Dienstes),usernameundpasswordeintragen.- Auf Execute klicken.
- In der Antwort den Wert von
token_response.access_tokenkopieren. - Die API-Referenz des gewünschten Bereichs öffnen (z. B. Form records) und oben rechts auf Authorize klicken.
- Den kopierten Wert in das Feld für
bearerAutheintragen und mit Authorize bestätigen.
Die API-Referenz ergänzt dann bei jedem Request automatisch den Header:
Authorization: Bearer <access_token>
Danach lassen sich geschützte Endpunkte über Try it out ausführen.
Nach Ablauf des Access Tokens (siehe expires_in, z. B. 300 Sekunden) muss ein neues Token angefordert und erneut eingetragen werden.Ungeschützte Endpunkte aufrufen
Nicht alle Endpunkte erfordern eine Authentifizierung. Öffentlich zugängliche Endpunkte, z. B. für Formulare und Benutzerportale, lassen sich ohne Access Token aufrufen.
Beispiel:
Im Beispiel wird ein Formular über die UUID des Mandanten und die UUID des Formulars abgerufen.
curl -X GET "https://<server>/<context-path>/api/rest/public/forms/{clientUuid}/{formUuid}" \
-H "Accept: application/json"Beispiel-Antwort (gekürzt):
{
"uuid": "1770f6b8-6928-4c0c-8d42-6abfe09099a5",
"name": "Testformular",
"clientUuid": "5e7f472a-c335-470c-8a35-94a43851e79c",
"providePath": "/form/provide/1/"
}Häufige Fehler
401 Unauthorized
Das Access Token fehlt, ist ungültig oder abgelaufen.
- Wurde in der API-Referenz Authorize verwendet bzw. bei curl der
Authorization-Header gesetzt? - Ist das Access Token noch gültig (
expires_inbeachten)? Gegebenenfalls ein neues Token über den Refresh-Endpunkt anfordern.
403 Forbidden
Der Benutzer ist angemeldet, hat aber nicht die nötigen Berechtigungen. Die Berechtigungen des Benutzers in formcycle sind zu prüfen.
404 Not Found bei Anmeldung oder Token-Erneuerung
Die Security-API antwortet aus Sicherheitsgründen in mehreren Fällen einheitlich mit 404 und ohne Fehlermeldung. Mögliche Ursachen:
- falscher
clientName, z. B.ldapstatt der UUID des LDAP-Login-Dienstes - falsche Zugangsdaten
- Login-Dienst nicht vorhanden oder deaktiviert
- beim Erneuern: Refresh Token bereits verwendet, widerrufen oder abgelaufen
415 Unsupported Media Type
Die Anfrage an die Security-API wurde nicht als application/x-www-form-urlencoded gesendet, z. B. als JSON. Den Content-Type-Header und das Format des Bodys prüfen.
War dieser Artikel hilfreich?
Das ist großartig!
Vielen Dank für das Feedback
Leider konnten wir nicht helfen
Vielen Dank für das Feedback
Feedback gesendet
Wir wissen Ihre Bemühungen zu schätzen und werden versuchen, den Artikel zu korrigieren
