Modifier le rpId de la clé d'accès d'une connexion

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

Déplace une connexion par clé d'accès vers un nouveau rpId et ouvre une fenêtre de migration. Une clé d'accès est liée au rpId avec lequel elle a été enregistrée. Une fois que les utilisateurs disposent de clés d'accès, c'est le seul moyen de modifier le rpId : un PATCH qui modifie settings.rp_id est rejeté avec 409 rp_id_change_requires_migration.

Pendant la fenêtre, les utilisateurs peuvent encore se connecter avec les clés d'accès de l'ancien rpId, et les nouvelles clés d'accès sont enregistrées sur le nouveau rpId. À la fin de la fenêtre, ou lorsque vous y mettez fin plus tôt avec Terminer la migration du rpId, les clés d'accès encore liées à l'ancien rpId sont révoquées (motif rp_id_changed). Les utilisateurs qui n'ont aucune autre méthode de connexion ont alors besoin de la connexion sans mot de passe par adresse e-mail ou de la récupération de compte. Une seule migration peut être en cours dans un environnement à la fois.

Le rpId de la connexion, l'enregistrement de migration, l'entrée d'audit de gestion et l'événement passkey_rp_id.migration_started sont écrits ensemble. Un domaine personnalisé qui est le rpId, ou l'ancien rpId d'une migration en cours, ne peut pas être supprimé (409 domain_in_use_by_rp_id).

Requête

Champ Type Obligatoire Description
connection_id path oui ID de la connexion par clé d'accès (conn_…).
If-Match header oui L'ETag de la connexion (voir Obtenir une connexion).
Idempotency-Key header non Clé facultative qui rend sûre une requête relancée (16 à 64 caractères).
new_rp_id string oui Le nouveau rpId : le nom d'hôte d'un domaine personnalisé active de l'environnement (en minuscules, étiquette A IDNA), ou une chaîne vide pour utiliser chaque hôte de connexion comme son propre rpId. 253 octets maximum.
confirm_rp_id string oui new_rp_id saisi à nouveau.
migration_window_days integer non Nombre de jours pendant lesquels les clés d'accès de l'ancien rpId continuent de fonctionner : 30 à 365, valeur par défaut 90.
{
  "new_rp_id": "login.example.com",
  "confirm_rp_id": "login.example.com",
  "migration_window_days": 90
}

Réponse

200 OK ; l'enregistrement de migration et un en-tête ETag avec la nouvelle version de la connexion.

{
  "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
}
Champ Description
previous_rp_id, new_rp_id Le rpId avant et après la modification ; null signifie que chaque hôte de connexion est son propre rpId.
status active pendant que la fenêtre est ouverte ; completed lorsqu'elle s'est terminée ; completed_early lorsqu'elle a été close plus tôt.
ends_at Date prévue de fin de la fenêtre.
completed_at, revoked_count, new_registration_count Renseignés à la clôture de la migration ; null tant qu'elle est active.
fallback_enabled_by_migration true lorsqu'une méthode de connexion de secours a été activée pendant la fenêtre, parce que les clés d'accès étaient le seul premier facteur.

Erreurs

HTTP code Quand
400 unknown_field Le corps contient un champ inconnu.
404 not_found La connexion n'existe pas ou appartient à un autre environnement.
409 rp_id_migration_in_progress Une autre migration du rpId est en cours dans cet environnement.
412 precondition_failed If-Match ne correspond pas à la version actuelle.
422 validation_failed Un champ est manquant, trop long ou hors plage ; new_rp_id n'est pas un domaine personnalisé active de l'environnement ou est égal au rpId actuel ; confirm_rp_id diffère ; ou la connexion n'est pas une connexion par clé d'accès (errors[].pointer : /new_rp_id, /confirm_rp_id, /migration_window_days, /connection_id).
428 precondition_required L'en-tête If-Match est absent.
401 unauthenticated L'identifiant est absent, invalide ou révoqué.
403 insufficient_permissions L'identifiant ne dispose pas de l'autorisation requise.
429 rate_limited La limite de débit a été dépassée ; réessayez après le délai indiqué par Retry-After.
503 service_unavailable Une dépendance est temporairement indisponible ; réessayez après le délai indiqué par Retry-After.

Exemple

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"}'