Modificare il passkey rpId di una connessione
POST /v1/connections/{connection_id}:change-rp-id · autorizzazione connections:write
Sposta una connessione passkey su un nuovo rpId e avvia una finestra di migrazione. Un passkey è associato all'rpId con cui è stato registrato, quindi, una volta che gli utenti hanno dei passkey, questo è l'unico modo per cambiare l'rpId: un PATCH che modifica settings.rp_id viene rifiutato con 409 rp_id_change_requires_migration.
Durante la finestra, gli utenti possono ancora accedere con i passkey del precedente rpId, e i nuovi passkey vengono registrati sul nuovo rpId. Quando la finestra termina, oppure quando la chiudi in anticipo con Completare la migrazione dell'rpId, i passkey che sono ancora sul precedente rpId vengono revocati (motivo rp_id_changed). Gli utenti che non hanno altri metodi di accesso avranno bisogno quindi dell'accesso senza password tramite email o del recupero dell'account. In un ambiente può essere in esecuzione una sola migrazione alla volta.
L'rpId della connessione, il record di migrazione, la voce di audit di gestione e l'evento passkey_rp_id.migration_started vengono scritti insieme. Un dominio personalizzato che è l'rpId, o il precedente rpId di una migrazione in corso, non può essere eliminato (409 domain_in_use_by_rp_id).
Richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
connection_id |
path | sì | ID della connessione passkey (conn_…). |
If-Match |
header | sì | L'ETag della connessione (vedi Ottenere una connessione). |
Idempotency-Key |
header | no | Chiave facoltativa che rende sicura una richiesta ritentata (da 16 a 64 caratteri). |
new_rp_id |
string | sì | Il nuovo rpId: il nome host di un dominio personalizzato active dell'ambiente (minuscolo, etichetta A IDNA), oppure una stringa vuota per usare ogni host di accesso come rpId separato. Massimo 253 byte. |
confirm_rp_id |
string | sì | new_rp_id digitato di nuovo. |
migration_window_days |
integer | no | Per quanti giorni continuano a funzionare i passkey del precedente rpId: da 30 a 365, valore predefinito 90. |
{
"new_rp_id": "login.example.com",
"confirm_rp_id": "login.example.com",
"migration_window_days": 90
}
Risposta
200 OK; la migrazione e un header ETag con la nuova versione della connessione.
{
"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
}
| Campo | Descrizione |
|---|---|
previous_rp_id, new_rp_id |
L'rpId prima e dopo la modifica; null significa che ogni host di accesso è un rpId separato. |
status |
active mentre la finestra è in corso; completed quando è terminata; completed_early quando è stata chiusa in anticipo. |
ends_at |
Quando la finestra è prevista che termini. |
completed_at, revoked_count, new_registration_count |
Scritti alla chiusura della migrazione; null mentre è active. |
fallback_enabled_by_migration |
true quando per la finestra è stato attivato un metodo di accesso di fallback perché i passkey erano l'unico primo fattore. |
Errori
| HTTP | code | Quando |
|---|---|---|
| 400 | unknown_field |
Il corpo contiene un campo sconosciuto. |
| 404 | not_found |
La connessione non esiste o appartiene a un altro ambiente. |
| 409 | rp_id_migration_in_progress |
Un'altra migrazione dell'rpId è in corso in questo ambiente. |
| 412 | precondition_failed |
If-Match non corrisponde alla versione corrente. |
| 422 | validation_failed |
Un campo manca, è troppo lungo o fuori intervallo; new_rp_id non è un dominio personalizzato active dell'ambiente oppure è uguale all'rpId attuale; confirm_rp_id è diverso; oppure la connessione non è una connessione passkey (errors[].pointer: /new_rp_id, /confirm_rp_id, /migration_window_days, /connection_id). |
| 428 | precondition_required |
Manca l'header If-Match. |
| 401 | unauthenticated |
La credenziale manca, non è valida o è stata revocata. |
| 403 | insufficient_permissions |
La credenziale non ha l'autorizzazione richiesta. |
| 429 | rate_limited |
È stato superato il limite di richieste; riprova dopo il periodo indicato in Retry-After. |
| 503 | service_unavailable |
Una dipendenza è temporaneamente non disponibile; riprova dopo il periodo indicato in Retry-After. |
Esempio
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"}'