> For AI agents: the complete documentation index is available at /resource/ucidm/docs/on-premise/1.9.0/llms.txt, the full documentation bundle is available at /resource/ucidm/docs/on-premise/1.9.0/llms-full.txt.

# SCIM 外部連携モジュール

UCIDM は SCIM 対応のサービスに対して ID 連携できます。

現状は以下のサービスに対して動作を確認できています。

- Salesforce

> \[!WARNING]
> Salesforce に対しては、ユーザの追加/更新/削除の連携は行えますが、ユーザーパスワードの更新の連携は行えません。これは Salesforce の SCIM API の仕様によるものとなります。
> Salesforce と連携を行う際は、Salesforce 側で SSO の設定を行うことを推奨します。

また、SCIM 対応サービスとの認証・認可においては以下に対応しています。

- OAuth 2.0

## SCIM 外部連携設定手順

### 事前準備

外部連携先の SCIM 対応サービスをご用意下さい。また、UCIDM 稼働サーバーから外部連携先への以下の接続情報をご準備ください。

- アクセストークンを指定して SCIM 対応サービスにアクセスする場合
  - SCIM API にアクセスする際に利用するアクセストークン
- クライアントクレデンシャルズフローで SCIM 対応サービスにアクセスする場合
  - SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアント ID
  - SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアントシークレット

### コンテナの設定

SCIM 外部連携モジュールはコンテナとして稼働させます。次のように `compose.yml` に設定します。entrypoint では次の設定ができます。

- `-verbose`: デバッグログを出力
- `-jsonl`: JSON 形式でログを出力

```yml
consumer-scim:
  depends_on:
    rabbitmq:
      condition: service_healthy
  container_name: consumer-scim
  image: docker.io/osstech/ucidm-consumer:latest
  logging: *default-logging
  ports:
    - 7099:7099
  volumes:
    - type: bind
      source: ./server-data
      target: /ucidm
      bind:
        create_host_path: false
  entrypoint:
    - ./bin/app-main
    - -verbose
    - -jsonl
  environment:
    TZ: "${TZ}"
    DESTINATION_ID: "scim-001"
    MONGO_USER: "${MONGO_USER}"
    MONGO_PASSWORD: "${MONGO_PASSWORD}"
    MONGO_DATABASE: "${MONGO_DATABASE}"
    MONGO_HOSTS: "${MONGO_HOSTS}"
    MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
    RABBITMQ_USER: "${RABBITMQ_USER}"
    RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
    RABBITMQ_HOST: "${RABBITMQ_HOST}"
    SCIM_AUTH_TYPE: "client_credentials"
    SCIM_OAUTH2_CLIENT_ID: "${SCIM_OAUTH2_CLIENT_ID}"
    SCIM_OAUTH2_CLIENT_SECRET: "${SCIM_OAUTH2_CLIENT_SECRET}"
  restart: "always"

```

ここで参照する環境変数は `ucidm.env` に設定します。

#### 環境変数の設定

| 環境変数                      |        値       |  既定値  | 説明                                                                                                                                |
| :------------------------ | :------------: | :---: | :-------------------------------------------------------------------------------------------------------------------------------- |
| TZ                        |       任意       |   --  | タイムゾーン情報                                                                                                                          |
| DESTINATION_ID            |       任意       |   --  | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定                                                                                                    |
| MONGO_USER                |       任意       |   --  | 接続する MongoDB のユーザ名                                                                                                                |
| MONGO_PASSWORD            |       任意       |   --  | 接続する MongoDB のパスワード                                                                                                               |
| MONGO_DATABASE            |       任意       | ucidm | 接続する MongoDB のデータベース                                                                                                              |
| MONGO_HOSTS               |       任意       |   --  | 接続する MongoDB のホスト                                                                                                                 |
| MONGO_REPLICA_SET         |       任意       |   --  | 接続する MongoDB のレプリカセットの名前                                                                                                          |
| RABBITMQ_USER             |       任意       |   --  | 接続する RabbitMQ のユーザ名                                                                                                               |
| RABBITMQ_PASSWORD         |       任意       |   --  | 接続する RabbitMQ のパスワード                                                                                                              |
| RABBITMQ_HOST             |       任意       |   --  | 接続する RabbitMQ のホスト                                                                                                                |
| SCIM_AUTH_TYPE            |       任意       |   --  | OAuth2 の認証・認可の方式を指定します。<br />指定できる値は以下になります。<br />- `client_credentials` (クライアントクレデンシャルズフロー)<br />- `access_token` (アクセストークン直接指定) |
| SCIM_ACCESS_TOKEN         |       任意       |   --  | SCIM API にアクセスする際に利用するアクセストークンを指定します。<br />`SCIM_AUTH_TYPE` が `access_token` の場合、この値は必須です。                                        |
| SCIM_OAUTH2_CLIENT_ID     |       任意       |   --  | SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアント ID<br />`SCIM_AUTH_TYPE` が `client_credentials` の場合、この値は必須です。                               |
| SCIM_OAUTH2_CLIENT_SECRET |       任意       |   --  | SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアントシークレット<br />`SCIM_AUTH_TYPE` が `client_credentials` の場合、この値は必須です。                            |
| SCIMServiceType           |       任意       |   --  | 外部連携先のサービスを指定します                                                                                                                  |
| ENABLE_SCRIPT_PASSWORD    | true または false | false | ユーザーパスワード更新時に外部連携の<br />前処理/後処理スクリプトにパスワードの値を連携するかどうか                                                                             |

### SCIM 外部連携設定

管理画面にて SCIM の外部連携設定が行えます。ホーム画面の「外部連携設定」を選択し、外部連携設定一覧画面に遷移します。外部連携設定一覧画面で、登録ボタンを押下することで新規外部連携設定画面が表示されます。

![](/resource/ucidm/docs/on-premise/static/image/federation-setting.b310b59109.png)
この新規外部連携設定画面の各タブで詳細内容を設定します。設定が完了したら「登録」ボタンを押下することで外部連携設定が作成されます。

外部連携設定作成後は、[ルーティング設定](/resource/ucidm/docs/on-premise/1.9.0/administration/admin-ui/index.md#ルーティング設定画面) にてこの外部連携設定を適用するユーザーおよびグループを指定して下さい。

#### 外部連携主要情報

SCIM 外部連携の主要情報を指定します。

- 連携 ID
  - 一意の連携 ID を指定します
- 外部連携先 ID
  - 上記コンテナの DESTINATION_ID 環境変数で設定した値を指定します
- 外部連携先 タイプ
  - SCIM

#### 動作設定

管理画面にて SCIM 外部連携の動作設定ができます。

設定項目と内容は次になります。

- OAuth2 トークンエンドポイント URL
  - OAuth2 トークンエンドポイントの URL を指定します。
- OAuth2 スコープ
  - OAuth2 のスコープの値を指定したい場合には、ここで設定を行います。
- SCIM スキーマ URL
  - SCIM 対応サービスの Schema の URL を指定します。
- SCIM Users URL
  - SCIM 対応サービスの Users の URL を指定します。
- SCIM Groups URL
  - SCIM 対応サービスの Groups の URL を指定します。
- userName 属性の前につける固定値
  - 本 SCIM 外部連携モジュールにおいては、LDAP/AD から連携されてきた DN の RDN の値が userName として使われます。
  - userName の値を SCIM 対応サービスに送信するにあたり、RDN の値よりも前に付加したい文字列があれば指定します。
- userName 属性の後につける固定値
  - 本 SCIM 外部連携モジュールにおいては、LDAP/AD から連携されてきた DN の RDN の値が userName として使われます。
  - userName の値を SCIM 対応サービスに送信するにあたり、RDN の値よりも後に付加したい文字列があれば指定します。
- 連携先サービス
  - 外部連携先のサービスを指定します。指定できる値は以下になります。
    - Salesforce
    - Others
- ドライランモード
  - 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります。
  - 主にテスト時の動作確認等に使うことを想定しています。

以下は SCIM（Salesforce）外部連携の動作設定の一例です。

- OAuth2 トークンエンドポイント URL
  - [https://test-service.develop.my.salesforce.com/services/oauth2/token](https://test-service.develop.my.salesforce.com/services/oauth2/token)
- OAuth2 スコープ
  - 空
- SCIM スキーマ URL
  - [https://test-service.develop.my.salesforce.com/services/scim/v2/Schemas](https://test-service.develop.my.salesforce.com/services/scim/v2/Schemas)
- SCIM Users URL
  - [https://test-service.develop.my.salesforce.com/services/scim/v2/Users](https://test-service.develop.my.salesforce.com/services/scim/v2/Users)
- SCIM Groups URL
  - [https://test-service.develop.my.salesforce.com/services/scim/v2/Groups](https://test-service.develop.my.salesforce.com/services/scim/v2/Groups)
- userName 属性の前につける固定値
  - 空
- userName 属性の後につける固定値
  - @example.com
- 連携先サービス
  - Salesforce
- ドライランモード
  - false

##### 実施しない操作の設定

- ユーザー追加/更新を行わない
  - SCIM 対応サービスに対してユーザー追加/更新を行わない場合は、この項目をオン（true）にしてください
- ユーザー削除を行わない
  - SCIM 対応サービスに対してユーザー削除を行わない場合は、この項目をオン（true）にしてください
- ユーザーパスワード更新を行わない
  - SCIM 対応サービスに対してユーザーパスワード更新を行わない場合は、この項目をオン（true）にしてください
- グループ追加/更新を行わない
  - SCIM 対応サービスに対してグループ追加/更新を行わない場合は、この項目をオン（true）にしてください
- グループ削除を行わない
  - SCIM 対応サービスに対してグループ削除を行わない場合は、この項目をオン（true）にしてください
- グループメンバー追加を行わない
  - SCIM 対応サービスに対してグループメンバー追加を行わない場合は、この項目をオン（true）にしてください
- グループメンバー削除を行わない
  - SCIM 対応サービスに対してグループメンバー削除を行わない場合は、この項目をオン（true）にしてください

#### マッピング

SCIM は次のマッピング設定をすることができます。

- 属性マッピング

それぞれのマッピング設定について説明します。

#### 属性マッピング

次の [属性マッピング設定](/resource/ucidm/docs/on-premise/1.9.0/administration/admin-ui/mappings.md) を参考にしてください。

以下は SCIM（Salesforce）外部連携のユーザーマッピング設定の一例です。

| 連携先の属性名                                                             | 連携元の属性名   | ビルトイン関数名 | テンプレート文字列 | 固定値        |
| :------------------------------------------------------------------ | :-------- | :------- | :-------- | :--------- |
| displayName                                                         | cn        | --       | --        | --         |
| name.familyName                                                     | sn        | --       | --        | --         |
| name.givenName                                                      | givenName | --       | --        | --         |
| active                                                              | --        | --       | --        | true       |
| emails.0.primary                                                    | --        | --       | --        | true       |
| emails.0.type                                                       | --        | --       | --        | customType |
| emails.0.value                                                      | mail      | --       | --        | --         |
| urn:ietf:params:scim:schemas:extension:enterprise:2.0:User.division | --        | --       | --        | staff      |

SCIM（Salesforce）外部連携のグループマッピング設定の一例です。

| 連携先の属性名 | 連携元の属性名 | ビルトイン関数名 | テンプレート文字列 | 固定値 |
| :------ | :------ | :------- | :-------- | :-- |
| 設定なし    | --      | --       | --        | --  |

また、以下の属性は SCIM 外部連携モジュール独自のマッピングになるため、合わせてご参照ください。

- SCIM では階層構造を持つ属性があります。
  - 例えば、name 内の givenName に対して属性値をマッピングする場合は、「name.givenName」に対してマッピングをする必要があります。
- また、SCIM では階層構造に加えて、配列を持つ属性があります。
  - 例えば、emails 内の 最初の配列要素における、value に対して属性値をマッピングする場合は、「emails.0.value」に対してマッピングをする必要があります。
  - 配列の要素番号は、0, 1, 2, ... の形で 0 から始める番号で指定する必要があります。

#### ユーザ属性

##### userName 属性

本 SCIM 外部連携モジュールにおいては、primaryID の値が userName として使われます。

primaryID の値の前や後に何か文字列を付加して userName の属性値としたい場合は、前述の「userName 属性の前につける固定値」や「userName 属性の後につける固定値」の設定をしてください。

##### active 属性

ユーザの有効化/無効化を制御するために主に使われる属性となります。（詳しくは SCIM 各連携先の公式マニュアル等をご参照ください。）

SCIM 連携先がこの属性を有効化/無効化のフラグとして使っている場合には、本属性に対して true/false が設定されるようマッピングを行うことで、ユーザの有効化/無効化
のステータスを制御することができます。

#### グループ属性

##### displayName 属性

本 SCIM 外部連携モジュールにおいては、primaryID の値が displayName として使われます。

### 前処理・後処理スクリプト設定

UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。

次の [外部連携の前処理/後処理で実行するスクリプトの配置](/resource/ucidm/docs/on-premise/1.9.0/configuration/destination/script.md) を参考に、スクリプトファイルを配置後、[外部連携の前処理/後処理で実行するスクリプトの設定](/resource/ucidm/docs/on-premise/1.9.0/configuration/destination/script.md) を参考に、実行したいスクリプトファイルを指定してください。

## SCIM 外部連携モジュールの留意事項

Salesforce に対してユーザーパスワード更新を行っても、その値は反映されません
