
# ユーザーのサインイン状態を取得

`GET /v1/users/{user_id}/sign-in-state` · 権限 `users:read`

ユーザーがサインインできないときにサポートチームが必要とする情報を返します。具体的には、ユーザーの未解除のアカウントロック、各サインイン経路で継続中の失敗回数、最後に成功した認証です。この呼び出しは読み取りのみを行います。何も変更されず、監査レコードも書き込まれません。ロックを解除するには、[`POST /v1/users/{user_id}:unlock`](unlock.md) を使用してください。

レスポンスには、カウンターの内部サブジェクト、メールアドレス、IP アドレス、デバイス、セッション ID は含まれません。ユーザーのセッションを確認するには、[`GET /v1/users/{user_id}/sessions`](list-sessions.md) を使用してください。

## 組織スコープ

組織の管理者向けにメンバーの診断ビューを作成するには、`org_id` を渡します。その場合、キーには `organizations:read` 権限も必要です。この権限がない場合、何も読み取られる前に `403 insufficient_permissions` で失敗します。ユーザーがその組織のメンバーでない場合（`invited`、`active`、`suspended` のメンバーシップがない場合）、リクエストは `404 not_found` で失敗します。これは存在しないユーザーの場合と同じレスポンスです。ユーザーがメンバーである場合、`last_sign_in` はその組織の文脈にあるセッションからのみ取得されます。また、`failures` は常に空の配列です。失敗回数のカウンターはどの組織にも属さないためです。ロックは、すべての文脈でアカウントのサインインを停止するため、引き続き返されます。`org_id` を指定しない場合、レスポンスは変わりません。

## リクエスト

| パラメーター | 位置 | 必須 | 説明 |
|---|---|---|---|
| `user_id` | path | はい | `usr_` で始まるユーザー ID。 |
| `org_id` | query | いいえ | `org_` で始まる組織 ID。ビューをその組織に限定します。詳しくは [組織スコープ](#組織スコープ) を参照してください。`organizations:read` が必要です。 |

## レスポンス

`200 OK`。

```json
{
  "locked": true,
  "locked_until": "2026-10-20T10:00:00Z",
  "locks": [
    {"id": "lck_0a1b2c3d4e5f6g7h8j9k0m1n2p", "path": "password",
     "locked_at": "2026-10-20T09:45:00Z", "expires_at": "2026-10-20T10:00:00Z"}
  ],
  "failures": [
    {"path": "totp", "count": 3, "window_ends_at": "2026-10-20T09:55:00Z"}
  ],
  "last_sign_in": {"authenticated_at": "2026-10-19T18:12:04Z", "amr": ["pwd", "otp"], "country": "DE"}
}
```

| フィールド | 説明 |
|---|---|
| `locked` | 少なくとも1つのサインイン経路がロックされている場合に `true`。 |
| `locked_until` | 最後の未解除ロックが終わる時刻。ロックがない場合は `null`。 |
| `locks` | 未解除のロック。古いものから順に並び、経路（`password`、`totp`、`sms_2fa`、`email_2fa`、`otp`、`recovery_code`）ごとに最大1件です。 |
| `failures` | 最後の成功または最後のロック以降の、経路ごとの失敗試行回数。カウントウィンドウの実行中のみ表示されます。`window_ends_at` を過ぎるとカウントはリセットされます。パスワードのウィンドウは、環境の `brute_force.window_minutes` です。 |
| `last_sign_in` | 保持されているセッションの中で最も新しい成功した認証。`authenticated_at`（同じセッション内での再認証により更新されます）、認証方法（`amr`、RFC 8176）、セッションで最後に確認された国（不明な場合は `null`）を含みます。保持されているセッションがない場合は `null` です。ユーザーがサインインしたことがない、または最後のセッションが30日以上前に終了した場合が該当します。 |

## エラー

すべてのエラーは、安定した `code` を含む `application/problem+json` ボディで返されます。

| HTTP | `code` | 発生条件 |
|---|---|---|
| 404 | `not_found` | この環境にユーザーが存在しない（または ID の形式が不正）、または `org_id` を指定した場合にユーザーがその組織のメンバーでない。 |
| 401 | `unauthenticated` | API キーが見つからない、無効、または取り消されている。 |
| 403 | `insufficient_permissions` | キーに `users:read` 権限がない、または `org_id` を指定した場合にキーに `organizations:read` がない。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` に従ってください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できません。しばらくしてから再試行してください。 |

## 例

```bash
curl https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/sign-in-state \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

CLI: `keenauth users sign-in-state usr_0a1b2c3d4e5f6g7h8j9k0m1n2p`
