Cloudflare Zero Trust で Microsoft Entra ID の再認証時に必要な対話操作を強制する

# 目的
Cloudflare Zero Trust と Microsoft Entra ID を使って、以下のような認証フローを確認します。

> - [Azure AD® - Force user interaction during WARP reauthentication · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/idp-integration/azuread/#force-user-interaction-during-warp-reauthentication)
> You can require users to re-enter their credentials into Azure AD whenever they re-authenticate their WARP session. To configure this setting, make a PUT request and set the prompt parameter to either `login` or `select_account`.

```mermaid:
graph TB

Cloudflare

Session{"Valid Session?<br>(at Entra)"}
SessionNone{"Valid Session?<br>(at Entra)"}

Login["Force to enter the credentials<br>'Sign in form'"]
Select["Interrupt with account selection<br>'Pick an account'"]

Error[Authentication Error<br>with AADSTS50058]
Silent[Login silently by using Single-Sign On]
Normal[Interactive Login Process]

Cloudflare --> |prompt=none|SessionNone
SessionNone --> |No|Error
SessionNone --> |Yes|Silent
Session --> |Yes|Silent
Session --> |No|Normal

Cloudflare --> |prompt=login|Login --> Normal
Cloudflare --> |No option|Session
Cloudflare --> |prompt=select_account|Select ---> |Selected Account|Session
```

# 参考：Microsoft Entra ID で再認証時に必要な対話操作を強制するには
以下の `prompt` オプションをつけてリクエストすることで、
シングルサインオンするごとに必要なユーザ対話操作の種類を指定できます。

> - [Microsoft ID プラットフォームと OAuth 2.0 認証コード フロー - Microsoft identity platform | Microsoft Learn](https://learn.microsoft.com/ja-jp/entra/identity-platform/v2-oauth2-auth-code-flow)
`prompt`（省略可能）：ユーザーとの必要な対話の種類を指定します。 有効な値は、login、none、consent、select_account です。
>   - `prompt=login` を指定すると、ユーザーはその要求に対して自分の資格情報の入力を強制され、シングル サインオンが無効になります。
>   - `prompt=none` はその逆です。 これを指定すると、ユーザーに対して対話形式のプロンプトは表示されません。 シングル サインオンを使用して確認なしで要求を完了できない場合は、Microsoft ID プラットフォームから `interaction_required` エラーが返されます。
>   - `prompt=consent` を指定すると、ユーザーがサインインした後で OAuth 同意ダイアログが表示され、アプリへのアクセス許可の付与をユーザーは求められます。
>   - `prompt=select_account` を指定すると、シングル サインオンは中断され、まったく別のアカウントの使用を選択するためのオプションとして、セッション内または記憶されているアカウント内のいずれかにある全アカウントを一覧表示するアカウント選択エクスペリエンスが提供されます。

# Cloudflare Zero Trust で再認証時に必要な対話操作を強制するには
以下の PUT メソッドで `config` 内の `prompt` パラメータとして指定できます。

- [Update an Access identity provider - Cloudflare API Documentation](https://developers.cloudflare.com/api/operations/access-identity-providers-update-an-access-identity-provider)

以下のコマンドで適用できます。

- [HTTPie を Cloudflare API / GraphQL 用に設定する #cloudflare - Qiita](https://qiita.com/khayama/items/1738c3b98e9c4108a35d)

https://gist.github.com/kyouheicf/ed76ee02413ce8b4fc7f4ab5c867c907


## `"prompt": "login"`
Microsoft Entra ID 側で有効なセッションが残っていても、再度ログイン処理を強制的に要求されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/86cce063-2aec-29e5-d514-7f19435e2fd3.png)


## `"prompt": "select_account"`
アカウント選択画面が強制的に要求されます。
Microsoft Entra ID 側で有効なセッションが残っている場合、そのまま `Signed in` ユーザを選択すれば、特にログイン処理は強制されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/3e144936-ce4c-6d9c-0cf5-d00b06f7d7f2.png)

## `"prompt": "none"`

Microsoft Entra ID 側で有効なセッションが残っていれば、特に強制的にログインやアカウント選択の画面で要求されることはありません。

Microsoft Entra ID 側で有効なセッションが残っていない場合には、 `AADSTS50058` エラーとなります。

（Cloudflare Zero Trust 経由で対話ログイン操作を求めることはないため、常に Microsoft Entra ID 側で先にログインしてある必要があります。）

> - [Microsoft Entra 認証と承認のエラー コード - Microsoft identity platform | Microsoft Learn](https://learn.microsoft.com/ja-jp/entra/identity-platform/reference-error-codes)
AADSTS50058	
UserInformationNotProvided - シングル サインオンに関するセッション情報が不十分です。 これは、ユーザーがサインインしていないことを意味します。 これは、ユーザーが認証されておらず、まだサインインしていないときに想定される一般的なエラーです。
ユーザーがその前にサインインした SSO のコンテキストでこのエラーが発生する場合は、SSO セッションが見つからなかったか無効であったことを意味します。
`prompt=none` が指定されている場合、このエラーがアプリケーションに返される可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/a0fb5de2-6b20-ed75-a390-7c346ddb3e48.png)


## 参考：`"prompt": "consent"`
ちなみに `consent` は指定できず、上記の3つのいずれかを指定する形です。

```json:
{
    "errors": [
        {
            "code": 12130,
            "message": "access.api.error.invalid_request: prompt is invalid, must be one of the following: login, none, select_account"
        }
    ],
    "messages": [],
    "result": null,
    "success": false
}
```