【OCI】IAM Identity DomainのAPIを使ってユーザ登録してみる

# はじめに

今回はOracle Cloud Infrastructure（OCI）のIAM Identity DomainのAPI機能を使って
ユーザを作成し、そのユーザをグループに所属させるところまでをやってみたいと思います。

以前、似たような検証としてAPI Gatewayに認証をかけるということを
やってみたのでこちらも参考にしてみてください。

【OCI】IAM Identity Domainを使ってAPI Gatewayに認証を実装してみる
https://qiita.com/atwits/items/f4076c9f38167b1b6fa1

■今回のAPI機能検証の流れ
①IAM Identity Domainの設定 [*APIをコールするための統合アプリケーションの作成]
②トークン（JWT）の発行 [*APIで使用するための認証トークンの発行]
③ユーザ作成
④グループ検索 [*ユーザを追加するグループのIDを検索]
⑤グループへのユーザ追加

■公式ドキュメント
・トークン取得
https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/rest-api/op-oauth2-v1-token-post.html

・ユーザー作成
https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/rest-api/op-admin-v1-users-post.html

・グループ検索
https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/rest-api/op-admin-v1-groups-id-get.html

・グループ更新（ユーザ追加）
https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/rest-api/op-admin-v1-groups-id-patch.html

◆目次
1.IAM Identity Domainの設定
2.APIの動作検証

## 1. IAM Identity Domainの設定

それでは早速、IAM Identity Domainの設定に入りますが、
APIをコールするためには統合アプリケーションが必要なので
その設定を行います。

OCIにログインしたら、左上メニュー[Ξ]から
[アイデンティティとセキュリティ] - [ドメイン]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/94da7ee9-9a6b-325e-1d59-1c629ea87bba.png)

次にOracleIdentityCloudServiceドメインを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/a5fcf43b-aa5c-fe6e-8125-fbaead981ff5.png)

ここでは後でAPIのエンドポイントとして使うため、
ドメインURLをコピー（保存）しておき、統合アプリケーションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/e6ba1e9b-e976-f563-34d9-699a5cb01c53.png)

続いてアプリケーションの追加を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/1a0e8650-6f44-b787-1aba-1a8e4296ca09.png)

機密アプリケーションを選択して、ワークフローの起動を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/41258187-f4b4-678e-3bca-82d03aeee2a1.png)

任意の名前（ここではapp_jwt）をつけて次を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/f731d059-bafc-3100-3d3e-7fcc4c98ee70.png)

「このアプリケーションをリソース・サーバーとして今すぐ構成します」の
ラジオボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/09852475-8ce5-c50a-4b25-2e461065e6b6.png)

今回は特に使用しませんのでプライマリ・オーディエンスに任意の値を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/b563ded1-a37f-5925-773a-323941a8c63d.png)

そのまま「このアプリケーションをクライアントとして今すぐ構成します」の
ラジオボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/0b264959-38e8-99ab-619e-9c6084994906.png)

クライアント資格証明を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/55290f93-3422-35cc-d97b-f2d669f6999e.png)

ここでは下記を選択します。
クライアント・タイプ: 機密
IDトークン暗号化アルゴリズム: A256CBC-HS512
クライアントIPアドレス: 任意の場所
認可されたリソース: すべて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/76439653-f72a-ee47-eed8-84a73c4552f2.png)

さらに下にスクロールしてアプリケーション・ロールの追加から
「Identity Domain Administrator」を追加して次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/7f4b40ac-eee7-8600-0c44-c9376e6cd50a.png)

最後に「スキップして後で実行」を選択したまま、終了を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/d14d670f-b2e0-5880-aac9-4c730514fd07.png)

統合アプリケーションの作成が完了したらアクティブ化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/e59a1b83-2e96-00d1-81ba-39c359eeeb86.png)

下の方にスクロースするとクライアントID、クライアント・シークレットがあるので
コピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/cd9a1d0d-ac21-6e5c-e7c9-761a43488777.png)

以上でIAM Identity Domain（統合アプリケーション）の設定は終了です。

## 2. APIの動作検証

それではAPIの動作検証をしてみます。

[1] トークン（JWT）の発行
最初にAPI実行で必要なアクセストークンを発行します。

```
[Method] POST
[Endpoint] <ドメインURL>/oauth2/v1/token
[Header] 
  Content-Type: application/x-www-form-urlencoded
  Authorization: Basic <Base64認証値>
[Body]
  grant_type=client_credentials&scope=urn:opc:idm:__myscopes__
```
ドメインURL 例. https://idcs-263db******.identity.oraclecloud.com

■Base64認証値の生成方法

例.
クライアントID: ABCDE
クライアント・シークレット: 12345

クライアント・シークレットを「:」でつなげた文字列を作成
 →　ABCDE:12345

それをBase64エンコードしたもの
→ QUJDREU6MTIzNDU=

最終的なヘッダーは以下のようなイメージとなります。
Authorization: Basic QUJDREU6MTIzNDU=

上記設定した上でPOSTを実行すると下記のようなレスポンスが返ってきますので
このaccess_tokenをコピーしておきます。
```
{
    "access_token": "eyJ4NXQcN5zdEKfw*****",
    "token_type": "Bearer",
    "expires_in": 3600
}
```

[2] ユーザ作成

前述の処理で発行したトークンをヘッダーのauthorization埋め込みます。
Body部分はパラメータが多いので詳しくは公式ドキュメントを参照して頂くとして、
項目としては以下４つくらいを意識して変更してください。

givenName: ファーストネーム
familyName: ラストネーム
userName: ログインID （メールアドレスと一緒にするケースが多い）
emails: メールアドレス

```
[Method] POST
[Endpoint] <ドメインURL>/admin/v1/Users
[Header] 
 Content-Type: application/json
 authorization: Bearer <トークン>
[Body]
 {
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User": {
    "isFederatedUser": false
  },
  "name": {
    "givenName": "FirstName",
    "familyName": "LastName"
  },
  "userName": "xxxx@test.com",
  "emails": [
    {
      "value": "xxxx@test.com",
      "type": "work",
      "primary": true
    }
  ]
 }
```

実行して処理が正常に完了するとユーザが作成されて次のような
レスポンスが返ってきますので、「id」の値をメモっておきます。
→  "id": "86546b***",

```
{
    "idcsCreatedBy": {
        "type": "App",
        "display": "app_jwt",
        "value": "81870d***",
        "ocid": "ocid1.domainapp.oc1.ap-tokyo-1.***",
        "$ref": "https://idcs-8b3cbe***.identity.oraclecloud.com:443/admin/v1/Apps/81870***"
    },
    "id": "86546b***",
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User": {
        "isFederatedUser": false,
        "preferredUiLandingPage": "MyApps"
    },
    "meta": {
        "created": "2025-01-23T17:15:17.724Z",
        "lastModified": "2025-01-23T17:15:17.724Z",
        "version": "12042348f9514415ae2e7863729d4dd2",
        "resourceType": "User",
        "location": "https://idcs-8b3cbe***.identity.oraclecloud.com:443/admin/v1/Users/86546***"
    },
    "active": true,
    "displayName": "FirstName LastName",
    "idcsLastModifiedBy": {
        "value": "81870d***",
        "display": "app_jwt",
        "ocid": "ocid1.domainapp.oc1.ap-tokyo-1.amaaaa***",
        "type": "App",
        "$ref": "https://idcs-8b3cbe***.identity.oraclecloud.com:443/admin/v1/Apps/81870d***"
    },
    "name": {
        "givenName": "FirstName",
        "familyName": "LastName",
        "formatted": "FirstName LastName"
    },
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User": {
        "locked": {
            "on": false
        }
    },
    "ocid": "ocid1.user.oc1..aaaaa***",
    "userName": "xxxx@test.com",
    "emails": [
        {
            "verified": false,
            "primary": false,
            "secondary": false,
            "value": "xxxx@test.com",
            "type": "recovery"
        },
        {
            "verified": false,
            "primary": true,
            "secondary": false,
            "value": "xxxx@test.com",
            "type": "work"
        }
    ],
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User"
    ],
    "domainOcid": "ocid1.domain.oc1..aaaaa***",
    "compartmentOcid": "ocid1.tenancy.oc1..aaaaa***",
    "tenancyOcid": "ocid1.tenancy.oc1..aaaaa***",
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:capabilities:User": {
        "canUseApiKeys": true,
        "canUseAuthTokens": true,
        "canUseConsolePassword": true,
        "canUseCustomerSecretKeys": true,
        "canUseOAuth2ClientCredentials": true,
        "canUseSmtpCredentials": true,
        "canUseDbCredentials": true
    }
}
```

[3] グループ検索

続いてユーザを追加するグループのIDを検索します。
こちらもトークンはセットします。

```
[Method] GET
[Endpoint] <ドメインURL>/admin/v1/Groups
[Header] 
 Content-Type: application/json
 authorization: Bearer <トークン>
```

実行すると下記のようなレスポンスが返りますが
今回はOCI_Administratorsグループにユーザを登録するので
「id」の値をメモっておきます。
→　"id": "f9477***",

```
{
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:ListResponse"
    ],
    "totalResults": 5,
    "Resources": [
        {
            "displayName": "OCI_Administrators",
            "idcsLastModifiedBy": {
                "type": "App",
                "value": "UnAuthenticated",
                "display": "COMPUTEBAREMETAL",
                "$ref": "https://idcs-8b3cbe***.identity.oraclecloud.com:443/admin/v1/Apps/UnAuthenticated"
            },
            "idcsCreatedBy": {
                "type": "App",
                "display": "COMPUTEBAREMETAL",
                "value": "baefd2c10ac14dc7ba22ab9402e1f4b2",
                "$ref": "https://idcs-8b3cbe9805e546f0b1b81078839f1b75.identity.oraclecloud.com:443/admin/v1/Apps/baefd2c10ac14dc7ba22ab9402e1f4b2"
            },
            "urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group": {
                "description": "Group mapped to the Administrators group in the OCI account"
            },
            "id": "f9477***",
            "ocid": "ocid1.group.oc1..aaaaaaaa7onqgwu6i7gniwj4zohwuf7o6kzj3hlwvhhtpo2rowoagg4a333q",
            "meta": {
                "created": "2019-12-30T12:15:28.646Z",
                "lastModified": "2022-01-22T17:50:39Z",
                "resourceType": "Group",
                "location": "https://idcs-8b3cbe9805e546f0b1b81078839f1b75.identity.oraclecloud.com:443/admin/v1/Groups/f94778e74a704558a423f7c3023758fb"
            },
            "externalId": "123456",
～～
```

[4] グループへのユーザ追加

最後に作成したユーザのグループ追加です。
エンドポイントの一番後ろにOCI_AdministratorsグループのIDを設定して
Body部分のvalueに作成したユーザのIDをセットしてPOSTすると
グループにユーザが追加されます。

```
[Method] PATCH
[Endpoint] <ドメインURL>/admin/v1/Groups/<グループのID>
[Header] 
 Content-Type: application/json
 authorization: Bearer <トークン>
[Body]
{
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ],
    "Operations": [
        {
            "op": "add",
            "path": "members",
            "value": [
                {
                    "value": "86546b***",
                    "type": "User"
                }
            ]
        }
    ]
}
```

正常にグループ追加が完了すると以下のようなレスポンスが返ります。
```
{
    "displayName": "OCI_Administrators",
    "idcsLastModifiedBy": {
        "type": "App",
        "value": "UnAuthenticated",
        "display": "COMPUTEBAREMETAL",
        "$ref": "https://idcs-8b3cb***.identity.oraclecloud.com:443/admin/v1/Apps/UnAuthenticated"
    },
    "idcsCreatedBy": {
        "type": "App",
        "display": "COMPUTEBAREMETAL",
        "value": "baefd***",
        "$ref": "https://idcs-8b3cbe***.identity.oraclecloud.com:443/admin/v1/Apps/baefd***2"
    },
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group": {
        "description": "Group mapped to the Administrators group in the OCI account"
    },
    "id": "f9477***",
    "ocid": "ocid1.group.oc1..aaaaa***",
    "meta": {
        "created": "2019-12-30T12:15:28.646Z",
        "lastModified": "2022-01-22T17:50:39Z",
        "resourceType": "Group",
        "location": "https://idcs-8b3cbe***.identity.oraclecloud.com:443/admin/v1/Groups/f9477***"
    },
    "externalId": "123456",
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:Group",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group"
    ],
    "domainOcid": "ocid1.domain.oc1..aaaaa***",
    "compartmentOcid": "ocid1.tenancy.oc1..aaaaa***",
    "tenancyOcid": "ocid1.tenancy.oc1..aaaaa***"
}
```

以上でAPI動作検証は終了です。

## おわり
以上、IAM Identity DomainのAPI機能を使って簡単にユーザ作成、グループ追加ができました。