概要
RESTアダプタを使用して、Oktaのグループ / ユーザー情報を取得する方法を紹介します。
本手順では、OktaのAPIを利用します。
データソース追加
TDV標準のRESTアダプタを利用し、Okta API のList GroupsとList Group membersを以下のようにデータソースとして登録します。
基本タブの操作では、以下のようにGETメソッドによりList GroupsとList Group membersで返されるJSONデータを取得するための設定を行います。
List Groups
Group members
イントロスペクトを実施し、正常に完了することを確認します。
グループリストの取得
RESTデータソースのlist_groupsからグループIDとグループ名のリストを取得します。
list_groupsをJSONからテーブル形式に変換します。
以下はlist_groupsから取得できるJSONの例です。
{"groupsItem":
[
{
"id": "XXXXXXXXXXX",
"created": "20XX-XX-XXTXX:XX:XX.000Z",
"lastUpdated": "20XX-XX-XXXXX:XX:.XX000Z",
"lastMembershipUpdated": "20XX-XX-XXXXX:XX:.XX000Z",
"objectClass": [
"okta:user_group"
],
"type": "OKTA_GROUP",
"profile": {
"name": "TDV_Group",
"description": "TDV Users"
},
"_links": {
"logo": [
{
"name": "medium",
"href": "https://{yourOktaDomain}/img/logos/groups/okta-medium.png",
"type": "image/png"
},
{
"name": "large",
"href": "https://{yourOktaDomain}/img/logos/groups/okta-large.png",
"type": "image/png"
}
],
"users": {
"href": "https://{yourOktaDomain}/api/v1/groups/00XXXXXXXXXXXX/users"
},
"apps": {
"href": "https://{yourOktaDomain}/api/v1/groups/00XXXXXXXXXXXXX/apps"
}
}
}
]
}
今回、取り出したい要素はOktaのグループIDの "id" とOktaのグループ名の"profile" > "name" です。
変換にはJSON_TABLEを使用しますが、"profile" > "name" は一度の処理ではテーブルへ変換できないため、2段階で変換処理を行います。
"id" と"profile" を取り出すSQLスクリプトを作成します。
記述例は以下のとおりです。
PROCEDURE list_groups_json(
OUT result CURSOR (
group_id VARCHAR(255),
profile VARCHAR(25555)
)
)
BEGIN
OPEN result FOR
SELECT
JT.*
FROM
/shared/Okta/L0_DataSource/Okta/list_groups('application/json', 'application/json', 'SSWS ${api_token}') list_groups,
JSON_TABLE(
list_groups."result",
'$."groupsItem"'
COLUMNS(
group_id VARCHAR PATH '$."id"',
profile VARCHAR PATH '$."profile"'
)
) JT;
END
${api_token}はOktaのAPIトークンの値を記述します。
実行すると"id" と"profile"が取り出せていることが確認できます。
次に、作成したSQLスクリプトを入力として、"name"を取り出すためのビューを作成します。
記述例は以下の通りです。
SELECT
list_groups.group_id,
JT.*
FROM /shared/Okta/L1_Physical/list_groups_json() list_groups,
JSON_TABLE(
list_groups."profile",
'$'COLUMNS(group_name VARCHAR PATH '$."name"')) JT
実行する"id"と"name"が取り出せていることが確認できます。
ユーザーリストの取得
指定したグループ内のユーザーリストを取得
RESTデータソースのgroups_memberから指定したグループ内のユーザーIDとユーザー名のリストを取得します。
groups_memberをJSONからテーブル形式に変換します。
以下はgroups_memberから取得できるJSONの例です。
{"groupsItem":
[
{
"id": "XXXXXXXXXXXX",
"status": "ACTIVE",
"created": "20XX-XX-XXTXX:XX:XX.000Z",
"activated": "20XX-XX-XXTXX:XX:XX.000Z",
"statusChanged": "20XX-XX-XXTXX:XX:XX.000Z",
"lastLogin": "20XX-XX-XXTXX:XX:XX.000Z",
"lastUpdated": "20XX-XX-XXTXX:XX:XX.000Z",
"passwordChanged": "20XX-XX-XXTXX:XX:XX.000Z",
"profile": {
"firstName": "tdv",
"lastName": "user",
"email": "tdv-user@example.com",
"login": "tdv-user@example.com",
"mobilePhone": null
},
"credentials": {
"password": {},
"provider": {
"type": "OKTA",
"name": "OKTA"
}
},
"_links": {
"self": {
"href": "https://{yourOktaDomain}/api/v1/users/00XXXXXXXXXXXXX"
}
}
}
]
}
今回、取り出したい要素はOktaのユーザーIDの "id" とOktaのグループ名の"profile" > "login" です。
変換にはJSON_TABLEを使用しますが、"profile" > "login" は一度の処理ではテーブルへ変換できないため、2段階で変換処理を行います。
"id" と"profile" を取り出すパラメタ化クエリを作成します。
記述例は以下のとおりです。
PROCEDURE groups_member_json(
IN group_id VARCHAR(255),
OUT result CURSOR (
group_id VARCHAR(255),
user_id VARCHAR(255),
profile VARCHAR(2147483647)
)
)
BEGIN
OPEN result FOR
SELECT
group_id,
JT.*
FROM
/shared/Okta/L0_DataSource/Okta/groups_member(group_id, 'application/json', 'application/json', 'SSWS ${api_token}') groups_member,
JSON_TABLE(
groups_member."result",
'$."groupsItem"'
COLUMNS(
user_id VARCHAR PATH '$."id"',
profile VARCHAR PATH '$."profile"'
)
) JT;
END
実行する"id"と"profile"が取り出せていることが確認できます。
次に、作成したパラメータ化クエリを入力として、"login"を取り出すためのパラメータ化クエリを作成します。
記述例は以下の通りです。
PROCEDURE groups_member_table(
IN group_id VARCHAR(255),
OUT result CURSOR (
group_id VARCHAR(255),
user_id VARCHAR(255),
user_name VARCHAR(255)
)
)
BEGIN
DECLARE group_id_ VARCHAR(255) DEFAULT group_id;
OPEN result FOR
SELECT
group_id,
user_id,
JT.*
FROM
/shared/Okta/L1_Physical/groups_member_json(group_id_) groups_member_json,
JSON_TABLE(
groups_member_json."profile",
'$' COLUMNS(user_name VARCHAR PATH '$."login"')
) JT;
END
実行する"id"と"login"が取り出せていることが確認できます。
全グループのユーザーリストを取得
グループリストを取得するテーブルとグループ内のユーザーリストを取得するテーブルを組み合わせて、全グループのユーザーリストを取得します。
記述例は以下のとおりです。
PROCEDURE members_table(
OUT result CURSOR (
group_id VARCHAR(255),
user_id VARCHAR(255),
user_name VARCHAR(255)
)
)
BEGIN
DECLARE GROUP_ID_LIST CURSOR (r VARCHAR);
DECLARE r VARCHAR(255);
DECLARE STR_TMP VARCHAR(25555);
DECLARE STR_SELECT VARCHAR(25555);
SET STR_TMP = '';
SET STR_SELECT = '';
OPEN GROUP_ID_LIST FOR
SELECT group_id FROM /shared/Okta/L1_Physical/list_groups_table;
FETCH NEXT FROM GROUP_ID_LIST into r;
L_LOOP:LOOP
IF GROUP_ID_LIST.FOUND = FALSE THEN
SET STR_SELECT = STR_TMP || 'select * from /shared/Okta/L1_Physical/groups_member_table(''' || r || ''');';
LEAVE L_LOOP;
END IF;
FETCH NEXT FROM GROUP_ID_LIST into r;
SET STR_SELECT = STR_TMP || 'select * from /shared/Okta/L1_Physical/groups_member_table(''' || r || ''') UNION ALL ';
SET STR_TMP = STR_SELECT;
END LOOP;
CLOSE GROUP_ID_LIST;
OPEN result FOR STR_SELECT;
END
実行するとOktaの全ユーザーIDとユーザー名が取得できることが確認できます。