Anmelde-Transaktion erstellen

POST /fapi/v1/transactions · wird vom Anmelde-Host der Umgebung aufgerufen

Startet eine Anmelde-Transaktion für eine Anwendung. Die gehostete Anmeldeseite, UI-Komponenten und Headless-Clients rufen diesen Endpunkt auf dem Anmelde-Host der Umgebung auf (eine Subdomain von keenauth.app oder eine verifizierte eigene Domain). Die Antwort setzt das Transaktionscookie __Host-idp_ltx (Secure, HttpOnly, SameSite=Lax, 15 Minuten gültig); spätere Schritte verwenden dieses Cookie.

Anfrage

Header:

Header Erforderlich Beschreibung
Idp-Client ja SDK-Kennung, <package>/<version> (<runtime>/<version>).
Origin ja Muss exakt https://<sign-in host> sein.

Body:

Feld Typ Erforderlich Beschreibung
client_id string ja Die Client-ID der Anwendung.
redirect_uri string (URI) ja Eine der registrierten Weiterleitungs-URIs der Anwendung.

Antwort

201 Created mit dem Transaktionsobjekt:

{
  "schema_version": 1,
  "state": "identifier_pending",
  "next_steps": [{ "step": "identifier", "fields": ["identifier"] }],
  "csrf_token": "<token>",
  "expires_at": "2026-10-05T10:15:00Z"
}

Senden Sie csrf_token bei jeder zustandsverändernden Anfrage dieser Transaktion im Header Idp-Csrf-Token zurück.

Wenn die Autorisierungsanfrage eine Organisation nennt, die SSO verlangt, kann die Antwort bereits federated_redirect mit redirect_url lauten (eine Verbindung: navigieren Sie das oberste Fenster dorthin) oder sso_connections enthalten (mehrere: senden Sie die Auswahl mit dem Schritt sso_start).

DPoP-gebundene Headless-Transaktionen

Eine First-Party-SPA oder native App auf ihrem eigenen Ursprung startet eine Headless-Anmeldung mit einem DPoP-Header (RFC 9449): einem Nachweis, der mit einem Schlüssel signiert ist, den der Client behält (ein nicht exportierbarer WebCrypto-Schlüssel im Browser, der Schlüsselspeicher der Plattform auf einem Gerät), mit htm POST und htu https://<sign-in host>/fapi/v1/transactions. Die Transaktion ist dann an diesen Schlüssel gebunden statt an ein Cookie: Es wird kein Cookie gesetzt und das Objekt enthält keinen csrf_token. Jede spätere Anfrage der Transaktion sendet einen neuen Nachweis mit demselben Schlüssel.

Zusätzliche Body-Felder, geprüft nach den Regeln des Autorisierungsendpunkts:

Feld Typ Erforderlich Beschreibung
code_challenge string ja PKCE-S256-Challenge (RFC 7636).
code_challenge_method string ja S256.
scope string nein Durch Leerzeichen getrennte Scopes, zum Beispiel openid profile email offline_access.
state string nein Wird zusammen mit dem Autorisierungscode zurückgegeben.
nonce string nein Der nonce des ID-Tokens.
organization string nein Organisations-ID oder Name.
ui_locales string nein Bevorzugte Sprachen.
resource string (URI) nein Ressourcenindikator (RFC 8707).

Origin kann der Anmelde-Host oder einer der erlaubten Web-Ursprünge der Anwendung sein; eine native App sendet keinen. Nur First-Party-Anwendungen können eine solche Transaktion starten. Ein Feld, das der Autorisierungsendpunkt ablehnt, führt zu 422 validation_failed mit dem OAuth-Fehlercode in errors[].code. Antwortet der Server mit 401 use_dpop_nonce, signieren Sie einen neuen Nachweis mit dem Wert des Headers DPoP-Nonce der Antwort und wiederholen Sie die Anfrage. Werden diese Felder ohne DPoP-Header gesendet, folgt 422 validation_failed (dpop_required).

Organisation wechseln

Eine Anwendung, die für den angemeldeten Benutzer ein Front-API-Zugriffstoken besitzt (siehe Front-API-Zugriffstoken), wechselt den Benutzer ohne Bildschirmanzeige in eine andere Organisation. Senden Sie das Token in Authorization: DPoP <token> mit einem Nachweis des Schlüssels des Tokens (mit ath) und im Body das Feld flow mit dem Wert organization_switch, die oben genannten DPoP-gebundenen Headless-Felder (client_id der Anwendung des Tokens, redirect_uri, code_challenge, state, nonce, scope) sowie organization, die ID org_… einer Organisation aus GET /fapi/v1/me/organizations.

Die Anfrage wird sofort mit der Sitzung des Tokens entschieden, so wie eine Anmeldung, die die Sitzung wiederverwendet, entschieden würde: die Richtlinie der Organisation (MFA, Leerlaufzeitlimit, SSO, IP-Liste), Zustimmung und ausstehende rechtliche Dokumente. Die Antwort ist 201 mit einer completed-Transaktion, die authorization_response enthält; tauschen Sie deren code am Token-Endpunkt mit Ihrem code_verifier und einem Nachweis desselben Schlüssels ein. Die neuen Tokens enthalten die Organisation in org_id. Es bleibt keine Transaktion offen und es wird kein Cookie gesetzt.

{
  "schema_version": 1,
  "state": "completed",
  "next_steps": [],
  "authorization_response": { "code": "<code>", "state": "<state>", "iss": "https://example.keenauth.app" },
  "expires_at": "2026-10-05T10:15:00Z"
}
Status Code Wann
401 unauthenticated Das Token ist ungültig, abgelaufen, widerrufen oder nicht an einen Schlüssel gebunden, seine Anwendung ist keine aktive First-Party-Anwendung, oder seine Sitzung wurde beendet.
422 validation_failed flow ist nicht organization_switch, client_id ist nicht die Anwendung des Tokens, organization ist keine org_…-ID, oder der Benutzer kann in dieser Anwendung nicht zu ihr wechseln (not_eligible).
403 authorization_failed Die Organisation benötigt einen Bildschirm, den der Wechsel nicht anzeigen kann; error ist der OAuth-Fehler (login_required, interaction_required, consent_required). Starten Sie eine neue Anmeldung mit gesetztem organization.

flow mit dem Wert organization_switch ohne Token führt zu 422 validation_failed (access_token_required).

Fehler

Status Code Wann
400 malformed_request Idp-Client fehlt oder der Body ist kein gültiges JSON.
403 origin_not_allowed Origin ist nicht der Anmelde-Host.
403 headless_not_allowed Eine Drittanbieter-Anwendung hat versucht, einen Headless-Ablauf zu starten.
404 not_found Der Host ist keiner Umgebung als Anmelde-Host zugeordnet.
422 validation_failed client_id ist keine Anwendung dieser Umgebung, redirect_uri ist dafür nicht registriert, oder ein Feld ist ungültig.
401 invalid_dpop_proof Der DPoP-Nachweis fehlt, ist ungültig oder wurde wiederverwendet, oder der Host stellt keine DPoP-gebundenen Transaktionen bereit.
401 use_dpop_nonce Signieren Sie einen neuen Nachweis mit dem Wert des Headers DPoP-Nonce der Antwort.
503 temporarily_unavailable Eine Abhängigkeit ist nicht verfügbar; versuchen Sie es später erneut.

Beispiel

curl -X POST https://example.keenauth.app/fapi/v1/transactions \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H "Content-Type: application/json" \
  -c cookies.txt \
  -d '{"client_id":"<client_id>","redirect_uri":"https://app.example.com/callback"}'

Personenbezogene Daten

Dieser Endpunkt verarbeitet personenbezogene Daten: das Profil des Endbenutzers. Personenbezogene Daten in den KeenAuth-APIs beschreibt, welche Daten gespeichert werden, wie lange sie aufbewahrt werden und wie sie gelöscht werden. Übermitteln Sie in keinem Feld besondere Kategorien personenbezogener Daten (Gesundheit, biometrische Daten, Religion, politische Meinungen, sexuelle Ausrichtung).