rpId einer Verbindung für Passkeys ändern

POST /v1/connections/{connection_id}:change-rp-id · Berechtigung connections:write

Verschiebt eine Passkey-Verbindung auf eine neue rpId und startet ein Migrationsfenster. Ein Passkey ist an die rpId gebunden, mit der er registriert wurde. Sobald Nutzer Passkeys haben, ist dies daher der einzige Weg, die rpId zu ändern: Ein PATCH, das settings.rp_id ändert, wird mit 409 rp_id_change_requires_migration abgelehnt.

Während des Fensters können sich Nutzer weiterhin mit Passkeys der bisherigen rpId anmelden, und neue Passkeys werden auf der neuen rpId registriert. Wenn das Fenster endet, oder wenn Sie es mit Migration der rpId abschließen vorzeitig beenden, werden die Passkeys, die noch auf der bisherigen rpId liegen, widerrufen (Grund rp_id_changed). Nutzer, die keine andere Anmeldemethode haben, benötigen dann eine passwortlose Anmeldung per E-Mail oder eine Kontowiederherstellung. In einer Umgebung kann immer nur eine Migration gleichzeitig laufen.

Die rpId der Verbindung, der Migrationsdatensatz, der Verwaltungs-Auditeintrag und das Ereignis passkey_rp_id.migration_started werden gemeinsam geschrieben. Eine benutzerdefinierte Domain, die die rpId ist oder die bisherige rpId einer laufenden Migration, kann nicht gelöscht werden (409 domain_in_use_by_rp_id).

Anfrage

Feld Typ Pflicht Beschreibung
connection_id path ja Passkey-Verbindungs-ID (conn_…).
If-Match header ja Das ETag der Verbindung (siehe Verbindung abrufen).
Idempotency-Key header nein Optionaler Schlüssel, der einen wiederholten Aufruf sicher macht (16-64 Zeichen).
new_rp_id string ja Die neue rpId: der Hostname einer active-benutzerdefinierten Domain der Umgebung (Kleinbuchstaben, IDNA-A-Label) oder eine leere Zeichenkette, damit jeder Anmelde-Host seine eigene rpId verwendet. Höchstens 253 Bytes.
confirm_rp_id string ja new_rp_id erneut eingegeben.
migration_window_days integer nein Wie viele Tage Passkeys der bisherigen rpId weiterhin funktionieren: 30-365, Standard 90.
{
  "new_rp_id": "login.example.com",
  "confirm_rp_id": "login.example.com",
  "migration_window_days": 90
}

Antwort

200 OK; die Migration und ein ETag-Header mit der neuen Version der Verbindung.

{
  "id": "rpm_01j9xr4a6b8c0d2e4f6g8h0j2k",
  "connection_id": "conn_01j9xp6q0r1s5t7v9w1x3y5z7b",
  "previous_rp_id": null,
  "new_rp_id": "login.example.com",
  "status": "active",
  "started_at": "2026-10-27T10:00:00Z",
  "ends_at": "2027-01-25T10:00:00Z",
  "completed_at": null,
  "revoked_count": null,
  "new_registration_count": null,
  "fallback_enabled_by_migration": false
}
Feld Beschreibung
previous_rp_id, new_rp_id Die rpId vor und nach der Änderung; null bedeutet, dass jeder Anmelde-Host seine eigene rpId ist.
status active, solange das Fenster läuft; completed, wenn es beendet wurde; completed_early, wenn es vorzeitig beendet wurde.
ends_at Wann das Fenster planmäßig endet.
completed_at, revoked_count, new_registration_count Werden beim Abschluss der Migration geschrieben; null, solange sie active ist.
fallback_enabled_by_migration true, wenn für das Fenster eine Ausweichanmeldemethode aktiviert wurde, weil Passkeys der einzige erste Faktor waren.

Fehler

HTTP Code Wann
400 unknown_field Der Body enthält ein unbekanntes Feld.
404 not_found Die Verbindung existiert nicht oder gehört zu einer anderen Umgebung.
409 rp_id_migration_in_progress In dieser Umgebung läuft bereits eine andere rpId-Migration.
412 precondition_failed If-Match stimmt nicht mit der aktuellen Version überein.
422 validation_failed Ein Feld fehlt, ist zu lang oder außerhalb des Bereichs; new_rp_id ist keine active-benutzerdefinierte Domain der Umgebung oder entspricht der aktuellen rpId; confirm_rp_id weicht ab; oder die Verbindung ist keine Passkey-Verbindung (errors[].pointer: /new_rp_id, /confirm_rp_id, /migration_window_days, /connection_id).
428 precondition_required Der Header If-Match fehlt.
401 unauthenticated Die Anmeldedaten fehlen, sind ungültig oder widerrufen.
403 insufficient_permissions Die Anmeldedaten haben nicht die erforderliche Berechtigung.
429 rate_limited Das Rate-Limit wurde überschritten; wiederholen Sie den Aufruf nach dem Zeitraum Retry-After.
503 service_unavailable Eine Abhängigkeit ist vorübergehend nicht verfügbar; wiederholen Sie den Aufruf nach dem Zeitraum Retry-After.

Beispiel

curl -X POST "https://api.eu.keenauth.com/v1/connections/conn_01j9xp6q0r1s5t7v9w1x3y5z7b:change-rp-id" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H 'If-Match: "3"' \
  -H "Content-Type: application/json" \
  -d '{"new_rp_id":"login.example.com","confirm_rp_id":"login.example.com"}'
keenauth connections change-rp-id conn_01j9xp6q0r1s5t7v9w1x3y5z7b --if-match '"3"' --yes \
  --data '{"new_rp_id":"login.example.com","confirm_rp_id":"login.example.com"}'