コンテンツにスキップ

SCIM 2.0

SCIM 2.0 ユーザープロビジョニング

Authrimは、自動化されたユーザーおよびグループプロビジョニングのためにSCIM 2.0(System for Cross-domain Identity Management)をサポートしています。

概要

  • 標準: RFC 7643(コアスキーマ), RFC 7644(プロトコル)
  • ステータス: 完全実装
  • ベースURL: /scim/v2

サポートされる機能

  • ユーザーCRUD操作(作成、読み取り、更新、削除)
  • グループCRUD操作
  • SCIMクエリ構文によるフィルタリング
  • startIndexcountによるページネーション
  • ETagによるリソースバージョニング
  • PATCH操作による部分更新
  • Enterprise User拡張
  • Bearerトークン認証

認証

すべてのSCIMリクエストにはBearerトークンが必要です:

Authorization: Bearer YOUR_SCIM_TOKEN

SCIMトークンの作成

  1. Admin UI > SCIMトークンに移動
  2. トークン作成をクリック
  3. 説明を入力(例:「Okta SCIM統合」)
  4. 有効期限を設定(例:365日)
  5. トークンをすぐにコピー(再表示されません)

APIリファレンス

ユーザー

ユーザー一覧取得

GET /scim/v2/Users

クエリパラメータ:

パラメータ説明
filterstringSCIMフィルター式userName eq "[email protected]"
sortBystringソート属性userName
sortOrderstringascendingまたはdescendingascending
startIndexinteger1ベースのページネーションインデックス1
countinteger結果数(最大1000)100

レスポンス:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 250,
"startIndex": 1,
"itemsPerPage": 100,
"Resources": [
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "user-123",
"userName": "[email protected]",
"name": {
"givenName": "John",
"familyName": "Doe"
},
"emails": [{"value": "[email protected]", "primary": true}],
"active": true,
"meta": {
"resourceType": "User",
"created": "2024-01-01T00:00:00Z",
"lastModified": "2024-01-02T00:00:00Z",
"location": "https://auth.example.com/scim/v2/Users/user-123",
"version": "W/\"1704153600000\""
}
}
]
}

ユーザー作成

POST /scim/v2/Users
Content-Type: application/json
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "[email protected]",
"name": {
"givenName": "John",
"familyName": "Doe"
},
"emails": [{"value": "[email protected]", "primary": true}],
"active": true
}

ユーザー更新(PATCH)

PATCH /scim/v2/Users/{id}
Content-Type: application/json
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{"op": "replace", "path": "name.givenName", "value": "Jane"},
{"op": "replace", "path": "active", "value": false}
]
}

サポートされる操作:

  • add - 新しい属性を追加
  • replace - 既存の属性を置換
  • remove - 属性を削除

ユーザー削除

DELETE /scim/v2/Users/{id}

グループ

グループ一覧取得

GET /scim/v2/Groups

グループ作成

POST /scim/v2/Groups
Content-Type: application/json
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"displayName": "Engineering",
"members": [
{"value": "user-123", "type": "User"}
]
}

フィルタリング

SCIMは標準化されたクエリ構文を使用した複雑なフィルタリングをサポートしています。

フィルター演算子

演算子説明
eq等しいuserName eq "[email protected]"
ne等しくないactive ne false
co含むuserName co "john"
swで始まるuserName sw "john"
ewで終わるuserName ew "example.com"
pr存在するphoneNumber pr
gtより大きいmeta.created gt "2024-01-01"
ltより小さいmeta.created lt "2024-12-31"

論理演算子

演算子説明
and論理ANDuserName eq "john" and active eq true
or論理ORuserName eq "john" or userName eq "jane"
not論理NOTnot (active eq false)

Terminal window
# メールでユーザーを検索
GET /scim/v2/Users?filter=userName eq "[email protected]"
# アクティブなユーザーを検索
GET /scim/v2/Users?filter=active eq true
# 複合フィルター
GET /scim/v2/Users?filter=(userName co "john" or userName co "jane") and active eq true

ページネーション

SCIMはstartIndexcountパラメータで1ベースのページネーションを使用します。

Terminal window
# 最初のページ(アイテム1-100)
GET /scim/v2/Users?startIndex=1&count=100
# 2番目のページ(アイテム101-200)
GET /scim/v2/Users?startIndex=101&count=100

リソースバージョニング(ETag)

SCIMは楽観的同時実行制御のためにETagをサポートしています:

# ETag付きでユーザーを取得
GET /scim/v2/Users/user-123
Response: ETag: W/"1704153600000"
# ETag付きで更新
PUT /scim/v2/Users/user-123
If-Match: W/"1704153600000"

エラーレスポンス

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "400",
"scimType": "invalidValue",
"detail": "userNameは必須です"
}
scimTypeHTTPステータス説明
invalidFilter400無効なフィルター構文
invalidValue400無効な属性値
uniqueness409リソースが既に存在
mutability400読み取り専用属性の変更試行
noTarget404リソースが見つからない
invalidVers412ETag不一致

統合ガイド

  1. Authrim Admin UIでSCIMトークンを生成
  2. Oktaアプリを設定:
    • SCIM Base URL: https://YOUR_DOMAIN/scim/v2
    • 認証: HTTPヘッダー
    • Authorization: Bearer YOUR_TOKEN
  3. プロビジョニングを有効化:
    • ユーザー作成
    • ユーザー属性更新
    • ユーザー無効化

属性マッピング

ユーザー属性

SCIM属性Authrimフィールド
ididstring(読み取り専用)
userNamepreferred_usernamestring(必須)
name.givenNamegiven_namestring
name.familyNamefamily_namestring
emails[primary].valueemailstring(必須)
phoneNumbers[primary].valuephone_numberstring
activeactiveboolean
localelocalestring
timezonezoneinfostring

ベストプラクティス

セキュリティ

  • トークンを定期的にローテーション(例:90日ごと)
  • 統合ごとに別々のトークンを使用
  • 監査ログでトークン使用状況を監視
  • すべてのSCIMリクエストにHTTPSを使用

パフォーマンス

  • フィルタリングを使用してレスポンスサイズを削減
  • 大きなデータセットにページネーションを実装
  • 不要な更新を避けるためにETagを使用

エラー処理

  • 指数バックオフでリトライロジックを実装
  • 429(レート制限)レスポンスを処理
  • トラブルシューティングのためにすべてのエラーをログ

レート制限

  • トークンごとに1分あたり100リクエスト
  • 超過時に429 Too Many Requestsレスポンス
  • Retry-Afterヘッダーが待機時間を示す

参考資料