
# Bir bağlantının passkey rpId değerini değiştirin

`POST /v1/connections/{connection_id}:change-rp-id` · İzin `connections:write`

Passkey bağlantısını yeni bir rpId'ye taşır ve bir geçiş penceresi başlatır. Bir passkey, kayıt olduğu rpId'ye bağlıdır; bu nedenle kullanıcıların passkey'leri varken rpId'yi değiştirmenin tek yolu budur. `settings.rp_id` alanını değiştiren bir `PATCH` isteği `409 rp_id_change_requires_migration` ile reddedilir.

Geçiş penceresi boyunca kullanıcılar önceki rpId'nin Passkey'leriyle hâlâ giriş yapabilir ve yeni Passkey'ler yeni rpId üzerinde kaydedilir. Pencere sona erdiğinde veya [Bu bağlantının rpId geçişini tamamlayın](complete-rp-id-migration.md) bağlantısıyla erken sonlandırdığınızda, önceki rpId üzerinde kalan Passkey'ler iptal edilir (neden `rp_id_changed`). Başka bir oturum açma yöntemi olmayan kullanıcıların o zaman parolasız e-posta ile giriş yapmaya veya hesap kurtarmaya ihtiyacı olur. Bir ortamda aynı anda yalnızca bir geçiş çalışabilir.

Bağlantının rpId'si, geçiş kaydı, yönetim denetim kaydı ve `passkey_rp_id.migration_started` olayı birlikte yazılır. rpId olan veya çalışan bir geçişin önceki rpId'si olan bir özel alan adı silinemez (`409 domain_in_use_by_rp_id`).

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `connection_id` | path | evet | Passkey bağlantı kimliği (`conn_…`). |
| `If-Match` | header | evet | Bağlantının `ETag` değeri (bkz. [Bir bağlantıyı alın](get.md)). |
| `Idempotency-Key` | header | hayır | Yeniden denenen isteği güvenli hale getiren isteğe bağlı anahtar (16-64 karakter). |
| `new_rp_id` | string | evet | Yeni rpId: ortamın `active` durumundaki bir özel alan adının ana bilgisayar adı (küçük harf, IDNA A-etiketi) veya her oturum açma ana bilgisayarını kendi rpId'si olarak kullanmak için boş dize. En fazla 253 bayt. |
| `confirm_rp_id` | string | evet | `new_rp_id` değerinin yeniden yazılmış hali. |
| `migration_window_days` | integer | hayır | Önceki rpId'nin Passkey'lerinin kaç gün çalışmaya devam edeceği: 30-365, varsayılan 90. |

```json
{
  "new_rp_id": "login.example.com",
  "confirm_rp_id": "login.example.com",
  "migration_window_days": 90
}
```

## Yanıt

`200 OK`; geçiş ve bağlantının yeni sürümünü içeren bir `ETag` üstbilgisi.

```json
{
  "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
}
```

| Alan | Açıklama |
|---|---|
| `previous_rp_id`, `new_rp_id` | Değişiklikten önceki ve sonraki rpId; `null` her oturum açma ana bilgisayarının kendi rpId'si olduğu anlamına gelir. |
| `status` | Pencere çalışırken `active`; sona erdiğinde `completed`; erken sonlandırıldığında `completed_early`. |
| `ends_at` | Pencerenin planlanan bitiş zamanı. |
| `completed_at`, `revoked_count`, `new_registration_count` | Geçiş kapandığında yazılır; `active` iken `null`. |
| `fallback_enabled_by_migration` | Passkey'ler tek birincil faktör olduğu için pencere boyunca yedek bir oturum açma yöntemi etkinleştirildiyse `true`. |

## Hatalar

| HTTP | kod | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | İstek gövdesi bilinmeyen bir alan içeriyor. |
| 404 | `not_found` | Bağlantı yok veya başka bir ortama ait. |
| 409 | `rp_id_migration_in_progress` | Bu ortamda başka bir rpId geçişi çalışıyor. |
| 412 | `precondition_failed` | `If-Match` geçerli sürümle eşleşmiyor. |
| 422 | `validation_failed` | Bir alan eksik, çok uzun veya aralık dışında; `new_rp_id` ortamın `active` durumundaki bir özel alan adı değil ya da mevcut rpId'ye eşit; `confirm_rp_id` farklı; ya da bağlantı bir passkey bağlantısı değil (`errors[].pointer`: `/new_rp_id`, `/confirm_rp_id`, `/migration_window_days`, `/connection_id`). |
| 428 | `precondition_required` | `If-Match` üstbilgisi eksik. |
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz veya iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisi gerekli izne sahip değil. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

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

```bash
keenauth connections change-rp-id conn_01j9xp6q0r1s5t7v9w1x3y5z7b --if-match '"3"' --yes \
  --data '{"new_rp_id":"login.example.com","confirm_rp_id":"login.example.com"}'
```
