ユーザープロビジョニング:API統合ガイド

Prev Next

DocuWareユーザープロビジョニングv3サービスは、SCIM 2.0準拠のREST APIです。Azure Entra ID、Okta、Ping Identity、またはオンプレミスディレクトリ(ユーザープロビジョニング用オンプレミスディレクトリコネクタツールを使用)などの外部IDプロバイダー(IdP)からDocuWareシステムへの自動ユーザープロビジョニングおよびグループ管理を可能にします。

ベースURLとエンドポイント

ベースURLの構造

DocuWare Cloud

https://{your-organization}.docuware.cloud/DocuWare/Services/UserProvisioningService/{externalIdp}/scim

DocuWareオンプレミス

http(s)://{your-server-address}/DocuWare/Services/UserProvisioningService/{externalIdp}/scim

{externalIdp}には以下の値を指定できます。

  • azure — Azure Entra ID用

  • okta — Okta用

  • ping — Ping Identity用

  • onpremise — オンプレミスディレクトリ用

  • generic-{identifier} — 汎用IDプロバイダー用

利用可能なエンドポイント

リソース

HTTPメソッド

エンドポイント

説明

ユーザー

GET

/{externalIdp}/scim/Users

userNameまたはexternalIdによるフィルタリングが可能な、すべての外部ユーザーの取得

GET

/{externalIdp}/scim/Users?allDocuWareUsers=true

userNameまたはexternalIdによるフィルタリングが可能な、すべてのユーザーの取得

GET

/{externalIdp}/scim/Users/{id}

IDによる特定ユーザーの取得

POST

/{externalIdp}/scim/Users

新規ユーザーの作成

PUT

/{externalIdp}/scim/Users/{id}

ユーザーの完全な置換

PATCH

/{externalIdp}/scim/Users/{id}

ユーザーの部分更新

DELETE

/{externalIdp}/scim/Users/{id}

ユーザーの削除

グループ

GET

/{externalIdp}/scim/Groups

displayNameによるフィルタリングが可能な、すべてのグループの取得

GET

/{externalIdp}/scim/Groups/{id}

IDによる特定グループの取得

POST

/{externalIdp}/scim/Groups

新規グループの作成

PUT

/{externalIdp}/scim/Groups/{id}

グループの完全な置換

PATCH

/{externalIdp}/scim/Groups/{id}

グループの部分更新

DELETE

/{externalIdp}/scim/Groups/{id}

グループの削除

スキーマ

GET

/{externalIdp}/scim/Schemas

SCIMスキーマの取得

リソースタイプ

GET

/{externalIdp}/scim/ResourceTypes

サポートされるリソースタイプの取得

ヘルスチェック

GET

/AvailabilityCheck

サービスの可用性チェック

認証

JWT Bearer認証

すべてのエンドポイント(ヘルスチェックを除く)では、JWT Bearerトークン認証が必要です。

Authorization: Bearer {jwt-token}

Content Type

すべてのリクエストでSCIMコンテンツタイプを使用する必要があります。

Content-Type: application/scim+json

ユーザー管理

ユーザースキーマ(Core2EnterpriseUser)

ユーザーの取得(GET)

GET Usersエンドポイントは、オプションのフィルタリングとページネーションを使用してユーザーデータを取得する複数のバリエーションをサポートしています。デフォルトでは、外部IDを持つユーザー(外部IDプロバイダーからのユーザー)のみが返されます。

1. すべての外部ユーザーの取得(デフォルト)

GET /{externalIdp}/scim/Users
Authorization: Bearer {token}

externalIdを持つすべてのユーザー(外部IDプロバイダーからのユーザー)を返します。

レスポンス:

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],

  "totalResults": 2,

  "itemsPerPage": 2,

  "startIndex": 1,

  "resources": [

    {

      "userName": "john.doe",

      "active": true,

      "emails": [

        {

          "value": "john.doe@example.com",

          "primary": true

        }

      ],

      "name": {

        "givenName": "John",

        "familyName": "Doe"

      },

      "id": "external-user-id-123",

      "meta": {

        "resourceType": "User"

      },

      "schemas": [

        "urn:ietf:params:scim:schemas:core:2.0:User",

        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

      ],

    },

    {

      "userName": "jane.smith",

      "active": true,

      "emails": [

        {

          "value": "jane.smith@example.com",

          "primary": true

        }

      ],

      "name": {

        "givenName": "Jane",

        "familyName": "Smith"

      },

      "id": "external-user-id-456",

      "meta": {

        "resourceType": "User"

      },

      "schemas": [

        "urn:ietf:params:scim:schemas:core:2.0:User",

        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

      ]

    }

  ]

}

2. すべてのDocuWareユーザーの取得

GET /{externalIdp}/scim/Users?allDocuWareUsers=true
Authorization: Bearer {token}

外部ユーザーと内部DocuWareユーザーの両方を含む、DocuWareシステム内のすべてのユーザーを返します。

注意:内部ユーザーにはIDがありません

内部ユーザーはレスポンスにidを持ちません。これは、内部ユーザーが外部ユーザーではなく、idとして返されるexternalId属性が設定されていないためです。

レスポンス

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],

  "totalResults": 2,

  "itemsPerPage": 2,

  "startIndex": 1,

  "resources": [

    {

      "userName": "john.doe",

      "active": true,

      "emails": [

        {

          "value": "john.doe@example.com",

          "primary": true

        }

      ],

      "name": {

        "givenName": "John",

        "familyName": "Doe"

      },

      "id": "external-user-id-123",

      "meta": {

        "resourceType": "User"

      },

      "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User",

        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],

    },

    {

      "userName": "jane.smith",

      "active": true,

      "emails": [

        {

          "value": "jane.smith@example.com",

          "primary": true

        }

      ],

      "name": {

        "givenName": "Jane",

        "familyName": "Smith"

      },

      "meta": {

        "resourceType": "User"

      },

      "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User",

        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"]

    }

  ]

}

3. IDによる特定ユーザーの取得

GET /{externalIdp}/scim/Users/{externalId}

Authorization: Bearer {token}

外部IDによる特定ユーザーを返します。

レスポンス:

{

  "userName": "john.doe",

  "active": true,

  "emails": [

    {

      "value": "john.doe@example.com",

      "primary": true

    }

  ],

  "name": {

    "givenName": "John",

    "familyName": "Doe"

  },

  "id": "external-user-id-123",

  "meta": {

    "resourceType": "User"

  },

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User",

    "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],

}

4. フィルタリングによるユーザーのクエリ

ユーザー名によるフィルタリング(外部ユーザー内):

GET /{externalIdp}/scim/Users?filter=userName eq "john.doe"

Authorization: Bearer {token}

すべてのDocuWareユーザーでのユーザー名によるフィルタリング:

GET /{externalIdp}/scim/Users?allDocuWareUsers=true&filter=userName eq "john.doe"

Authorization: Bearer {token}

外部IDによるフィルタリング:

GET /{externalIdp}/scim/Users?filter=externalId eq "external-user-id-123"

Authorization: Bearer {token}

ページネーションによるユーザーの取得:

GET /{externalIdp}/scim/Users?startIndex=2&count=5

Authorization: Bearer {token}
GET /{externalIdp}/scim/Users?allDocuWareUsers=true&startIndex=2&count=5

Authorization: Bearer {token}

サポートされるクエリパラメーター

ページネーション:

  • startIndex — 最初の結果の1ベースインデックス(デフォルト:1、最小値:1)

  • count — ページあたりの結果数(未指定の場合はすべての結果がデフォルト、最小値:0)

フィルタリング:

  • filter — SCIMフィルター式(userName eq "value"およびexternalId eq "value"のみサポート)(大文字小文字を区別しない)

レスポンス形式

すべてのGET /Usersリクエストは、以下の構造のSCIM ListResponseを返します。

プロパティ:

  • schemas — "urn:ietf:params:scim:api:messages:2.0:ListResponse"を含む配列

  • totalResults — 一致するユーザーの合計数

  • itemsPerPage — 現在のレスポンスで返されるユーザー数

  • startIndex — 現在のページの開始インデックス(1ベース)

  • Resources — ユーザーオブジェクトの配列

エラーレスポンス

400 Bad Request — 無効なフィルター:

{

  "ScimType": "invalidFilter",

  "Detail": "Unsupported filter attribute: FirstName",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}
{

  "ScimType": "invalidFilter",

  "Detail": "Unsupported comparison operator: 'ne'",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

すべてのGET /Users/{externalId}リクエストは、以下の構造のUserオブジェクトを返します。

Userオブジェクトのプロパティ:

  • id — ユーザーの外部ID

  • userName — ユーザーのログイン名(汎用IdP以外ではメールアドレスの場合ドメインを除く)

  • active — ユーザーの有効ステータス(ブール値)

  • emails — value、primaryプロパティを持つメールオブジェクトの配列

  • name — givenNameとfamilyNameプロパティを持つオブジェクト

  • meta — resourceType: "User"を持つメタデータオブジェクト

  • schemas — SCIMスキーマ識別子の配列

エラーレスポンス

404 Not Found — ユーザーが見つかりません:

{

  "Detail": "User with External ID 'external-user-id-404' was not found.",

  "Status": 404,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

最初の5人の外部ユーザーを取得:

GET /{externalIdp}/scim/Users?startIndex=1&count=5

指定位置からの外部ユーザーの取得:

GET /{externalIdp}/scim/Users?startIndex=10&count=20

ユーザー名によるユーザーの検索:

GET /{externalIdp}/scim/Users?filter=userName eq "john.doe"

すべてのDocuWareユーザーからユーザー名で検索:

GET /{externalIdp}/scim/Users?allDocuWareUsers=true&filter=userName eq "jane.smith"

externalIdによるユーザーの検索:

GET /{externalIdp}/scim/Users?filter=externalId eq "external-user-id-123"

ページネーション付きですべてのDocuWareユーザーを取得:

GET /{externalIdp}/scim/Users?allDocuWareUsers=true&startIndex=1&count=50

ユーザーの作成(POST)

ユーザー作成の仕組み

システムは、以下の手順に従ったインテリジェントなユーザー作成・更新ロジックを実装しています。

  1. 外部IDによるユーザー検索:まず、指定されたexternalIdで既存ユーザーの検索を試みます。見つかった場合は完全一致とみなされ、リクエストの属性で既存ユーザーが更新されます。

  2. ユーザー名によるフォールバック検索:外部IDでユーザーが見つからない場合、userNameフィールドから抽出されたユーザー名で検索します。見つかり、かつ受信メールが既存ユーザーのメールと一致する場合は完全一致とみなされ、リクエストの属性で既存ユーザーが更新されます。メールが一致しない場合、指定されたuserNameを持つユーザーが既に存在するため、新規ユーザーの作成は失敗します(409 Conflictが返されます)。

ユーザー作成と更新のロジック:

  • 新規ユーザーexternalIDまたはuserNameで既存ユーザーが見つからない場合、新規ユーザーを作成します。

  • ユーザー更新externalIdまたはuserName+メールで既存ユーザーが見つかり一致した場合、ユーザー情報を更新します。

  • メール検証userNameで検索する場合、既存ユーザーのメールと指定されたメールの一致を検証します(大文字小文字を区別しない)。メールが一致しない場合、競合を防ぐために例外がスローされます。

メールアドレス解決サービスに関する注意

サービスは以下の優先順位でユーザーのメールアドレスを決定します。

  1. プライマリメール:emails配列でprimary: trueとマークされたメールを使用します。

  2. 最初の有効なメール:プライマリメールが存在しない場合、emails配列から最初の有効なメールを選択します。

  3. 検証:上記のいずれも有効なメールアドレスでない場合、リクエストは400 Bad Requestで失敗します。

リクエスト

POST /{externalIdp}/scim/Users

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],

  "userName": "john.doe@example.com",

  "externalId": "external-user-id-123",

  "active": true,

  "name": {

    "givenName": "John",

    "familyName": "Doe"

  },

  "emails": [

    {

      "value": "john.doe@example.com",

      "primary": true

    }

  ]

}

必須フィールドとオプションフィールド

必須フィールド:

  • schemas — SCIMスキーマ識別子(CoreとEnterprise Userの両方のスキーマを含む必要あり)

  • userName — ユーザーのログイン名(一意である必要あり)

  • externalId — 外部IDプロバイダーのユーザーID(一意である必要あり)

  • active — ユーザーの有効ステータス

  • emails — メールアドレスの配列

オプションフィールド:

  • name — ユーザーの表示名オブジェクト

    • name.givenName — 名

    • name.familyName — 姓

フィールド検証ルール:

  • UserName:必須、大文字小文字を区別、空または空白のみは不可

  • ExternalId:必須、大文字小文字を区別、空または空白のみは不可

  • Emails:少なくとも1つの有効なメールが解決可能である必要あり(複数の場合はメールアドレス解決ルールが適用)

  • Active:ブール値

  • Nameフィールド:表示用のオプション文字列

レスポンス

成功(200 OK):

{

  "userName": "john.doe",

  "active": true,

  "emails": [

    {

      "value": "john.doe@example.com",

      "primary": true

    }

  ],

  "name": {

    "givenName": "John",

    "familyName": "Doe"

  },

  "id": "external-user-id-123",

  "meta": {

    "resourceType": "User"

  },

  "schemas": [

      "urn:ietf:params:scim:schemas:core:2.0:User",

      "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

  ]

}

エラーレスポンス

400 Bad Request — 必須フィールドの欠落:

{

  "ScimType": "invalidValue",

  "Detail": "Validation failed: UserName: is required",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

409 Conflict — ユーザーが既に存在:

{

  "ScimType": "uniqueness",

  "Detail": "User with username 'john.doe' already exists with different email address!",

  "Status": 409,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

ユーザーの更新(PUT)— ユーザーの完全置換

PUT操作は、ユーザーリソースの完全な置換を行います。指定されたフィールドのみを更新するPATCHとは異なり、PUTは指定されたデータでユーザーオブジェクト全体を置換します。

基本的なPUTリクエスト

PUT /{externalIdp}/scim/Users/{externalId}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "userName": "john.doe",

  "externalId": "external-user-id-123",

  "active": true,

  "emails": [

    {

      "value": "john.doe@example.com",

      "primary": true

    }

  ],

  "name": {

    "givenName": "John",

    "familyName": "Doe"

  },

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"]

}

パラメーター

  • {externalIdp} — 外部IDプロバイダー識別子(azure、okta、ping、onpremiseなど)

  • {externalId} — 更新するユーザーの外部ID

PUTの必須フィールド

ユーザー作成に必須のすべてのフィールドを指定する必要があります。

  • userName — ユーザーのログイン名

  • externalId — 外部IDプロバイダーのユーザーID

  • active — ユーザーの有効ステータス(ブール値、未指定の場合はfalseがデフォルト)

  • emails — メールアドレスの配列(メールアドレス解決を参照)

  • schemas — SCIMスキーマ識別子(CoreとEnterprise Userの両方のスキーマを含む必要あり)

オプションフィールド(新しい値が指定されない場合、既存の値が保持されます)

  • name — ユーザーの表示名オブジェクト

    • name.givenName — 名

    • name.familyName — 姓

完全なPUTの例

PUT /azure/scim/Users/external-user-id-123

Content-Type: application/scim+json

Authorization: Bearer {jwt-token}

{

  "userName": "john.smith",

  "externalId": "external-user-id-123",

  "active": false,

  "name": {

    "givenName": "John",

    "familyName": "Smith"

  },

  "emails": [

    {

      "value": "john.smith@example.com",

      "primary": true

    }

  ],

  "schemas": [

    "urn:ietf:params:scim:schemas:core:2.0:User",

    "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

  ]

}

レスポンス

成功(200 OK):

{

  "userName": "john.smith",

  "active": false,

  "emails": [

    {

      "value": "john.smith@example.com",

      "primary": true

    }

  ],

  "name": {

    "givenName": "John",

    "familyName": "Smith"

  },

  "id": "external-user-id-123",

  "meta": {

    "resourceType": "User"

  },

  "schemas": [

    "urn:ietf:params:scim:schemas:core:2.0:User",

    "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

  ]

}

エラーレスポンス

400 Bad Request — 必須フィールドの欠落

{

  "ScimType": "invalidValue",

  "Detail": "Validation failed: UserName: is required",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

404 Not Found — ユーザーが見つかりません:

{

  "Detail": "User with External ID 'external-user-id-404' was not found.",

  "Status": 404,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

409 Conflict — ユーザー名の重複:

{

    "ScimType": "uniqueness",

    "Detail": "User with username 'john.doe' already exists!",

    "Status": 409,

    "Schemas": [

        "urn:ietf:params:scim:api:messages:2.0:Error"

    ]

}

409 Conflict — ExternalIdの重複:

{

  "ScimType": "uniqueness",

  "Detail": "User with External ID 'external-user-id-409' already exists!",

  "Status": 409,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

409 Conflict — リソースのロック:

{

  "ScimType": "mutability",

  "Detail": "The resource with ID 'external-user-id-409' is immutable.",

  "Status": 409,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

PUTの検証ルール

POST操作のすべての検証ルールがPUT操作にも適用されます。

  • UserName:必須、大文字小文字を区別、空または空白のみは不可

  • ExternalId:必須、大文字小文字を区別、空または空白のみは不可

  • Active:ブール値(未指定の場合はfalseがデフォルト)

  • Emails:少なくとも1つの有効なメールが解決可能である必要あり(複数の場合はメールアドレス解決ルールが適用)

  • Nameフィールド:オプションだが、ユーザーエクスペリエンスのために推奨

  • Schemas:CoreとEnterprise Userの両方のスキーマを含む必要あり

ユーザーのパッチ(PATCH)操作ガイド

PATCH操作では、SCIM 2.0パッチ操作を使用してユーザー属性の部分更新が可能です。サービスは、ユーザー更新のためのreplaceおよびadd操作をサポートしています。

基本的なPATCH構造:

PATCH /{externalIdp}/scim/Users/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "replace",

      "path": "attribute_path",

      "value": "new_value"

    },

    {

      "op": "add",

      "path": "attribute_path",

      "value": "new_value"

    }

  ]

}

サポートされる操作

  • replace — 既存の属性値を更新

  • add — 空または既存の属性値を更新

  • remove — ユーザー操作ではサポートされません

サポートされる属性パス

ユーザーの有効ステータス:

{
  "op": "replace",
  "path": "active",
  "value": "false"
}

ユーザー名の更新:

{
  "op": "replace",
  "path": "userName", 
  "value": "new.username"
}

Nameフィールド:

{
  "op": "replace",
  "path": "name.givenName",
  "value": "NewFirstName"
}
{

  "op": "replace",

  "path": "name.familyName", 

  "value": "NewLastName"

}

メールアドレス:

{
  "op": "replace",
  "path": "emails",
  "value": "new.email@example.com"
}
{
  "op": "replace",
  "path": "emails[primary eq true].value",
  "value": "new.email@example.com"
}

注意:

  • emailsパスの両方の構文が有効です

  • メールアドレスは有効なメール形式である必要があります

外部ID

{
  "op": "replace",
  "path": "externalId",
  "value": "new-external-id-456"
}

複数操作の例:

PATCH /{externalIdp}/scim/Users/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "replace",

      "path": "active",

      "value": "false"

    },

    {

      "op": "replace", 

      "path": "name.givenName",

      "value": "Jonathan"

    },

    {

      "op": "replace",

      "path": "name.familyName",

      "value": "Smith"

    },

    {

      "op": "replace",

      "path": "emails",

      "value": "jonathan.smith@example.com"

    }

  ]

}

重要な注意事項:

  • すべての操作は順番に処理されます

  • remove操作はサポートされておらず、エラーが返されます

  • メール関連フィールドにはメール検証が実行されます

  • active フィールドにはブール文字列値("true"または"false")が必要です

  • 無効な属性パスは400 Bad Requestエラーになります

  • externalIdまたはuserNameが別のユーザーによって既に使用されている場合、競合エラーになります

エラー処理:

  • 400 Bad Request:無効な操作タイプ、サポートされないパス、または検証エラー

  • 404 Not Found:指定されたIDのユーザーが見つかりません

  • 409 Conflict:更新が競合を引き起こす場合(例:ユーザー名やexternalIdの重複)

PATCH操作でサポートされるユーザー属性

  • userName — ユーザーのログイン名

  • externalId — 外部IDプロバイダーのユーザーID

  • name.givenName — 名

  • name.familyName — 姓

  • active — ユーザーの有効ステータス(true/false)

  • emails/emails[].value — メールアドレス

ユーザーの削除(DELETE)

DELETE操作は、DocuWareシステムからユーザーをソフトデリートします。この操作はユーザーを無効化します。

基本的なDELETEリクエスト

DELETE /{externalIdp}/scim/Users/{externalId}

Authorization: Bearer {token}

パラメーター:

  • {externalIdp} — 外部IDプロバイダー識別子(azure、okta、pingなど)

  • {externalId} — 削除するユーザーの外部ID

リクエスト例

DELETE /azure/scim/Users/external-user-id-123

Authorization: Bearer {jwt-token}

レスポンス

成功(204 No Content):

HTTP/1.1 204 No Content
Content-Type: application/scim+json

DELETE操作は、成功時にHTTP 204(No Content)と空のレスポンスボディを返します。

エラーレスポンス

404 Not Found — ユーザーが見つかりません:

{

  "Detail": "User with External ID 'ExternalUser112' was not found.",

  "Status": 404,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

409 Conflict — ユーザーが現在ロックされており削除できません:

{

  "ScimType": "mutability",

  "Detail": "The resource 'ExternalUser11' with ID 'ExternalUser11' is immutable.",

  "Status": 409,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

削除の代替方法:ユーザーを削除する代わりに、PATCHまたはPUT操作で無効化する方法もあります。

PATCH /{externalIdp}/scim/Users/{externalId}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "replace",

      "path": "active",

      "value": "false"

    }

  ]

}

グループ管理

グループスキーマ(Core2Group)

グループ作成の仕組み

システムは、以下の手順に従ったインテリジェントなグループ作成・更新ロジックを実装しています。

  1. DisplayNameによるグループ検索:
    まず、指定されたdisplayNameで既存グループの検索を試みます。見つかった場合はグループ更新として処理され、見つからない場合はグループ作成として処理されます。

  2. グループ作成と更新のロジック:

    • 新規グループ:displayNameで既存グループが見つからない場合、指定されたメンバーで新規グループを作成します。

    • グループ更新:既存グループが見つかった場合、グループ情報を更新し、既存のメンバーシップに新しいメンバーを追加します(既存メンバーは置換されません)。

    • メンバー追加:新しいメンバーは、現在のメンバーを削除せずに既存グループに追加されます。

    • 重複防止:システムはグループへの重複メンバーの追加を防止します。

グループ作成に関する重要な注意事項:

  • 表示名の一意性:グループはdisplayNameで識別されます。

  • メンバーの解決:すべてのメンバー参照(valueフィールド)は、既存ユーザーの有効なexternalId値である必要があります。

  • 増分メンバーシップ:既存グループに対するPOST操作は、メンバーシップ全体を置換するのではなく、メンバーを増分的に追加します。

  • メンバー検証:システムは存在するメンバーのみを追加します。指定されたvalue(externalId)のメンバーが存在しない場合、エラーなくスキップされます。

  • 外部IDプロバイダーのスコープ:現在のexternalIdpのユーザーで構成されるグループの部分のみを管理できます。他の外部IDプロバイダーのユーザーや内部DocuWareユーザーは、これらの操作の影響を受けません。

  • レスポンス:レスポンスには、指定されたexternalIdp(azure、okta、ping、onpremise、またはgenericなど)でプロビジョニングされた外部ユーザーであるグループメンバーのみが含まれます。内部ユーザーや他の外部IDプロバイダーで作成されたユーザーはレスポンスから除外されます。

メンバー参照の形式:

  • メンバーはexternalIdで参照されます(内部DocuWareユーザーIDではありません)

  • 各メンバーオブジェクトには、ユーザーの外部IDを含むvalueフィールドが必要です

  • オプションのdisplayフィールド(ユーザーのuserName)を指定できますが、メンバーシップの割り当てには必須ではありません

グループの作成(POST)


POST /{externalIdp}/scim/Groups

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

  "displayName": "Engineering Team",

  "members": [

    {

      "value": "external-user-id-123"

    },

    {

      "value": "external-user-id-456"

    }

  ]

}

レスポンス



{

  "displayName": "Engineering Team",

  "members": [

    {

      "value": "external-user-id-123",

      "display": "john.doe"

    },

    {

      "value": "external-user-id-456",

      "display": "jane.smith"

    }

  ],

  "id": "12345678-1234-1234-1234-123456789012",

  "meta": {

    "resourceType": "Group"

  },

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"]

}

空のグループの作成:

POST /{externalIdp}/scim/Groups

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

  "displayName": "Future Project Team",

  "members": []

}

必須フィールド:

  • schemas — SCIMスキーマ識別子("urn:ietf:params:scim:schemas:core:2.0:Group"を含む必要あり)

  • displayName — グループの表示名(識別に使用)

  • members — メンバーオブジェクトの配列(グループ作成時は空でも可)

    • members[].value — ユーザーの外部ID(メンバーを指定する場合は必須)

エラーレスポンス

400 Bad Request — 必須フィールドの欠落:

{

  "ScimType": "invalidValue",

  "Detail": "Validation failed: DisplayName: is required",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}
{

  "ScimType": "invalidValue",

  "Detail": "Validation failed: Members: The Members field is required.",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}
{

  "ScimType": "invalidValue",

  "Detail": "Validation failed: Members[0].Value: Member Value is required.",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

グループの取得(GET)

GET Groupsエンドポイントは、オプションのフィルタリングとページネーションを使用してグループデータを取得する複数のバリエーションをサポートしています。グループには、指定された外部IDプロバイダーからの外部ユーザーであるメンバーが含まれます。

1. すべてのグループの取得(デフォルト)

GET /{externalIdp}/scim/Groups
Authorization: Bearer {token}

DocuWareに存在するすべてのグループをメンバーなしで返します。メンバーはGETリクエスト /Groups/{groupId} で照会できます。

レスポンス:

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],

  "totalResults": 2,

  "itemsPerPage": 2,

  "startIndex": 1,

  "resources": [

    {

      "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

      "id": "group-id-123",

      "displayName": "Engineering Team",

      "meta": {

        "resourceType": "Group"

      }

    },

    {

      "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

      "id": "group-id-456",

      "displayName": "Marketing Team",

      "meta": {

        "resourceType": "Group",

      }

    }

  ]

}

2. IDによる特定グループの取得

GET /{externalIdp}/scim/Groups/{groupId}

Authorization: Bearer {token}

グループIDを使用して特定グループの詳細を取得します。members属性には、指定されたIDプロバイダーでプロビジョニングされた外部ユーザーのみが含まれます。

レスポンス:

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

  "displayName": "Engineering Team",

  "members": [

    {

      "value": "external-user-id-123",

      "display": "john.doe",

    },

    {

      "value": "external-user-id-456",

      "display": "jane.smith",

    }

  ],

  "id": "group-external-id-123",

  "meta": {

    "resourceType": "Group"

  }

}

3. フィルタリングによるグループのクエリ

表示名によるフィルタリング:

GET /{externalIdp}/scim/Groups?filter=displayName eq "Engineering Team"

Authorization: Bearer {token}

ページネーション付きグループの取得:

GET /{externalIdp}/scim/Groups?startIndex=1&count=10

Authorization: Bearer {token}
GET /{externalIdp}/scim/Groups?startIndex=2&count=5

Authorization: Bearer {token}

サポートされるクエリパラメーター

フィルタリング:

  • filter — SCIMフィルター式(displayName eq "value"のみサポート)(大文字小文字を区別しない、完全一致)

ページネーション:

  • startIndex — 最初の結果の1ベースインデックス(デフォルト:1、最小値:1)

  • count — ページあたりの結果数(未指定の場合はすべての結果がデフォルト、最小値:0)

レスポンス形式

すべてのGET /Groupsリクエストは、以下の構造のSCIM ListResponseを返します。

ListResponseプロパティ:

  • schemas"urn:ietf:params:scim:api:messages:2.0:ListResponse"を含む配列

  • totalResults — 一致するグループの合計数

  • itemsPerPage — 現在のレスポンスで返されるグループ数

  • startIndex — 現在のページの開始インデックス(1ベース)

  • resources — グループオブジェクトの配列(members属性はグループIDで取得した場合のみ利用可能)

グループオブジェクトのプロパティ:

  • id — グループの外部ID

  • displayName — グループの表示名

  • members — メンバーオブジェクトの配列(指定されたexternalIdpからの外部ユーザーのみ)

    • value — メンバーの外部ユーザーID

    • display — メンバーのユーザー名

  • meta — オブジェクトのリソースタイプ

  • schemas — SCIMスキーマ識別子を含む配列

グループレスポンスに関する注意

メンバーフィルタリング:

  • 指定された{externalIdp}で管理される外部ユーザーであるメンバーのみがレスポンスに含まれます

  • 内部DocuWareユーザーおよび他の外部IDプロバイダーからのユーザーは除外されます

  • 空のグループ(該当メンバーなし)も、存在する場合は結果に表示されることがあります

グループの識別:

  • GET操作では、グループはIDで識別されます

  • displayNameは、フィルタリングおよび作成・更新時のグループ検索に使用されます

エラーレスポンス

400 Bad Request — 無効なフィルター:

不正な属性によるフィルタリング:

{

  "ScimType": "invalidFilter",

  "Detail": "Unsupported filter attribute: id",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

無効な式によるフィルタリング(有効な形式は filter=displayName eq "groupName" のみ):

{

  "ScimType": "invalidFilter",

  "Detail": "Invalid filter expression: 'displasyname asd \"engineering team\"'",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

サポートされない比較演算子によるフィルタリング:

{

  "ScimType": "invalidFilter",

  "Detail": "Unsupported comparison operator: 'ne'",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

404 Not Found — グループが見つかりません:

{

  "Detail": "Group with identifier 'group-id-404' was not found.",

  "Status": 404,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

グループメンバーシップの更新(PATCH)

PATCH操作では、SCIM 2.0パッチ操作を使用してグループ属性の部分更新が可能です。サービスは、グループ管理のためのadd、removeおよびreplace(グループのdisplayNameのみ)操作をサポートしています。

基本的なPATCH構造

PATCH /{externalIdp}/scim/Groups/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "operation_type",

      "path": "attribute_path",

      "value": "new_value_or_array"

    }

  ]

}

サポートされる操作

メンバーの追加(add):既存メンバーを削除せずに、新しいメンバーをグループに追加します。

vPATCH /{externalIdp}/scim/Groups/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "add",

      "path": "members",

      "value": [

        {

          "value": "external-user-id-789"

        },

        {

          "value": "external-user-id-101"

        }

      ]

    }

  ]

}

特定メンバーの削除(remove):指定されたメンバーをグループから削除します。

PATCH /{externalIdp}/scim/Groups/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "remove",

      "path": "members",

      "value": [

        {

          "value": "external-user-id-123"

        },

        {

          "value": "external-user-id-456"

        }

      ]

    }

  ]

}

すべてのメンバーの削除(remove):指定されたexternalIdpで作成されたすべてのメンバーをグループから削除します(グループを空にします)。

PATCH /{externalIdp}/scim/Groups/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "remove",

      "path": "members"

    }

  ]

}

remove操作でvalueが指定されない場合、すべての外部メンバー(指定されたexternalIdpからのメンバー)がグループから削除されます。

  1. グループ表示名の置換(replaceグループの表示名を更新します。

PATCH /{externalIdp}/scim/Groups/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "replace",

      "path": "displayName",

      "value": "Updated Team Name"

    }

  ]

}

サポートされる属性パス

パス

操作

説明

値の形式

displayName

replace, add

グループの表示名

文字列

members

add, remove

グループメンバーシップ

メンバーオブジェクトの配列

単一リクエストでの複数操作

単一のPATCHリクエストで複数の操作を組み合わせることができます。

PATCH /{externalIdp}/scim/Groups/{id}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],

  "Operations": [

    {

      "op": "replace",

      "path": "displayName",

      "value": "DevOps Engineering Team"

    },

    {

      "op": "add",

      "path": "members",

      "value": [

        {

          "value": "external-user-id-new1"

        }

      ]

    },

    {

      "op": "remove",

      "path": "members",

      "value": [

        {

          "value": "external-user-id-old1"

        }

      ]

    }

  ]

}

メンバーオブジェクトの形式

操作でメンバーを指定する場合は、以下の形式を使用してください。

必須フィールド:

  • value — 追加・削除するユーザーの外部ID

メンバーオブジェクトの例:

{
  "value": "external-user-id-123"
}

操作の動作詳細

Add操作:

  • 指定されたメンバーをグループに追加します

  • 既にグループに存在するメンバーは無視されます(重複なし)

  • 存在しないユーザーの外部IDはサイレントに無視されます

  • 既存メンバーに影響しません

Remove操作:

  • value指定あり:指定されたメンバーのみを削除します(指定されたexternalIdpで作成されたユーザーの場合)

  • value指定なし:すべてのメンバー(指定されたexternalIdpで作成されたユーザー)をグループから削除します

  • 現在のメンバーでない外部IDは無視されます

  • 指定されていないメンバーに影響しません

Replace操作:

  • displayNameの場合:グループ名を更新します

レスポンス

  • 成功時のPATCHレスポンス(204 No Content)

  • 400 Bad Request — 無効な操作

  • 400 Bad Request — 無効なパス

  • 400 Bad Request — 無効なメンバー形式

  • 404 Not Found — グループが見つかりません

  • 409 Conflict — グループ名が既に存在

PATCH操作に関する重要な注意事項

操作処理:

  • 操作は記述順に順番に処理されます

メンバー検証:

  • ユーザーの外部IDは既存ユーザーを参照する必要があります

  • 無効な外部IDはサイレントに無視されます(エラーはスローされません)

  • 同じIDプロバイダー(externalIdp)からの外部ユーザーのみが管理されます

グループの状態:

  • レスポンスには、指定された{externalIdp}からの外部ユーザーのみが含まれます

  • 内部DocuWareユーザーおよび他のIDプロバイダーからのユーザーはレスポンスから除外されます

  • 空のグループは有効であり、レスポンスに含まれます

グループの更新(PUT)— グループの完全置換

PUT操作は、externalIdpによって提供されるグループ部分の完全な置換を行います。指定されたフィールドのみを更新するPATCHとは異なり、PUTは指定されたデータでグループオブジェクト全体を置換します。

基本的なPUTリクエスト

PUT /{externalIdp}/scim/Groups/{groupId}

Content-Type: application/scim+json

Authorization: Bearer {token}

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

  "displayName": "Updated Engineering Team",

  "members": [

    {

      "value": "external-user-id-123"

    },

    {

      "value": "external-user-id-456"

    }

  ]

}

パラメーター

  • {externalIdp} — 外部IDプロバイダー識別子(azure、okta、pingなど)

  • {groupId} — 更新するグループのID

PUTの必須フィールド

グループ作成に必須のすべてのフィールドを指定する必要があります。

  • schemas — SCIMスキーマ識別子("urn:ietf:params:scim:schemas:core:2.0:Group"を含む必要あり)

  • displayName — グループの表示名

  • members — メンバーオブジェクトの配列(空でも可)

完全なPUTの例

PUT /azure/scim/Groups/group-id-123

Content-Type: application/scim+json

Authorization: Bearer {jwt-token}

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

  "displayName": "DevOps Engineering Team",

  "members": [

    {

      "value": "external-user-id-789"

    },

    {

      "value": "external-user-id-101"

    }

  ]

}

レスポンス

成功(200 OK):

{

  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],

  "id": "group-id-123",

  "displayName": "DevOps Engineering Team",

  "members": [

    {

      "value": "external-user-id-789",

      "display": "john.doe",

    },

    {

      "value": "external-user-id-101",

      "display": "jane.smith",

    }

  ],

  "meta": {

    "resourceType": "Group"

  }

}

PUTの動作に関する重要な注意事項

  1. メンバーの完全置換:PUTは、現在のexternalIdpが管理するメンバーリスト全体を置換します。リクエストに含まれていないメンバーはグループから削除されます。

  2. 表示名の更新:PUT操作でグループの表示名を変更できます。

  3. メンバー検証:指定されたすべてのメンバーの外部IDは、既存ユーザーを参照する必要があります。無効な外部IDはサイレントにスキップされます。

  4. 外部IDプロバイダーのスコープ:この操作では、指定された{externalIdp}からの外部ユーザーであるメンバーのみが管理されます。内部DocuWareユーザーおよび他のIDプロバイダーからのユーザーは影響を受けません。

  5. グループの識別:グループはURLの{groupId}パラメーターで識別されます。

エラーレスポンス

400 Bad Request — 必須フィールドの欠落:

{

  "ScimType": "invalidValue",

  "Detail": "Validation failed: DisplayName: is required",

  "Status": 400,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

404 Not Found — グループが見つかりません:

{

  "Detail": "Group with identifier 'group-id-404' was not found.",

  "Status": 404,

  "Schemas": [

      "urn:ietf:params:scim:api:messages:2.0:Error"

  ]

}

PUTの検証ルール

POST操作のすべての検証ルールがPUT操作にも適用されます。

  • DisplayName:必須、大文字小文字を区別、空または空白のみは不可

  • Members:オプションの配列。各メンバーには既存ユーザーの外部IDを含む有効なvalueフィールドが必要

  • メンバーの外部ID:同じ外部IDプロバイダーの既存ユーザーを参照する必要あり

  • Schemas:Core Groupスキーマを含む必要あり

グループの削除(DELETE)— サポートされません

グループのDELETE操作は、DocuWareユーザープロビジョニングv3サービスではサポートされていません。グループの削除を試みるとエラーレスポンスが返されます。

HTTPステータスコード

ステータスコード

説明

使用場面

200 OK

成功

GET、PATCH操作

201 Created

リソース作成

POST操作

204 No Content

成功、コンテンツなし

DELETE、一部のPATCH操作

400 Bad Request

無効なリクエスト

検証エラー

401 Unauthorized

認証が必要

トークンの欠落・無効

403 Forbidden

アクセス拒否

権限不足

404 Not Found

リソースが見つからない

無効なリソースID

409 Conflict

リソースの競合

ユーザー名・メールの重複

500 Internal Server Error

サーバーエラー

サービスの問題

501 Not Implemented

未サポート

製品でサポートされていない機能

エラーレスポンスの形式

{

  "ScimType": "invalidValue",

  "Detail": "Validation failed.",

  "Status": 400,

  "Schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"]

}

設定要件

IDプロバイダーのセットアップ

  1. 適切なテナントURLを指すようにIdPを設定します

  2. JWTトークンを使用したOAuth 2.0/OIDC認証を設定します

  3. 正しいスコープを設定します:docuware.userProvisioning

  4. API操作を実行するユーザーが十分な権限を持っていることを確認してください。

サポートされるIDプロバイダー

  • Azure Entra ID(Azure AD):externalIdpにazureを使用

  • Okta:externalIdpにoktaを使用

  • Ping Identity:externalIdpにpingを使用

  • オンプレミス:externalIdpにonpremiseを使用

  • 汎用IdP

スキーマ情報

利用可能なスキーマの取得

GET /{externalIdp}/scim/Schemas
Authorization: Bearer {token}

リソースタイプの取得

GET /{externalIdp}/scim/ResourceTypes  
Authorization: Bearer {token}

ヘルスチェック

サービスの可用性

GET /AvailabilityCheck

このエンドポイントは認証不要で、サービスが稼働中の場合は200 OKを返します。

統合ワークフローの例

ユーザープロビジョニングの完全なワークフロー

  1. ユーザーの作成:ユーザーの詳細を含めて/UsersにPOST

  2. 作成の確認/Users/{id}にGETで確認

  3. ユーザーの更新:変更内容を含めて/Users/{id}にPATCH

  4. グループへの追加:ユーザーを追加するために/Groups/{groupId}にPATCH

  5. 無効化active: false/Users/{id}にPATCH

グループ管理ワークフロー

  1. グループの作成:グループの詳細を含めて/GroupsにPOST

  2. メンバーの追加:add操作で/Groups/{id}にPATCH

  3. 名前の更新:displayNameの変更で/Groups/{id}にPATCH

  4. メンバーの削除:remove操作で/Groups/{id}にPATCH

このAPIは、セキュリティとパフォーマンスのベストプラクティスを維持しながら、外部IDプロバイダーを通じてDocuWareのユーザーとグループを管理するための堅牢で標準準拠のインターフェースを提供します。

サポートされているバージョン: DocuWare Cloud + 7.13