ServiceNowにOpenID Connect SSOを設定する

ServiceNowはいくつかのログイン方法を提供しており、今回はOpenID Connect(以下OIDC)での設定方法を紹介します。
（全てDeveloper用の無料枠で再現可能です。）

当記事ではOIDCそのものは解説は割愛させて頂きますが、OIDCのプロバイダーとしてAuth0を利用します。
OIDCから取得される情報はOIDCプロバイダーによって異なり、社内認証システムなどを利用する場合はそれぞれのドキュメントを理解する必要があります。

# 設定概要

OIDCにおいては、認証を行う側のシステムをOpenID プロバイダーと呼び、認証情報を利用する側のシステムをクライアントアプリと呼びます。

OIDCの認証フローについてはこちらの記事が分かりやすいかと思います。
[一番分かりやすい OpenID Connect の説明](https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe)

今回の場合、ServiceNowがクライアントアプリとなります。
OpenID プロバイダーは、実際には社内認証システムで使われているIDaaSなどで連携させることになりますが、ここでは検証用として[Auth0](https://auth0.com/)を使用します。


### 手順概要

おおまかな構築の流れは以下の通りです。

- Auth0の設定
  - ServiceNowをクライアントアプリとして登録
  - テスト用ユーザーの作成
- ServiceNowの設定
  - Multi-Provider SSO Pluginのインストール
  - ACR (Account Recovery) の有効化 (追記)
  - Multi-Provider SSOの設定
  - Auth0をIdPとして登録
  - テスト用ユーザーの作成
  - Activate
  - 動作確認

今回ServiceNowは無料のDeveloperインスタンスを、Auth0はFreeプランを使用することとします。それぞれを使用できるまでの手順はここでは省かさせていただきます。
#### 1. Auth0の設定
##### 1-1. ServiceNowをSPとして登録
1. ダッシュボードから Applications -> Applications -> Create Application を選択する。 
![FireShot Capture 001 - Applications - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/15670eb1-8c2c-0abf-8146-0dfd9624ba02.png)

2. Create Application ダイアログが開くので、任意の Name を入力 →　Regular Web Applications → Create を選択
![FireShot Capture 003 - Applications - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/70f93950-243e-12f7-3b31-5399d47c70a5.png)

3. 作成が完了すると Quick Start が開くので、 Settings タブに移動し Application URIs の Allowed Callback URLs を設定する。
設定するURLは次のものです。 `https://[yourinstance].service-now.com/navpage.do`
![FireShot Capture 022 - Application Details - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/d02942e9-4e93-437b-b22f-8a24a5b38798.png)


4. 同じく Settings タブ内にある、 Basic Infomation は後述のSericeNowの設定で使用する。必要に応じて控えておく。
![FireShot Capture 004 - Application Details - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/4e318015-5717-6c50-bce4-13f3c604c9a4.png)


##### 1-2. テスト用ユーザーの作成
ユーザーはADなどで管理するケースが多いですが、今回は小規模テストであるためAuth0に直接ユーザーを作成します。

1. User Management → Users を開き、Create Userを選択する。
![FireShot Capture 005 - Users - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/89ac31cd-1222-26ef-0ccf-f6cb804a8b72.png)

2. Create User ダイアログで Email と Password を入力し、Createを選択する。
![FireShot Capture 006 - Users - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/e4669118-0fc8-07fc-4d0c-e1e913c362a1.png)

3. 設定したメールアドレス宛にVerificationメールが届くので、Verificationを済ませておく。
![FireShot Capture 007 - Verify your email.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/19ccb43b-607f-5847-8be0-6778ee0ff85c.png)

4. (オプション)
Nameにはデフォルトでメールアドレス設定されますので、任意の名前に変更しておきます。
![FireShot Capture 008 - User Details - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/2cb44e04-65e2-1bd1-d9cd-bba80127542a.png)


#### 2. ServiceNowの設定
##### 2-1. Multi-Provider SSO Pluginのインストール

ServiceNowにSSO機能を導入するためのPluginをインストールします。
System Application > All Available Application > Allのメニューを開き、"Integration - Multiple Provider Single Sign-On Installer" をインストールします。
![FireShot Capture 010 - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/fff2a12d-e3ac-fe55-265c-00f37586b5a6.png)
![FireShot Capture 011 - Integration - Multiple Provider Single Sign-On Installer - Plugin Det_ - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/d5686717-475a-4948-7788-ff43ba9d8e1c.png)

##### 2-2. ACR (Account Recovery) の有効化

SSOを使用するにあたって、ACR (Account Recovery) の機能を有効化することが必須になっています。
ACRは、SSOログインが成立しなくなってしまった場合に備え、管理者のみローカル認証によるログイン (SSOバイパス) ができるようにする機能です。

ACRのセットアップを行うには、Multi-Provider SSO > Account Recovery > Propertiesのメニューを開きます。
下図の画面が現れますので、Step2.の「Click here」の部分を押下します。
![FireShot Capture 012 - Integration - Multiple Provider Single Sign-On Installer - Plugin Det_ - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/f5539830-dce5-6462-7a1b-2d4103000b83.png)
![FireShot Capture 013 - Account Recovery Properties - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/e416f19f-8123-1190-596f-03944acbe3bc.png)

ACR Userのローカル認証はローカルパスワード + MFAですので、MFAの登録を行います。
Google AuthenticatorなどのTOTPアプリをスマートフォンにインストールし、手順に従いデバイスを登録をします。
![FireShot Capture 015 - Account Recovery Properties - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/cfcbc8ff-8c3c-01a7-3167-e83ef9b4f075.png)

デバイス登録が完了するとEnable account recoveryボタンを押せるようになります。
ボタンを押下してACRの有効化は完了です。
![FireShot Capture 014 - Account Recovery Properties - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/cf328199-a9a5-6e07-c665-141efd06e0e9.png)

##### 2-3. Multi-Provider SSOの有効化

Navigation BarからMulti-Provider SSO > Administration > Propertiesのメニューを開きます。
![FireShot Capture 023 - Multiple Provider SSO Properties - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/5268290a-9e99-7914-f605-7ddf8194fc2b.png)
Enable multiple provider SSO にチェックを入れ、SSO認証を有効化します。

##### 2-4. Auth0をOIDCプロバイダーとして登録

1. Multi-Provider SSO > Identity Providersのメニューを開きます。Newを押下して認証プロバイダーの登録を行います。
![FireShot Capture 016 - Identity Providers - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/4b20f1ef-6100-7bf0-4ab7-ce9458a58248.png)
![FireShot Capture 017 - Identity Providers - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/30f93d55-123f-72d0-8b6f-ffde1d756700.png)

2. OpenID Connectを押下します。
![FireShot Capture 018 - Identity Providers - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/208ff70f-4391-b47c-aa30-2ee8d1677be9.png)

3. しばらく待つとポップアップが現れるので、 **1-1 手順4** で取得した情報を入力します。
![FireShot Capture 019 - New Record - OIDC Identity Provider - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/3240b674-ffa3-d89f-9da3-a2f54fa8420e.png)
`Well Known Configuration URL` は Auth0 ダッシュボード → Applications → Applications → [作成したアプリケーション] → Settings → Advanced Settings → Endpoints → OAuth の OpenID Configuration から確認できます。
![FireShot Capture 020 - Application Details - manage.auth0.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/ee565609-ccf9-3614-48b9-f48412e0c9fc.png)

4. 作成されたら次の設定をします。
 - Automatically provision users
     - SSOでログインされた際にServiceNowのユーザーテーブルにアカウントがなければ自動作成します。(注意: SSOに登録されているユーザーだ誰でもログイン出来るようになるオプションですので、場合によって無効化してください。)
 - Update User on next login
     - 次回ログイン時にSSOから受け取った情報を元にServiceNowに、登録されているユーザーアカウントの情報を更新します。
 - ID Token Datasource
     - SSOから受け取った情報のマッピングなどを定義しているテーブルです。今回のAuth0はサンプルが登録されているためそのままこれを利用します。
     - 社内認証システムなどで別途マッピングの設定が必要な場合の手順は後述します。
 - User roles applied to provisioned users
     - ユーザーアカウントを自動的にプロビジョニングする際に付与するロールを選択します。
今回は guest と言うロールを作成し設定しています。

![FireShot Capture 025 - Auth0_OIDC - OIDC Identity Provider - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/4ae5cb05-ebcb-1cff-6cf7-65c19de4227a.png)
4. ここで、この認証プロバイダのsys_idを取得します。
![Screenshot 2024-12-12 at 16-57-50 Auth0_OIDC OIDC Identity Provider ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/cc70c470-9341-f63f-d312-3069635b7468.png)
sys_idがこの後のユーザー作成で利用します。
5. Update を押下し、設定を反映します。


##### 2-5. テスト用ユーザーの作成
2-4 で `Automatically provision users` を有効化していても、最初のユーザーは作成しておかないとうまくいかないようなのでServiceNow側にユーザーを作成します。

1. All → User Administration → Users から ユーザーテーブルを開き、 New を押下して新しいユーザーを作成します。![Screenshot 2024-12-20 at 12-31-56 Users ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/910e9bf0-ac00-d3d7-2ec7-b18b3d918418.png)

2. ユーザー作成に必要な情報と、`SSO Source`に2-4-4で取得した`sys_id`を`sso:<sys_id>`の形式で入力します。
SSO Sourceフィールドが表示されていない場合、左上のハンバーガーメニューから Configure → Form Layout と進み、項目を追加してください。![Screenshot 2024-12-20 at 12-34-19 Shinko Sasaki User ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/5df80297-7030-02a4-947e-ba146f6c413d.png)

3. Submitを押下してユーザー作成は完了です。

これにて準備が整いましたので、実際にOIDC認証ができるかテストします。


#### 3. 動作確認

実際にOIDCでログインが出来るか確かめます。

プライベートウインドウなどで新しいブラウザを開き、ServiceNowのログインページにアクセスします。
Login with SSOを押下します。
![FireShot Capture 032 - Log in - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/642a5114-08a5-5f11-06bc-fd1462ab7542.png)

User IDを入力してSubmitを押下します。
(ここで入力欄にUser IDと表示されているのは、2-2.にてThe field on the user table...をuser_nameにしたためです。)
![FireShot Capture 037 - Login with SSO - ServiceNow - dev199945.service-now.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/129937d6-de52-65a7-f8a9-844341cda833.png)


Submitを押下すると、入力されたメールアドレスに基づいてUser Tableから該当するユーザーのレコードが特定されます。特定したユーザーのレコードからSSO Sourceの値を読み取って、そのIdPのログイン画面へリダイレクトします。

今回の場合、Auth0の認証画面が現れるので、Auth0にて登録したユーザーのメールアドレスとパスワードを入力しLOG INを押下します。
![Screenshot 2024-12-20 at 14-15-50 Log in My ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/4159fee7-0bad-68a8-9ba8-687764324487.png)


認証が通れば、**2-5**で作成したとしてログイン出来ているのが確認できます。
![Screenshot 2024-12-20 at 14-31-19 ServiceNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983042/9051afe8-84d9-fcb2-5888-058b19f007cb.png)

# OIDC項目のマッピングが必要な場合
今回は **2-4-4** の手順でID Token Databse として Auth0 Example を使用しました。
これはOIDCから提供される情報(名前やメールアドレス)をServiceNowのユーザーデータベースに変換しマッピングするものです。
メジャーなOIDCプロバイダー用のものはいくつか用意されているのですが、所属する会社で使っている認証システムでフォーマットが異なるために情報を取得できない場合、これを作成する必要があります。

こちらの設定をするにあたっては、このフォーラム記事が非常に参考になります。
https://www.servicenow.com/community/community-resources/configure-user-autoprovisioning-in-oidc-single-sign-on-sso-in/ta-p/2779595
(本項は後日追記予定)


# おわりに

今回ほぼほぼ手探りでServiceNowでOIDCによる認証を行う設定を行いました。
ツッコミどころや修正ポイントがあれば優しく教えていただけますと幸いです。

OIDC経由で入ってきたユーザーに別途ロールなどを適切に設定できる仕組みを整備すれば、ServiceNowのユーザー管理に役立つかと思います。

最後まで読んでいただきありがとうございました。

# 参考

https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe

https://qiita.com/tajioka/items/71b272f829a5909a63d0

[Single Sign-on (SSO) 用の OpenID Connect (OIDC) 構成の作成](https://www.servicenow.com/docs/csh?topicname=create-OIDC-configuration-SSO.html&version=latest)

# Special Thanks
記事を執筆するにあたって、[@tajioka](https://qiita.com/tajioka)さんに多大な協力をいただきました。
ありがとうございました。