はじめに
今回は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にログインしたら、左上メニュー[Ξ]から
[アイデンティティとセキュリティ] - [ドメイン]を選択します。
次にOracleIdentityCloudServiceドメインを選択します。
ここでは後でAPIのエンドポイントとして使うため、
ドメインURLをコピー(保存)しておき、統合アプリケーションを選択します。
機密アプリケーションを選択して、ワークフローの起動を実行します。
「このアプリケーションをリソース・サーバーとして今すぐ構成します」の
ラジオボタンを選択します。
今回は特に使用しませんのでプライマリ・オーディエンスに任意の値を入れます。
そのまま「このアプリケーションをクライアントとして今すぐ構成します」の
ラジオボタンを選択します。
ここでは下記を選択します。
クライアント・タイプ: 機密
IDトークン暗号化アルゴリズム: A256CBC-HS512
クライアントIPアドレス: 任意の場所
認可されたリソース: すべて
さらに下にスクロールしてアプリケーション・ロールの追加から
「Identity Domain Administrator」を追加して次に進みます。
最後に「スキップして後で実行」を選択したまま、終了を実行します。
下の方にスクロースするとクライアントID、クライアント・シークレットがあるので
コピーしておきます。
以上で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部分はパラメータが多いので詳しくは公式ドキュメントを参照して頂くとして、
項目としては以下4つくらいを意識して変更してください。
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機能を使って簡単にユーザ作成、グループ追加ができました。