OktaをIdPとしてAuth0にSAMLでログインする

# はじめに

Auth0を組み込んだアプリケーションへの認証でOktaを使ったSSOを設定する。[Okta Workfowce Enterprise Connection](https://auth0.com/docs/authenticate/identity-providers/enterprise-identity-providers/okta) もあるけど、こちらはOpenID Connectを使っていて、それがいけないわけではないが、今回はある事情でSAMLを使った設定をしたいと思う。

# 設定してみる

## Okta設定

### 1. Applications > Applications から [Create App Integration] をクリック

![Screenshot 2024-07-23 at 4.24.45 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/549082c4-57a7-8287-08b7-aa92302191b5.png)

### 2. SAML 2.0を選択して [Next] をクリック

![Screenshot 2024-07-23 at 4.25.00 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/15f5bd9d-b85f-8a32-29ac-a0ff382d7eb0.png)

### 3. アプリケーション名を入力して [Next] をクリック

![Screenshot 2024-07-23 at 4.25.48 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/3144abec-d81f-1ba6-9b41-61fef42dc726.png)

### 4. SAMLの基本設定を入力

Generalの設定項目に以下の値を入力

**Single Sign-On URL**: `https://{yourAuth0Domain}/login/callback?connection={yourAuth0ConnectionName}`

**Audience URI (SP Entity ID)**: `urn:auth0:{yourAuth0TenantName}:{yourAuth0ConnectionName}`

| 変数名 | 説明 |
| --- | --- |
| `{yourAuth0Domain}` | Auth0ドメイン（例 mytenant.us.auth0.comもしくはカスタムドメイン） |
| `{yourAuth0ConnectionName}` | Auth0で作成したSAML Enterprise Connectionの名前 |

ということで、先にAuth0側で作成するEnterprise Connectionの名前を決めておきましょう。**Oktaのorg名** にしておくとユニークな接続名として扱えて良いかも。

![Screenshot 2024-07-23 at 5.25.11 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/af6722c1-89fb-819c-c69b-08070ea3f7a0.png)

上記以外はデフォルトのままでOK

### 5. Attribute設定して [Next] をクリック

後でAuth0にマッピングするための情報を属性情報（Attribute）で指定
今回は基本的な情報のみだが、他にもDepartmentやTitle, primaryPhone等のプロファイル情報をマッピングすることも可能

![Screenshot 2024-07-23 at 5.25.18 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/5abf65f1-16a9-65d8-45bf-81625aa6df38.png)

| Name | Value | 説明 |
| --- | --- | --- |
| `FirstName` | `user.firstName` | 名 |
| `LastName` | `user.lastName` | 姓 |
| `DisplayName` | `user.displayName` | 表示名（名＋姓） |
| `Email` | `user.email` | メールアドレス |
| `ExternalId` | `user.getInternalProperty("id")` | ユニークユーザーID（`00xxXXxxxxXxxxXXxxxx` のようなOktaの内部ユーザーID） |

### 6. アプリケーションについてのFeedbackを入力

![Screenshot 2024-07-23 at 5.38.45 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/7f282d79-f8c0-7d67-6a84-a6480378eaf3.png)

OIN (Okta Integration Network) に登録するわけではないので **I'm an Okta customer adding an internal app** および **This is an internal app that we have created** をチェックして [Finish]

### 7. ユーザーをアサイン

![Screenshot 2024-07-23 at 6.31.12 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/8d81dc81-de4e-8c66-9d16-6ebde71af005.png)


Assignmentsタブでアプリケーションを利用するユーザーもしくはグループをアサイン

### 8. [View SAML setup instructions] をクリック

![Screenshot 2024-07-23 at 5.48.14 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/c782a910-9aba-7ce4-2df6-b94d3004908c.png)

### 9. [Download certificate] をクリックして証明書をダウンロード

![Screenshot 2024-07-23 at 5.52.22 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/89e6fc52-a645-3978-4c4e-464747f09d23.png)

後でAuth0の設定で使うので **Identity Provider Single Sign-On URL** も控えておこう

これでOkta側の設定はおしまい
続いてAuth0の設定をしよう

## Auth0設定

### 1. Authentication > Enterprise から [SAML] を選択して新規作成

![Screenshot 2024-07-23 at 4.26.50 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/690cb5aa-8974-eb2d-21ab-174b5c3a57ae.png)

![Screenshot 2024-07-23 at 5.45.01 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/5ec93205-6f64-eee3-d950-93e9a3789ad3.png)

### 2. SAML接続設定を入力して [Create]

![Screenshot 2024-07-23 at 6.13.43 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/a81f92b1-211a-4618-d44b-8b54abc8986c.png)

| 設定項目 | 値 |
| --- | --- |
| **Connection name** | Okta設定の際に予め決めておいた `{yourAuth0ConnectionName}` を指定 |
| **Sign In URL** | Okta設定No.9で取得した **Identity Provider Single Sign-On URL** を指定 |
| **X509 Signing Certificate** | Okta設定No.9でダウンロードした証明書をアップロード |
| **EnableSign Out** | オフにする |
| **User ID Attribute** | `ExternalId` |
| **Sign Request Algorithm** | `SHA-256` |
| **Sign Request Algorithm Digest** | `SHA-256` |
| **Protocol Binding** | `HTTP-POST` |

### 3. Login Experience設定

![Screenshot 2024-07-23 at 6.16.42 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/06ae8aa7-4c2f-a9fe-c01d-03583b0a06e8.png)

**Home Realm Discovery** にOktaを使ってログインするユーザーのメールアドレスドメインを入力

### 4. IdP-Initiated SSOを許可

![Screenshot 2024-07-23 at 6.18.40 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/6bef855c-28c3-3c6a-95e0-5d78a6a9fa81.png)

デフォルトのアプリケーション名やプロトコルを指定

### 5. Mappings設定

![Screenshot 2024-07-23 at 6.20.04 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/69d738f3-f775-6aac-ffd9-c95e36ff524e.png)

OktaのAttributeとAuth0のユーザープロファイルマッピングを以下のJSON指定

```json:
{
  "name": "DisplayName",
  "email": "Email",
  "given_name": "FirstName",
  "family_name": "LastName"
}
```

### 6. 有効にするアプリケーションを指定

![Screenshot 2024-07-23 at 6.23.05 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/c0a81fc6-87c7-eae4-deda-b29f1e9924c0.png)

### 7. Authentication > Authentication Profile で [Identifier First] を指定

![Screenshot 2024-07-23 at 6.25.30 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/8b9e3a24-5ab6-adf4-540b-cb07e505abff.png)

これを指定するとログインボックスでメールアドレスだけ先に入力してドメインからログイン方法を判別してOktaのログイン画面にリダイレクトする **Home Realm Discovery** が有効になる

以上でAuth0の設定は完了

# 実際にログインしてみる（SP-Initiated）

Auth0でのログイン画面でメールアドレスを入力すると...

![Screenshot 2024-07-23 at 6.39.22 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/d4a0c8e9-1642-1a2c-2e1b-8cbc25823a02.png)

Oktaログイン画面にリダイレクトされる

![Screenshot 2024-07-23 at 8.50.54 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/d6cd5326-f3df-72e8-27cb-0ab771105f19.png)


その後、ログイン成功（スクショ略）

ユーザーも作成されている

![Screenshot 2024-07-23 at 8.29.25 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174837/37fbeffa-d679-d30e-6880-c82eaa44c1da.png)

IdP-Initiatedもできるようになっているので、Oktaダッシュボードからアイコンクリックすればログインできるようになっているはず

# おわり

ということで、多少設定項目は多いかもしれないけどそんなに難しくなくポチポチやっていけば設定できた。
反省点としては `email_verified` が `false` になってしまうので、うまいこと `true` にするような設定を模索できればと思う。OktaからAttributeとして渡せればそれが一番だけど、どう設定すればいいかはこれから調べていこう。

## 参考にしたドキュメント

[Connect Your App to SAML Identity Providers | Auth0](https://auth0.com/docs/authenticate/identity-providers/enterprise-identity-providers/saml)

[Configure Okta as SAML Identity Provider | Auth0](https://auth0.com/docs/authenticate/protocols/saml/saml-sso-integrations/configure-auth0-saml-service-provider/configure-okta-as-saml-identity-provider)

[SAMLアプリ統合を作成する | Okta](https://help.okta.com/oie/ja-jp/content/topics/apps/apps_app_integration_wizard_saml.htm)