Zum Inhalt springen

Authentifizierung

Jede Anfrage trägt einen Bearer-Token im Header Authorization. Für eigene Skripte genügt ein API-Schlüssel; Apps, die andere DebtFlow-Konten verbinden, nutzen OAuth 2.0 mit PKCE.
VerfahrenTokenWofür
API-Schlüsseldf_live_…Eigene Skripte, Server, Automatisierungen für Ihr eigenes Konto
OAuth 2.0dfo_…Apps von Drittanbietern, die im Namen anderer Nutzer handeln

API-Schlüssel

Schlüssel legen Sie im Dashboard unter Einstellungen → Entwickler an. Dabei wählen Sie die Berechtigungen und optional ein Ablaufdatum. Der Schlüssel hat das Format df_live_ plus 32 Zeichen und wird nur einmal angezeigt; DebtFlow speichert lediglich einen Hash. Widerrufene oder abgelaufene Schlüssel werden mit 401 invalid_api_key abgelehnt.

curl 'https://www.debt-flow.io/api/v1/me' \
  -H "Authorization: Bearer $DEBTFLOW_API_KEY"
Schlüssel gehören auf den Server
Ein API-Schlüssel hat die Rechte Ihres Kontos im gewählten Umfang. Bauen Sie ihn nie in Browser- oder Mobil-Apps ein und legen Sie ihn nicht in Git ab. Für jede Anwendung einen eigenen Schlüssel mit den kleinsten nötigen Rechten anlegen – dann lässt sich jeder einzeln widerrufen.

OAuth 2.0

Mit OAuth verbinden andere DebtFlow-Nutzer Ihre Anwendung mit ihrem Konto, ohne Ihnen ein Passwort oder einen Schlüssel zu geben. DebtFlow unterstützt den Autorisierungscode-Ablauf mit PKCE (RFC 6749, RFC 7636) und Refresh-Tokens.

EndpunktURL
Autorisierunghttps://www.debt-flow.io/oauth/authorize
TokenPOST https://www.debt-flow.io/api/v1/oauth/token
WiderrufPOST https://www.debt-flow.io/api/v1/oauth/revoke
Metadaten (RFC 8414)https://www.debt-flow.io/.well-known/oauth-authorization-server

1. App registrieren

Unter Einstellungen → Apps → App registrieren geben Sie Name, Beschreibung, Website, Redirect-URIs und die höchstens anforderbaren Berechtigungen an. Sie erhalten eine Client-ID (oac_…) und – bei vertraulichen Apps – einmalig ein Client-Secret (dfs_…).

  • Vertraulich: läuft auf Ihrem Server und hält das Secret geheim. Authentifizierung am Token-Endpunkt per HTTP Basic oder client_id/client_secret im Body – zusätzlich zu PKCE.
  • Öffentlich: Browser-, Mobil- oder Desktop-App ohne Secret, am Token-Endpunkt nur client_id.
  • PKCE (S256) ist für alle Apps Pflicht (OAuth 2.1). Ohne code_challenge lehnt DebtFlow die Autorisierung mit invalid_request ab.
  • Redirect-URIs müssen exakt übereinstimmen und https:// verwenden. Für die Entwicklung ist http://localhost bzw. http://127.0.0.1 erlaubt, dort mit beliebigem Port.
Ausnahme von der PKCE-Pflicht
Nur für vertrauliche Apps, die PKCE nachweislich nicht senden können (z. B. eine Integrationsplattform ohne PKCE-Unterstützung), und nur nach Prüfung durch DebtFlow. Schreiben Sie an [email protected] mit Client-ID und Begründung. Die Ausnahme wird ausschließlich serverseitig am App-Datensatz hinterlegt (Begründung, Freigabe durch, Datum) und ist weder über die API noch in den Einstellungen änderbar; dort erscheint sie als „PKCE-Ausnahme“. Öffentliche Apps erhalten nie eine Ausnahme.

2. PKCE-Werte erzeugen

Für jede Anmeldung erzeugen Sie einen zufälligen code_verifier (43–128 Zeichen) und daraus die code_challenge per SHA-256. Dazu einen zufälligen state gegen CSRF. Beide Werte bleiben bis zum Rücksprung in der Sitzung des Nutzers.

# code_verifier: 64 zufällige Zeichen aus A–Z a–z 0–9 - . _ ~
CODE_VERIFIER=$(openssl rand -base64 48 | tr -dc 'A-Za-z0-9' | head -c 64)
# code_challenge = BASE64URL(SHA256(code_verifier)) ohne "="
CODE_CHALLENGE=$(printf '%s' "$CODE_VERIFIER" | openssl dgst -sha256 -binary | openssl base64 -A | tr '+/' '-_' | tr -d '=')

3. Nutzer zur Zustimmung weiterleiten

Weiterleitung
https://www.debt-flow.io/oauth/authorize
  ?response_type=code
  &client_id=oac_DeineClientId0000000
  &redirect_uri=https%3A%2F%2Fapp.example.com%2Foauth%2Fcallback
  &scope=contacts%3Aread%20invoices%3Awrite
  &state=7Jx0…
  &code_challenge=E9Mel…
  &code_challenge_method=S256
ParameterBedeutung
response_typeimmer code
client_idClient-ID Ihrer App
redirect_urieine registrierte Redirect-URI; darf fehlen, wenn genau eine registriert ist
scopeBerechtigungen, durch Leerzeichen getrennt; ohne Angabe alle für die App registrierten
statezufälliger Wert, kommt unverändert zurück
code_challengeBASE64URL(SHA256(code_verifier)), 43 Zeichen
code_challenge_methodnur S256

Ist der Nutzer nicht angemeldet, meldet er sich zuerst bei DebtFlow an. Danach sieht er Ihre App, die angeforderten Rechte und die Zieladresse und erlaubt oder lehnt ab.

4. Rücksprung auswerten

Nach der Zustimmung leitet DebtFlow an Ihre Redirect-URI weiter:

https://app.example.com/oauth/callback?code=dfc_…&state=7Jx0…&iss=https%3A%2F%2Fwww.debt-flow.io

Prüfen Sie, dass state zu Ihrer Sitzung passt und iss gleich https://www.debt-flow.io ist (RFC 9207). Der Code ist 5 Minuten gültig und nur einmal einlösbar. Wird ein Code ein zweites Mal eingelöst, widerruft DebtFlow alle damit ausgestellten Tokens.

5. Code gegen Tokens tauschen

Der Token-Endpunkt erwartet application/x-www-form-urlencoded. redirect_uri ist Pflicht, wenn sie bei der Autorisierung übergeben wurde.

curl -X POST 'https://www.debt-flow.io/api/v1/oauth/token' \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d grant_type=authorization_code \
  -d code="$CODE" \
  -d redirect_uri=https://app.example.com/oauth/callback \
  -d code_verifier="$CODE_VERIFIER"
Antwort 200
{
  "access_token": "dfo_…",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "dfr_…",
  "scope": "contacts:read invoices:write"
}

6. API aufrufen

Das Access-Token wird wie ein API-Schlüssel gesendet: Authorization: Bearer dfo_…. Es gilt eine Stunde. Abgelaufene oder widerrufene Tokens liefern 401 invalid_token; fehlende Rechte 403 insufficient_scope.

7. Token erneuern

Mit dem Refresh-Token holen Sie neue Tokens. Jede Erneuerung liefert ein neues Refresh-Token; das verwendete ist danach ungültig. Optional fordern Sie mit scope weniger Rechte an, nie mehr.

curl -X POST 'https://www.debt-flow.io/api/v1/oauth/token' \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d grant_type=refresh_token \
  -d refresh_token="$REFRESH_TOKEN"
Parallele Erneuerung und Diebstahlerkennung
Erneuern mehrere Prozesse Ihrer App gleichzeitig mit demselben Refresh-Token, erhalten alle innerhalb von 30 Sekunden nach der ersten Erneuerung dasselbe Token-Paar (Gnadenfrist), solange das neue Refresh-Token noch nicht benutzt wurde. Wird ein bereits verwendetes Refresh-Token danach noch einmal eingesetzt – nach Ablauf der Frist oder nachdem das neue schon verwendet wurde –, wertet DebtFlow das als möglichen Diebstahl und widerruft die ganze Token-Kette; der Nutzer muss die App dann neu verbinden. Speichern Sie das neue Refresh-Token, bevor Sie es verwenden.

Tokens widerrufen

Beim Abmelden in Ihrer App senden Sie das Refresh-Token an den Widerrufs-Endpunkt (RFC 7009). Damit werden auch alle daraus hervorgegangenen Access-Tokens ungültig. Die Antwort ist immer 200.

curl
curl -X POST 'https://www.debt-flow.io/api/v1/oauth/revoke' \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d token="$REFRESH_TOKEN"

Gültigkeitsdauer

WertGültigHinweis
Autorisierungscode5 Minuteneinmalig
Access-Token1 Stundeexpires_in
Refresh-Token90 Tagejede Erneuerung beginnt neue 90 Tage

Fehler am Token-Endpunkt

Der Token- und der Widerrufs-Endpunkt antworten im OAuth-Format { "error": "…", "error_description": "…" }:

CodeStatusBedeutung
invalid_request400Parameter fehlt, ist doppelt oder ungültig
invalid_client401Client-ID unbekannt oder Secret falsch
invalid_grant400Code bzw. Refresh-Token ungültig, abgelaufen, schon verwendet, PKCE passt nicht oder Verbindung widerrufen
unsupported_grant_type400nur authorization_code und refresh_token
invalid_scope400unbekannte oder mehr Berechtigungen als erteilt

Wenn der Nutzer die Verbindung trennt

Nutzer sehen alle verbundenen Apps unter Einstellungen → Apps und können den Zugriff jederzeit widerrufen. Alle Tokens der Verbindung sind dann sofort ungültig; Ihre App erhält 401 bzw. invalid_grant und muss den Nutzer erneut durch die Autorisierung führen. Verringern Sie als Entwickler die Berechtigungen Ihrer App, gelten die geringeren Rechte sofort auch für bestehende Verbindungen.