こんにちは。ネットワールドSEの金沢です。
以前Okta Workflowsに関して、ざっくりとした概要をお話しさせていただくブログを投稿させていただきました。
今回はその続きです。実際に私が案件を想定し、ワークフローを作成しました。このワークフローをもとに、私がどう考えて実装したか、またその実装経験から得た考え方などを共有できればと思います。
実例の紹介を兼ねているので、検証題材に困っている方はもしよければ参考にしていただければと思います。
目次
実行前提条件まとめ
Okta Workflowsの想定要件
・CSVファイルにてユーザー情報がアップロードされる。CSVはユーザー情報が更新されるたびに都度アップロードされ、内容は新規に作成するユーザー、及び更新されるユーザー情報が区別なく入力されている。
・ユーザーは一定期間経過後に削除する必要があるため、のちの処理も踏まえた管理体制をとる必要がある。
構築要素
ワークフロー2つ
テーブル2つ
構築方針
- CSVからユーザーを取り込み、1行ずつ取り込んだユーザーデータを引き渡すワークフローと、実際に引き渡されたユーザーデータから作成及び更新、グループ追加を行うワークフローの2つから成るようにする。
- テーブルは2つ作成し、読み取ったCSVの内容を起こすためのテーブルと、今後の管理のために現在Okta User Directory(以下、UDと記載します)に存在しているユーザーすべてを管理するテーブルの2つを作成する。
ユーザーは一定期間経過後に削除する必要がある
という要件に対応するために、作成時日付をグループ名にしたグループを作成し、作成したユーザーはそのグループに追加して作成日付管理を行う。
実装・構築画面
ワークフロー
ワークフロー1.Create Users to Okta Only Table
トリガー:指定OneDriveフォルダにCSVファイルがアップロードされたとき

処理内容:CSVファイルからインポートされたユーザーデータをCSV import table(後述)に書き起こす。
CSV import tableに書き起こされたテーブルは、ユーザーデータをすべてリストとして「List-For Each」に受け渡し、一行ずつワークフロー2に処理が明け渡されている。
ワークフロー2.Create Users to Okta
トリガー:ワークフロー1で存在するカード「List-For Each」にて呼び出されること
※内容が膨大になるので、スクリーンショット3つにてフローを映しています。
一つ目:実行準備画面

処理内容:ユーザー作成・更新の準備を行う
- ワークフロー1から受け取ったユーザーデータをUDと照会する
- 本日の日付を取得し、YYYYMMDD形式に直してグループ作成における命名の準備
- 2にて取得したYYYYMMDDにてUD内をグループ名検索。
- If/elseにて分岐。3の検索結果が空白だった場合、グループが存在しないとみなし、グループをYYYYMMDDと名付け作成。
二つ目:ユーザー情報更新画面

※今回パスワードはaaaaaとベタ打ちで入力していますが、実際の構築の際はテナントで作成した認証ポリシー条件を満たしたパスワードでないと実行時にエラーが発生します。
処理内容:分岐の結果ユーザーの更新を行う画面
- 照会した結果、login属性がUDに存在した場合、CSVのデータは更新用情報とみなし、得たデータから更新を行う。
- グループに追加されているかを再度確認し、追加されていない場合は追加の処理を行う。更新されたユーザーの作成日付を参照し、ユーザー作成日付YYYYMMDDでグループを検索して追加を行う。
- ユーザー管理用テーブル(後述)を更新する。該当行をlogin属性で検索し、CSVファイルから取得したデータを更新する。
三つ目:ユーザー情報作成画面

- 照会した結果、login属性がUDに存在しなかった場合、CSVのデータはユーザー作成用情報とみなし、得たデータから作成を行う。
- 新規作成したユーザーはグループに追加されていないので、グループ名を検索し追加の処理を行う。作成されたユーザーの作成日付を参照し、ユーザー作成日付YYYYMMDDでグループを検索して追加する。
- ユーザー管理用テーブル(後述)に作成したユーザー情報を反映させる。ユーザー管理用テーブルに新しくCSVから取り込んだ内容を反映させる。
テーブル
CSV import table
目的:ワークフロー1内カード「List-For Each」にて、取得したCSV内容をオブジェクトリストとして引き渡すのに使用
取得した内容を引き渡すためのものなので、都度実行の度にテーブル内容を一度消すという管理で行う。

ユーザーデータ管理用テーブル
目的:Okta UDのユーザー情報をそのまま映したテーブル。全体ワークフローにおいて、ユーザーの作成・更新するためにWorkflows内で操作・参照できるテーブルを作成。

実装思考方法
共通点を抽出し、該当部分で仕分けを行う
非常に基本的なことのため、ご存知の方にとっては釈迦に説法ではありますが、ワークフロー実装の際はこの作業を繰り返しています。このワークフローで言うと、作成日付が同じフォーマットであることに着目し、のちのユーザー削除の一括化を見据えてグループを適宜作成・追加を繰り返している部分が該当します。
そのうえで、以下を意識するとよいでしょう。
- 1ワークフローでの処理はできるだけ少なくする
今回グループ作成とユーザー作成を同時に行っていますが、分けたほうが好ましいと思います。
冗長化につながりますし、保守がうまくできない可能性が高いです。
- 式言語使用の際は変数が使えないことに注意する
生徒番号(studentid)には作成日付を入れたIDとなるという条件のもとでの構築を想定していました。
当初グループルールを作成する際に式言語を使用し、生徒番号を一部切り出した数値が当日日付と一致した場合にグループに追加する、というルールを作成することを画策していたのですが、断念しました。

ルール遷移のGUI設定画面を見たうえで判断すると、よく考えてみれば当たり前のことでした。グループルール作成には変数を使用できません。

作業を行うカードの違いから見てみましょう。
左は取り込んだ日付をYYYYMMDD形式に変換するためのカード、右はOktaのアクションカードのひとつ、グループルールを作成するカードです。
リンクを参照していただいた方は察されたかもしれませんが、この二つはそもそもカードの種類が違いますね。左は関数カードのひとつ、右はコネクターとしてOktaに接続した、アクションカードのひとつです。
式言語に関するドキュメントを参照すると、以下のような記載がありました。
Okta Expression Language(EL)を使用すると、スーパー管理者とアクセス認定管理者は、ユーザー属性とグループ情報を参照、変換、組み合わせることができます。
あくまでも私の解釈ですが、式言語が参照できる範囲はWorkflows内の変数や数値ではなく、あくまでコネクトしたOktaのテナント内の情報であると考えています。
今回作成しようとしているグループルールのルール条件は作成した日付、また読み取ったstudentidの操作をしたものといずれも関数カードで操作した値の使用を考えていました。Okta UDにない値はグループルールの式言語では参照できないと考えると説明がつきます。
もし私のように、一部ユーザー属性から切り出した値をグループルールに使用したい場合は、Workflowsの関数で収めるのではなく、UDにもその値を格納するという手順を踏むのが良いでしょう。
まとめ
今回はOkta Workflowsの実装に関して、自分の実装経験をベースに得たTipsを実装画面を通じてお伝えさせていただきました。
他のOktaの機能に比べ、一つ一つにおいて実装画面が大きく変わってくることが特徴ではないでしょうか。お客様の要件や流れによって実装内容は大きく変わってくることが予想できます。あくまで参考程度になるとは思いますが、少しでも技術的に手こずっている方のお助けになると幸いです。
また本ブログに関して、よりシンプルな美しいワークフローに心当たりがありましたら、ぜひご一報くださいますと大変うれしく思います。