
# サブジェクトの競合を解決する

`POST /v1/connections/{connection_id}/subject-conflicts/{conflict_id}:resolve` · 権限 `users:write`

未解決の SSO サブジェクトの競合 ([接続のサブジェクトの競合を一覧表示する](subject-conflicts.md) を参照) に対して、管理者の判断を適用します。新しいサブジェクトが誰のものかを ID プロバイダの管理者に確認してから判断してください。

| `resolution` | 意味 | KeenAuth の動作 |
|---|---|---|
| `same_person` | 新しいサブジェクトは同じ人物のものです (たとえば、ID プロバイダでアカウントが作り直された場合)。 | この接続におけるユーザーの古い ID を、新しいサブジェクトに置き換えます。次回以降のサインインから、ユーザーは新しいサブジェクトでサインインします。 |
| `different_person` | メールアドレスが別の人物に割り当てられました。 | レコードを閉じ、何も紐付けません。新しい人物が既存のアカウントに入ることはありません。 |

`different_person` を選択したあと、新しい人物が次にサインインすると、新しいレコードが作成されます。新しい人物にサインインを許可するには、既存のアカウントのメールアドレスを変更するか、そのアカウントをブロックまたは削除してください。その後は通常のサインインルールが適用されます。

ID の変更、そのイベント、監査レコードは 1 つのトランザクションで書き込まれます。監査上の実行者は、この呼び出しを行った認証情報です。

同じ判断を繰り返した場合は、何も書き込まれずにレコードが返されます。解決済みのレコードに対して異なる判断を行うと、`409 conflict` が返されます。再試行時に元のレスポンスを取得するには、`Idempotency-Key` を送信してください。

## リクエスト

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `connection_id` | path | はい | 接続の ID (`conn_…`)。 |
| `conflict_id` | path | はい | サブジェクトの競合の ID (`sscf_…`)。 |
| `resolution` | body | はい | `same_person` または `different_person`。 |

```json
{ "resolution": "same_person" }
```

## レスポンス

解決済みのレコードを含む `200 OK`:

```json
{
  "id": "sscf_01j9xr4a6b8c0d2e4f6g8h0j2k",
  "connection_id": "conn_01j9xp6q0r1s5t7v9w1x3y5z7b",
  "user_id": "usr_01j9xm2n4p6q8r0s2t4v6w8x0y",
  "status": "resolved",
  "resolution": "same_person",
  "created_at": "2026-10-28T10:00:00Z",
  "last_seen_at": "2026-10-28T10:05:00Z",
  "expires_at": "2026-11-27T10:00:00Z",
  "closed_at": "2026-10-28T11:00:00Z"
}
```

## エラー

| HTTP | code | 発生条件 |
|---|---|---|
| 400 | `unknown_field` / `malformed_request` | ボディに未知のフィールドがある、または有効な JSON ではない場合。 |
| 401 | `unauthenticated` | 認証情報が指定されていない、無効、または取り消されている場合。 |
| 403 | `insufficient_permissions` | 認証情報に `users:write` がない場合。 |
| 403 | `user_not_active` | `same_person` の場合で、ユーザーがブロックされている、または削除中である場合。レコードは未解決のまま残ります。 |
| 404 | `not_found` | 接続またはレコードがこの環境に存在しない場合、レコードが別の接続に属している場合、または有効期限が切れている場合。 |
| 409 | `conflict` | レコードが別の判断で解決済みの場合。または `same_person` の場合で、接続が有効でない、新しいサブジェクトが別のユーザーに紐付けられている、またはユーザーの ID 数の上限に達している場合。`same_person` の場合、レコードは未解決のまま残ります。 |
| 422 | `validation_failed` | `resolution` がない、または 2 つの値のいずれでもない場合 (`errors[].pointer` = `/resolution`)。 |
| 429 | `rate_limited` | レート制限を超えた場合。`Retry-After` の期間が経過してから再試行してください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できない場合。`Retry-After` の期間が経過してから再試行してください。 |

## 例

```bash
curl -X POST "https://api.eu.keenauth.com/v1/connections/conn_01j9xp6q0r1s5t7v9w1x3y5z7b/subject-conflicts/sscf_01j9xr4a6b8c0d2e4f6g8h0j2k:resolve" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"resolution":"different_person"}'
```

```bash
keenauth connections subject-conflicts resolve conn_01j9xp6q0r1s5t7v9w1x3y5z7b sscf_01j9xr4a6b8c0d2e4f6g8h0j2k \
  --resolution different_person --yes
```
