こんにちは!たつみんです。
Okta Expression Languageと聞いてもあまりピンとこないOkta管理者もいらっしゃるのではないでしょうか?今日はOkta Expression Languageとは?から始まりどのような時に活用できるかについて解説していきます。
Okta Expression Languageとは?
端的に言うとExcelの関数のようなものです。Oktaではさまざまな属性を扱いますがOktaからSP(SaaS)に対して属性のマッピングをする際に属性値の一部を別の文字列に置き換えたり、そもそも属性値が空であった場合に別の値を代入したいという場合があります。
このような時にOkta Expression Languageを利用することで対応が可能となります。
基本編
まずどのようなことが行えるかをよく使われるOkta Expression Languageについてみていきます。
文字列の一部取り出し
String.substringBefore(user.email, "@")
Oktaユーザープロファイルのemail属性の値の@より前を取り出します。
String.substringAfter(user.email, "@")
Oktaユーザープロファイルのemail属性の値の@より後を取り出します。
文字列の変換
String.replace(user.email, "@", "_" )
Oktaユーザープロファイルのemail属性の@を_に変換します。
文字列の連結
String.join(".", user.firstName, user.lastName)
OktaユーザープロファイルのFirst nameとLast nameを.(ドッド)を入れて連結します。
応用編
ここでは条件式(IF文に相当)と演算子についてご紹介します。
条件式
user.displayName != "" AND user.displayName != null ? user.displayName : String.join(".", user.firstName, user.lastName)
OktaユーザープロファイルのDisplay nameが空白でなくNullでもないという条件の場合はDisplay nameを、条件に一致しない場合はFirst nameとLast nameを.(ドッド)を入れて連結した結果を返します。
これをExcel関数でお馴染みのIF文に当てはめて考えると以下のようになります。
論理式
user.displayName != "" AND user.displayName != null
Trueの場合
user.displayName
Falseの場合
String.join(".", user.firstName, user.lastName)
Okta Expression Languageの場合は論理式の区切りを?
で表現し、TrueとFalseの区切りを:
で表現しています。
演算子について
先ほどのIF文の論理式部分でも登場したANDの他にORや!そして==や!=が利用できます。
詳細については以下をご参照ください。
具体的な使用例
基本編と応用編をご紹介しましたが1番イメージがつきやすいのは具体的な使用例を見ることかと思います。
ケース1
社名変更やM&AなどでOktaのユーザーとSaaS毎に利用しているドメインが異なる場合に、これらを一致させるために設定するというケースがよくあります。この時に、SSO設定のApplication username formatでOkta Expression Languageを活用しドメイン部分を変更するという手法を取ります。
以下のようにCustomを選択することでOkta Expression Languageを指定することができるようになります。スクリーンショットでは見切れてしまっていますが以下のようなOkta Expression Languageを指定しています。
String.replace(user.email, "@cloudnative.co.jp", "@example.com" )
このアプリケーションにアサインされるユーザーで@cloudnative.co.jp
を持つユーザーは@example.com
に自動的に変換された状態でアサインされます。
ケース2
Group RuleではUse basic conditionでは単一の属性に対して条件を指定しますが、複数の属性を指定する場合はUse Okta Expression Language (advanced)を選択することで実現できます。
以下の例ではカスタム属性として作成した属性Dropboxの値が1の場合かつ、ユーザー属性Divisionの値にDevelopmentが含まれている場合を指定しています。
user.Dropbox == "1" AND String.stringContains(user.division, "Development")
ケース3
Provisioning設定のAttribute MappingsではOktaの属性をSP(SaaS)に簡単に連携させることができます。この時にSaaS側が要求する条件によってはOkta Expression Languageを利用しOktaユーザーの属性をうまく変換してあげる必要があります。
例えばSlack usernameは21文字以下尚且つ@マークは利用できないという条件があります。そのためAttribute Mappingsでは以下のように@マークを_に変換しつつ先頭から21文字までを取得するように設定をしています。
String.substring(String.replace(user.email, "@", "_" ), 0, 21)
このケースの背景などは以前ブログ記事にしていますので興味があれば下記もご参照ください。
まとめ
Okta Expression Languageを使いこなすことで複雑なケースに対応できるようになります。特にAttribute Mappingsではデフォルトで設定されている場合もあるのでどのような設定がされているかを読み解かなければならない場合があります。
Okta Expression Languageが設定が可能なほとんどの箇所でPreview機能がありますので、都度確認しながら試行錯誤するのがよいと思います。
それではよきOktaライフを〜?