Cloudflare ダッシュボードへの SSO ログインを Instant Auth にする

# ダッシュボード上で編集可能になりました（以下に記載の API 操作は不要です）
2022 年 8 月 5 日追記
以前に表示されていた `READ ONLY` の表示が消え、ダッシュボード上でも編集可能になりました（以下に記載の API 操作は不要です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b2becba0-3877-2e35-d4ef-9cbd80a4e7e8.png)

# Cloudflare dashboard SSO application

Enterprise のお客様は、Cloudflare ダッシュボードへのログインに SSO を利用することができます。

> [Cloudflare dashboard SSO application · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/applications/configure-apps/dash-sso-apps/)
>
> [Our Plans | Pricing | Cloudflare](https://www.cloudflare.com/plans/#overview)
>
> ![image-20220512154930180](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512154930180.png)

# SSO 有効化後にダッシュボードで確認できる情報

Cloudflare dashboard SSO についてセットアップが完了した場合、「無効 / 有効」を設定から変更できます。

![image-20220512161417690](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512161417690.png)

また、ポリシーの内容は以下のように確認できますが、ダッシュボード上では「READ ONLY」と表示され編集ができません。

![image-20220512161639442](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512161639442.png)

![image-20220512161310599](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512161310599.png)

# Instant Auth なしでの SSO ログイン体験

メールアドレスを入力すると、「Log in with SSO」となります。

![image-20220512162122763](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512162122763.png)

Instant Auth が無効な場合、IdP を選択する画面が表示されますが、今回は Instant Auth を API から有効化して IdP 選択画面がスキップできるかを確認します。

![image-20220512162301175](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512162301175.png)

# API でポリシー設定を確認

ポリシーの設定変更を行うには、API から行う必要があります。

現在の設定情報は、以下のように取得できます。

```shell
  export EMAIL='YOUR_EMAIL'
  export APIKEY='YOUR_APIKEY'
  export ACCOUNT_ID='YOUR_ACCOUNT_ID'
```

```shell
curl -sX GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \
     -H "X-Auth-Email: $EMAIL" \
     -H "X-Auth-Key: $APIKEY" \
     -H "Content-Type: application/json" | jq -r '.result[]|select(.type=="dash_sso")' > dash_sso.json

cat dash_sso.json
```

```json:dash_sso.json
{
  "id": "b46bb9e4-16bc-4b2a-814b-a0bc2accaa36",
  "uid": "b46bb9e4-16bc-4b2a-814b-a0bc2accaa36",
  "type": "dash_sso",
  "name": "SSO App",
  "aud": "da608eac1f62d93cb6bdf4e4e4cb8b27a004fe19e48fc76a75daa1e4479319aa",
  "created_at": "2021-12-02T14:08:33Z",
  "updated_at": "2021-12-02T14:08:33Z",
  "domain": "<org>.cloudflareaccess.com/cdn-cgi/access/sso/saml/xxx",
  "app_launcher_visible": true,
  "saas_app": {
    "consumer_service_url": "https://dash.cloudflare.com/api/v4/saml/acs",
    "sp_entity_id": "dash.cloudflare.com",
    "public_key": "-----BEGIN CERTIFICATE-----\nxxx\n-----END CERTIFICATE-----\n",
    "idp_entity_id": "https://<org>.cloudflareaccess.com",
    "name_id_format": "id",
    "sso_endpoint": "https://<org>.cloudflareaccess.com/cdn-cgi/access/sso/saml/xxx",
    "updated_at": "2021-12-02T14:08:33Z",
    "created_at": "2021-12-02T14:08:33Z"
  },
  "policies": [
    {
      "created_at": "2021-12-02T14:08:33Z",
      "decision": "allow",
      "exclude": [],
      "id": "bbb629bd-7253-458b-bc61-da6934107945",
      "include": [
        {
          "email_domain": {
            "domain": "example.com"
          }
        }
      ],
      "name": "allow email domain",
      "precedence": 2,
      "require": [],
      "uid": "bbb629bd-7253-458b-bc61-da6934107945",
      "updated_at": "2021-12-02T14:08:33Z"
    }
  ],
  "allowed_idps": [],
  "auto_redirect_to_identity": false,
  "session_duration": "24h"
}
```

# API で IdP の ID を取得

[Cloudflare dashboard SSO 用の IdP セットアップ](https://developers.cloudflare.com/cloudflare-one/applications/configure-apps/dash-sso-apps/#step-2--set-up-an-idp)が完了していれば、以下のようなリストが取得できます。

```shell
curl -sX GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/identity_providers" \
     -H "X-Auth-Email: $EMAIL" \
     -H "X-Auth-Key: $APIKEY" \
     -H "Content-Type: application/json" | jq -r '.result[]| {"id": .id, "type": .type, "name": .name}'
```

```json
{
  "id": "31bbbc53-5179-4c1c-8f00-36f8a9d9a740",
  "type": "github",
  "name": "GitHub"
}
{
  "id": "3a49d201-ab04-497f-a84a-774ae244c1a1",
  "type": "google",
  "name": "Google"
}
{
  "id": "432a1b04-3cc3-4fab-93d4-86db7de4956e",
  "type": "okta",
  "name": "Okta"
}
{
  "id": "c4d76441-d0f6-4610-94f1-6f0b830c6813",
  "type": "onelogin",
  "name": "OneLogin"
}
{
  "id": "fe62c63b-835c-4d05-b4e4-2990d1b72b50",
  "type": "onetimepin",
  "name": "gatsby-starter-blog - Cloudflare Pages"
}
{
  "id": "bb2432d1-1c35-4cfd-9474-8494e357d059",
  "type": "onetimepin",
  "name": ""
}
```

# API でポリシー設定を変更（Instant Auth 有効化）

> [SaaS applications · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/applications/configure-apps/saas-apps/)
> Turn on **Instant Auth** if you are selecting only one  login method for your application, and would like your end users to skip the identity provider selection step.

以下の項目を書き換えます。

- `allowed_idps` に先ほどの中から 1 つの IdP の ID を指定
- `auto_redirect_to_identity` を `true` に指定（Instant Auth）

```shell
cat dash_sso.json | jq -r .id | export APP_ID=$(cat)
export IDP_ID='YOUR_IDP_ID' # 今回は Okta 432a1b04-3cc3-4fab-93d4-86db7de4956e

curl -X PUT "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps/$APP_ID" \
     -H "X-Auth-Email: $EMAIL" \
     -H "X-Auth-Key: $APIKEY" \
     -H "Content-Type: application/json" \
     --data '{"name":"SSO App","session_duration":"24h","allowed_idps":["'$IDP_ID'"],"auto_redirect_to_identity":true,"app_launcher_visible":true}'
```

# API でポリシー設定を変更（ポリシー削除）

```shell:
cat dash_sso.json | jq -r .id | export APP_ID=$(cat)
# 該当のポリシーを削除してください
sudo vi dash_sso.json

curl -X PUT "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps/$APP_ID" \
     -H "X-Auth-Email: $EMAIL" \
     -H "X-Auth-Key: $APIKEY" \
     -H "Content-Type: application/json" \
     --data @dash_sso.json
```

# 設定反映をダッシュボードで確認

念のため一度ログアウト・ログインをした後には、以下のような画面が確認できます。

![image-20220512155312954](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512155312954.png)

また、自動的に Okta が選択され、Instant Auth が機能することも確認できました。

![image-20220512163121725](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220512163121725.png)