SCIM プロビジョニングのシミュレーション
POST /v1/directories/{directory_id}:simulate · 権限 directories:write · 開発環境およびステージング環境のみ
ディレクトリの実際の SCIM エンドポイントに対して、SCIM シミュレーターのシナリオを 1 つ実行します。この実行のためだけに、KeenAuth は実際の SCIM トークンを発行して使用し、その後で取り消します。トークンの検証、レート制限、大量デプロビジョニングのサーキットブレーカー、プロビジョニングログは、ID プロバイダーの場合とまったく同様に動作します。ユーザーは固定されたフィクションのセットです。example.test の 5 つのグループに属する 25 名です。実在の個人データは含まれません。
シミュレーターは開発用ツールであり、ディレクトリを変更します。シミュレーターが書き込んだユーザーとグループは、ほかのプロビジョニング済みのレコードと同様にディレクトリに残ります。テスト用に作成したディレクトリを使用してください。
| シナリオ | 動作 |
|---|---|
seed |
25 名のユーザーと 5 つのグループを、そのメンバーシップとともに作成します。すでにこれらが存在するディレクトリでは、最初のユーザーで SCIM の 409 が返され、実行は failed になります。 |
bulk_deactivate |
ユーザーの 60%(25 名中 15 名)に active=false を送信します。サーキットブレーカーは、ディレクトリの mass_deprovision_guard.absolute_min が 15 以下の場合にのみ作動します。既定値の 25 の場合は作動しません。 |
group_churn |
あるユーザーを、あるグループから別のグループへ移動します。 |
attribute_update |
すべてのユーザーの表示名と姓を変更します。 |
conflict_email |
既存の userName を持つユーザーを作成し、SCIM の 409 uniqueness を期待します。 |
ディレクトリが空の場合、seed 以外のすべてのシナリオは、まず seed を実行します。
シミュレーション用のトークンは一覧に表示されず、有効なトークン 2 件の数にも含まれません。これを使用しても、ID プロバイダーのトークンのローテーションは開始されません。ディレクトリごとに同時に実行できるのは 1 回だけです。この実行は directory.simulation_started と directory.simulation_finished として監査されます。
リクエスト
| フィールド | 種類 | 必須 | 説明 |
|---|---|---|---|
directory_id |
パス | はい | SCIM ディレクトリ ID(dir_…)。 |
scenario |
ボディ、文字列 | はい | seed、bulk_deactivate、group_churn、attribute_update、conflict_email のいずれか。 |
Idempotency-Key |
ヘッダー | いいえ | 再試行されたリクエストに対して最初のレスポンスを再送します。シナリオは再実行されません。 |
{"scenario": "bulk_deactivate"}
レスポンス
実行結果を含む 200 OK。SCIM のエラー応答があっても、リクエストは失敗しません。その場合、実行は failed になり、failure が設定され、件数はエラーの前に成功した分のままになります。結果に含まれるのは件数と状態のみです。ユーザー、SCIM ID、トークンは含まれません。
{
"directory_id": "dir_01j9xm2n4p6q8r0s2t4v6w8y0z",
"scenario": "bulk_deactivate",
"status": "completed",
"users_created": 0,
"groups_created": 0,
"users_updated": 0,
"groups_updated": 0,
"users_deactivated": 15,
"conflicts": 0,
"circuit_breaker_tripped": true,
"deprovision_hold": {"id": "0191e9b2-6f3a-7c4d-8e5f-0a1b2c3d4e5f", "pending_count": 6},
"failure": null,
"started_at": "2026-10-28T09:31:00.123456Z",
"completed_at": "2026-10-28T09:31:01.654321Z"
}
| フィールド | 説明 |
|---|---|
status |
completed。エンドポイントが SCIM のエラーを返した、実行に時間がかかりすぎた、または応答がシナリオの期待と異なった場合は failed。 |
users_updated |
無効化以外のユーザーに対する PATCH。 |
users_deactivated |
エンドポイントが受け付けた active=false の PATCH。保留されたものを含みます。 |
conflicts |
期待どおりの 409 uniqueness 応答(conflict_email)。 |
circuit_breaker_tripped |
実行中に大量デプロビジョニングの保留が開かれた。 |
deprovision_hold |
実行後のディレクトリの未決定の保留。ない場合は null。deprovision-holds エンドポイントで承認または却下できます。 |
failure |
completed の場合は null。それ以外の場合は reason(scim_error、timeout、unexpected_response のいずれか)。scim_error の場合は scim_status(HTTP ステータス)と scim_type(SCIM の scimType、または null)も含まれます。 |
エラー
| HTTP | コード | 発生条件 |
|---|---|---|
| 400 | unknown_field |
ボディに scenario 以外のフィールドが含まれている。 |
| 403 | test_feature_not_in_production |
この環境は本番環境である。 |
| 404 | not_found |
この環境にディレクトリが存在しない。 |
| 409 | conflict |
このディレクトリで別の実行が進行中である、またはディレクトリが無効化されている、もしくは削除中である。 |
| 422 | validation_failed |
scenario が指定されていない、または不明である(/scenario)。 |
| 422 | idempotency_key_reuse |
Idempotency-Key が別のリクエストで使用された。 |
| 401 | unauthenticated |
認証情報がない、無効である、または取り消されている。 |
| 403 | insufficient_permissions |
認証情報に必要な権限がない。 |
| 429 | rate_limited |
レート制限を超えた。Retry-After の期間を待ってから再試行してください。 |
| 503 | service_unavailable |
ディレクトリ同期またはシミュレーターが一時的に利用できないか、このデプロイメントで未設定である。Retry-After の期間を待ってから再試行してください。 |
例
curl -X POST "https://api.eu.keenauth.com/v1/directories/dir_01j9xm2n4p6q8r0s2t4v6w8y0z:simulate" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"scenario": "seed"}'
keenauth directories simulate dir_01j9xm2n4p6q8r0s2t4v6w8y0z --scenario bulk_deactivate