見出し画像

SmartHRのカスタム従業員項目をOktaのUser Profileに反映させるようにした

皆さんこんにちは。超お久しぶりです。
前回の投稿が半年以上前とだいぶアウトプットお便秘状態になっていました…

今回は久々に技術系ということでSmartHRのカスタム従業員項目の内容を元にOktaのUser Profileを更新させた話をします。


SmartHRがOktaとSCIM連携を開始

2022年3月、情シス界隈に朗報が訪れました。
あのSmartHRとOktaがSCIM連携をするようになったのです。

当初は名前と従業員番号だけでしたが、5月には雇用形態、役職、部署が追加されました。
この対応の速さは流石SmartHR&Oktaと言った感じですね🙌

これでSmartHRを人事DBにOktaを経由して、各種アカウントを発行する"HRドリブンのアカウント管理"が行えるのでとてもありがたい話です。

連携項目以外は?

上でも挙がっていたように基本的な項目がSmartHRとOktaの間で連携できるようになりましたが、OktaのProfileは自由に項目を追加出来るので"それ"を利用している方も多いのでは無いでしょうか?
弊社も「英語氏名」と「ニックネーム(読み方)」「ニックネーム(英語)」を追加し、Oktaからユーザープロビジョニングする際にユーザーの表示名などに利用しています。

SmartHRにもカスタム従業員項目があるので、「SmartHRのカスタム従業員項目に追加→OktaにSCIM連携」出来れば良いのですがまだ実装されていません。
とはいえ弊社には必要な情報なのでSmartHRのカスタム従業員項目に登録されている内容をOktaのProfileに登録する仕組みを作りました。

Okta  Workflowsを使ってみる

OktaにはOkta Workflowsというワークフロー機能があり、特定のライセンスを利用していれば5つのフローまで無料で利用できますので、今回はこれを使っていきます。

SSOとUDのライセンスをご購入のお客様は5つのフローまで無料でご利用頂けますので、これをきっかけに是非ご検討頂ければと思います。

https://www.okta.com/jp/blog/2022/01/workflows-series-part-1-what-is-workflows/

その前にSmartHRの情報を引っ張ってくる

まずはSmartHRのカスタム従業員項目を引っ張ってきます。
が、Okta WorkflowsでAPIの認証方法が分からず挫折したので、安直にGASを利用してSmartHRの情報をスプレッドシートに引っ張ってきます。

取得後のスプレッドシートの図

GASは10回も書いたこと無いのでクソ適当です。ゲロ甘な目で見てやってください。

function getSmartHR_EmployeeList() {
  // 環境に合わせて書き換えてください  
  const ACCESS_TOKEN = 'xxx'
  const SUB_DOMAIN = 'xxx'
  const baseUrl = 'https://'+SUB_DOMAIN+'.smarthr.jp' /
  var spreadsheet = SpreadsheetApp.openById("xxx");
  var sheet = spreadsheet.getSheetByName("xxx");

  //何ページ分取得するか(登録されている社員数に依存する)
  const LAST_PAGE = 10

  // 認証のためにアクセストークンの指定
  // HTTPリクエストヘッダーを作ります
  const headers = {
    'Authorization''Bearer ' + ACCESS_TOKEN,
    'Content-Type''application/json' // Content-Typeの指定
  }

  // HTTPリクエストのオプションを設定します
  const params = {
    'method''GET'// GETメソッドでリクスト
    'headers': headers // HTTPリクエストヘッダー
  }

  var arr = [];
  arr.push(['MailAddress','FirstName','LastName','ニックネーム','NickName']);

  try{
    var flg = true;
    var pageCount = 1;

    for(var page=1;page<=LAST_PAGE;page++){
      // 従業員取得APIにリクエストを送信します
      const endpointUrl = baseUrl + "/api/v1/crews?emp_status=employed&page="+page+"&per_page=100"
      const response = UrlFetchApp.fetch(endpointUrl, params);
      const json = JSON.parse(response.getContentText());
      
      if(json.length > 0){
        for(var i=0; i < json.length; i++){
          let Email = '';
          let FirstName = '';
          let LastName = '';
          let NickName_jpn = '';
          let NickName = '';
          if(json[i].custom_fields.length > 0){
            for(var j=0;j<json[i].custom_fields.length;j++){
            switch(json[i].custom_fields[j].template.name){
                case 'メールアドレス(fugafuga)':
                  Email = json[i].custom_fields[j].value
                  break;
                case 'FirstName(名)':
                  FirstName = json[i].custom_fields[j].value
                  break;
                case 'LastName(姓)':
                  LastName = json[i].custom_fields[j].value
                  break;
                case 'ニックネーム':
                  NickName_jpn = json[i].custom_fields[j].value
                  break;
                case 'NickName':
                  NickName = json[i].custom_fields[j].value
                  break;
              }
            }
          }
          if(Email == "" || FirstName == "" || LastName == "" || NickName_jpn == "" || NickName == ""){
            //どれか1項目でも空欄ならSkipする
          }else{
            arr.push([Email,FirstName,LastName,NickName_jpn,NickName]);
          }
        }
        pageCount++;
      }else{
        flg = false;
      }
    } 
    sheet.clear();
    sheet.getRange(11, arr.length, arr[0].length).setValues(arr);
  }catch(e){
    console.error("エラー:", e.message);
  }
}

GASが準備出来たらトリガーから1日1回動かすようにします(好きな頻度でどうぞ)

Okta Workflowsの出番

やっとOkta Workflowの出番です
こいつがクセありまくってよく分からんので動画のイケメン外人男性の言う通りに作りました。

自分で作った結果
For EachのHelperの先

これで一通り完了です。
やってることは至って簡単で↓の通りです。

  1. スプレッドシートを読み込ませる

  2. スプレッドシートのカラムを分解

  3. メールアドレスでOktaのユーザーを検索

  4. マッチしたらProfileを更新

これでSmartHRとOktaの間で連携されていない項目でも擬似的に連携する事が出来ました🙌
かなり適当に作っているので他に良い方法が合ったら教えて下さい🙇‍♂️

この記事が気に入ったらサポートをしてみませんか?