Identity Coud Service(IDCS)とAPEXアプリケーションをシングル・サインオン(SSO)で連携してみた


# はじめに

Identity Cloud Service(以後、IDCS) は、Oracle Cloud(OCI)で提供されているIDaaS(Identity as a Service)で、シングル・サインオン(SSO)や、セキュリティの強化機能として多要素認証、またActive Directory とのユーザー同期などを実現可能な認証・認可サービスです。

一方でOracle Application Express(以後、APEX)は、その名のとおり素早くローコードのアプリケーションを開発できるプラットフォームを提供しています。

今回はIDCSとAPEXアプリをSSOするための素晴らしい技術ブログが見つかったので、こちらを実際にやってみます。
[Integrating SSO between APEX Cloud and Identity Cloud Service the Easy Way](https://www.ateam-oracle.com/integrating-sso-between-apex-cloud-and-identity-cloud-service-the-easy-way)

この記事のよいところ：

- APEXの無償環境で構築済みAPEXアプリを使用。素早く連携を試せる。
- Step by Step の解説で、手順が容易。
- OAuth の解説リンクもある。

# 準備
## APEXサンプルアプリを選択しインストールする

既にサインイン可能なAPEXアプリケーションをお持ちであれば、準備はスキップして次章のSSO設定から始めてください。

[APEXサインインページ](https://apex.oracle.com/ja/) へ移動し、**[無償で開始]**を選択します。次に**[無償ワークスペースのリクエスト]**をクリックします。

![image-20210104092039810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/f95455de-e882-e6ca-89c3-874b0341ede7.png)
名前や、電子メール、ワークスペース名等の必要情報を入力しワークスペースをリクエストします。
![image-20210104093545113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5d902f45-8e8e-81a1-ff6d-a5297cb020eb.png)
ワークスペースをアクティベートするための電子メールが届くので、**[Create Workspace]** をクリックしワークスペースを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/bc91d0e1-2b64-883a-a621-d4c4cb8623a8.png)
続けてパスワードを設定しサインインします。
![image-20210104095116395.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/4ff69dfc-335d-c2a2-e039-40ffa2149713.png)
サインインできたら、**[アプリケーション・ギャラリ]**へ移動し、**Group Calendar** を検索します。
![image-20210104095524097.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/019f5791-2b06-0859-0521-2733b331f04e.png)
![image-20210104095548664.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/05a7460b-20b5-1e9d-0a2f-e6f67dfc1483.png)
**Group Calendar**をインストールします。
![image-20210104095617131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/c7ba6395-111a-6aad-5321-a2c79d0a6152.png)
![image-20210104095731223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/550bdb30-f3e4-ea70-f564-0482bd936b53.png)

**管理アイコン**をクリックし、**アプリケーションのロック解除**をおこないます。
![image-20210104095822732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/aa8fe804-cc10-fd6f-ba7a-2848c3c039ab.png)
![image-20210104095830008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/45058387-838e-9e46-3b90-3857b37da875.png)

**Playボタン**をクリックし、**Group Calender** にサインインします。
![image-20210104103208947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/dc4df352-f484-c41b-1b27-efb31849e62a.png)

**Group Calendar** にサインインできました！
![image-20210104100111371.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/dfcffb32-3206-f22b-4a8b-b5b8696ea20e.png)
このアプリをIDCSとシングルサインオンするためには、サインイン時のURLに含まれる情報が必要です。後述のIDCSのアプリケーション登録時に使用するため、**サインイン時のURLはアプリケーションIDまで含めて保持しておいてください。以下の例では 92476 がアプリケーションIDに該当します**

例) https://apex.oracle.com/pls/apex/idcs_apex-ws/r/92476/ --- 以降は省略 ----

# SSO設定
## IDCSにAPEXアプリを追加登録
### 前提

- IDCSのテナントと管理者権限が必要です。
- テナントについて
  URLパラメータ https：//idcs-<guid>.identity.oraclecloud.com の <guid>は、テナント用に自動的に作成される一意の識別子を意味します。 
  例) https://idcs-8a68f8f344c749ad91ee182ee84f33das.identity.oraclecloud.com
  ここでは、
  8a68f8f344c749ad91ee182ee84f33das がテナントの識別子を表します。

### 設定の方式

- IDCSの機密アプリケーション(Confidential Application)を設定しAPEXアプリを登録します。
- OpenID Connectプロトコルを介してOAuth2クライアントとしてAPEXアプリ(Group Calander)とSSOします。

IDCSに管理者としてサインインします。
![image-20210104150714895.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/7a431071-2925-b960-d58a-5d9efce32568.png)

**アプリケーション** を選択、上部の**追加**をクリック。
![image-20210104150900251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/ee7c8914-1487-1ddd-86a5-9b84d4af7b45.png)

### 機密アプリケーションの追加
**アプリケーションの追加** から**機密アプリケーション** を選択。
![image-20210104151040032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/05d1771b-465c-c9f6-e074-34bc2c8f57ab.png)

#### 1. 詳細の設定
アプリケーションの詳細項目を入力します。
![image-20210104162231732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0a8f5f03-d08e-f113-d7d7-49e8490efbf2.png)
**[名前]** 任意の名前を入力
**[アプリケーションURL]** APEXアプリケーション(Group Calendar)を作成した際に保持しておいたURLの情報をベースに、アプリケーションへサインインするためのURLを指定します。
例) https://apex.oracle.com/pls/apex/f?p=92476

補足）APEX Syntax の詳細情報は、以下を参照ください。
[アプリケーション・ページURLについて](https://docs.oracle.com/cd/E86255_01/HTMDB/understanding-url-syntax.htm#GUID-F249FDCA-972B-4DFB-A51B-DD127AAB9C35)

#### 2.クライアントの設定
続けて、クライアント項目を設定します。
![image-20210104162411163.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/85c494c3-3417-17d5-4fef-6063d45fb970.png)
**認可コード** チェックします。
**[リダイレクトURL]** 以下を指定
https://apex.oracle.com/pls/apex/apex_authentication.callback
**[ログアウト後のリダイレクトURL]** アプリケーションURLを指定
例) https://apex.oracle.com/pls/apex/f?p=92476

#### 3.リソースの設定
**次**でスキップ
![image-20210104162528498.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/2afe1194-f255-4509-d31f-b700d6b1e975.png)

#### 4.Web層ポリシーの設定
**次**でスキップ
![image-20210104162622664.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/3a0d2f13-777e-0b03-09c0-06a063d00bff.png)

#### 5.認可の設定

**終了** をクリックすると、**アプリケーションが追加された** とのメッセージが表示される。
![image-20210104162719390.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/24f28947-48f5-33ab-5e3e-6c77e0f52500.png)

クライアントID と、クライアント・シークレットは保存しておきます。
![image-20210104162853750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/900a5ed5-bc60-c7a5-41b8-41763bf0fd7b.png)

アプリケーションを有効化します。
![image-20210104162953927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5cd75eb7-c3ef-3be0-c22b-a5cb408ed72a.png)

以下のようにIDCSのアプリケーションへ機密アプリケーションが作成され登録が完了しました。
![image-20210104163136177.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/d6707db6-28d7-62fe-f02c-79a099f58282.png)

## APEXの設定
### 1. APEXアプリにWeb資格証明を作成
**アプリケーション・ビルダー** をクリック
![image-20210104165506751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/aeeddf0b-5b07-d9c6-8c7e-028a951f650d.png)

続けて、**ワークスペース・ユーティリティ** をクリックします。
![image-20210104170316560.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5a3adbcf-f100-d7aa-1d4b-c3cf76e78034.png)

**Web資格証明** をクリックし、**作成** へ進みます。
![image-20210104170531473.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/3ecd5152-b43e-3039-87aa-d96729f183a1.png)
![image-20210104170620152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/96617dd3-09d7-e410-b3ea-05d7ddf9fa99.png)
**[名前]** 任意の名前を入力
**[認証タイプ]** **基本認証**を選択
**[クライアントIDまたはユーザー名]** IDCSに機密アプリケーションを追加した際に保持しておいた、**クライアントID**を貼り付けます。
**[クライアント・シークレットまたはパスワード]** IDCSに機密アプリケーションを追加した際に保持しておいた、**クライアント・シークレット**を貼り付けます。
**[クライアント・シークレットまたはパスワードの確認]** IDCSに機密アプリケーションを追加した際に保持しておいた、**クライアント・シークレット**を貼り付けます。

**Web資格証明** が**作成** されました。
![image-20210104171407296.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/37b58e44-0408-77b8-567c-1e74ae7c24d9.png)

### 2. 認証スキームの作成
**アプリケーション・ビルダー** 画面から **Group Calendar** の**編集(ペンのマーク)**を選択します。
![image-20210104171729034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/19e18d85-25ce-093a-da93-e8580aea8f2d.png)
**共有コンポーネント** をクリックし、**セキュリティ**項目から**認証スキーム**を選択
![image-20210104171930201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/17be8fcf-faa9-f730-aca1-25d9ee9e3a4f.png)

続けて、**認証スキーム** を作成します。
![image-20210104172118675.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/beb704ad-7cb8-5ee0-59f9-4bd865a91ebc.png)
![image-20210104172343507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/ff1b6836-9332-3b7f-3c42-e0baab3e2f5a.png)
**[名前]** 任意の名前を入力
**[スキーム・タイプ]** **ソーシャル・サインイン**を選択
**[資格証明ストア]** **IDCS Web Credentials** を選択
**[認証プロバイダ]** **OpenID Connect プロバイダ** を選択
**[検出URL]** **https://idcs-<guid>.identity.oraclecloud.com/.well-known/openid-configuration** を入力
例) https://idcs-8a68f8f344c749ad91ee182ee84f33da.identity.oraclecloud.com/.well-known/openid-configuration
**[有効範囲]** **profile** を選択
**[ユーザー名]** **sub** を選択
**[ユーザー名の大文字への変換]** **いいえ** を選択

**認証スキームの作成** を実行し、作成されました。
![image-20210104172432884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/83565c30-9afc-a4cf-1041-872cf067184a.png)

作成された認証スキーマをクリックし、**ログアウト後URL**にURLを追加し、変更の更新をします。
![image-20210104172716835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/f3655235-95e6-3bda-7223-acdebb30e89f.png)
**[URL]** IDCSのクライアント設定時の[ログアウト後のリダイレクトURL]と一致する必要があります。
例) https://apex.oracle.com/pls/apex/f?p=92476

# 動作確認
SSOの設定がすべて完了したので、APEXアプリケーション（Group Calender）にアクセスしてSSOが有効になるかを確認します。
ブラウザから Group Calender のアプリケーション番号を含む URL でアクセスします。
例) https://apex.oracle.com/pls/apex/f?p=92476

IDCSのサインイン画面が表示されて、SSOの設定が有効になっていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/76233642-4986-510e-a723-52a5294f0222.png)

ユーザー名、パスワードを入力すると、IDCSの認証に成功し Group Calneder が表示されました。右上端にはIDCSと同じユーザー名が表示されています。
![image-20210107170631594.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/f2e2b3d8-5666-efa8-3f20-03a9534d8a47.png)

IDCS と APEX の SSO設定が完了しました！