Cambiar el rpId de la clave de acceso de una conexión
POST /v1/connections/{connection_id}:change-rp-id · permiso connections:write
Mueve una conexión de clave de acceso a un nuevo rpId e inicia un periodo de migración. Una clave de acceso está vinculada al rpId con el que se registró, por lo que, una vez que los usuarios tengan claves de acceso, esta es la única forma de cambiar el rpId: un PATCH que modifique settings.rp_id se rechaza con 409 rp_id_change_requires_migration.
Durante el periodo, los usuarios todavía pueden iniciar sesión con claves de acceso del rpId anterior, y las nuevas claves de acceso se registran en el nuevo rpId. Cuando termina el periodo, o cuando usted lo finaliza antes con Completar la migración del rpId, las claves de acceso que sigan en el rpId anterior se revocan (motivo rp_id_changed). Los usuarios que no tengan otro método de inicio de sesión necesitarán entonces inicio de sesión sin contraseña por correo electrónico o recuperación de cuenta. Solo puede ejecutarse una migración a la vez en un entorno.
El rpId de la conexión, el registro de la migración, la entrada de auditoría de gestión y el evento passkey_rp_id.migration_started se escriben juntos. Un dominio personalizado que sea el rpId, o el rpId anterior de una migración en curso, no se puede eliminar (409 domain_in_use_by_rp_id).
Solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
connection_id |
ruta | sí | ID de la conexión de clave de acceso (conn_…). |
If-Match |
encabezado | sí | El ETag de la conexión (consulte Obtener una conexión). |
Idempotency-Key |
encabezado | no | Clave opcional que hace seguro reintentar una solicitud (de 16 a 64 caracteres). |
new_rp_id |
cadena | sí | El nuevo rpId: el nombre de host de un dominio personalizado active del entorno (en minúsculas, etiqueta A de IDNA), o una cadena vacía para usar cada host de inicio de sesión como su propio rpId. Como máximo 253 bytes. |
confirm_rp_id |
cadena | sí | new_rp_id escrito de nuevo. |
migration_window_days |
entero | no | Cuántos días siguen funcionando las claves de acceso del rpId anterior: de 30 a 365, valor predeterminado 90. |
{
"new_rp_id": "login.example.com",
"confirm_rp_id": "login.example.com",
"migration_window_days": 90
}
Respuesta
200 OK; la migración y un encabezado ETag con la nueva versión de la conexión.
{
"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 | Descripción |
|---|---|
previous_rp_id, new_rp_id |
El rpId antes y después del cambio; null significa que cada host de inicio de sesión es su propio rpId. |
status |
active mientras el periodo está en curso; completed cuando terminó; completed_early cuando se finalizó antes. |
ends_at |
Cuándo está previsto que termine el periodo. |
completed_at, revoked_count, new_registration_count |
Se escriben al cerrarse la migración; null mientras esté active. |
fallback_enabled_by_migration |
true cuando se activó durante el periodo un método de inicio de sesión alternativo porque las claves de acceso eran el único primer factor. |
Errores
| HTTP | código | Cuándo |
|---|---|---|
| 400 | unknown_field |
El cuerpo contiene un campo desconocido. |
| 404 | not_found |
La conexión no existe o pertenece a otro entorno. |
| 409 | rp_id_migration_in_progress |
Hay otra migración de rpId en curso en este entorno. |
| 412 | precondition_failed |
If-Match no coincide con la versión actual. |
| 422 | validation_failed |
Falta un campo, es demasiado largo o está fuera de rango; new_rp_id no es un dominio personalizado active del entorno o es igual al rpId actual; confirm_rp_id no coincide; o la conexión no es una conexión de clave de acceso (errors[].pointer: /new_rp_id, /confirm_rp_id, /migration_window_days, /connection_id). |
| 428 | precondition_required |
Falta el encabezado If-Match. |
| 401 | unauthenticated |
La credencial falta, no es válida o fue revocada. |
| 403 | insufficient_permissions |
La credencial no tiene el permiso necesario. |
| 429 | rate_limited |
Se superó el límite de solicitudes; reintente después del periodo indicado en Retry-After. |
| 503 | service_unavailable |
Una dependencia no está disponible temporalmente; reintente después del periodo indicado en Retry-After. |
Ejemplo
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"}'