OpenID Connect prompt パラメータ概要とKeycloakを用いた動作確認 メモ


* OpenID Connectの`prompt`パラメータとKeycloakを用いたパラメータ動作確認結果について個人用にメモしておく。

## `prompt` パラメータ

* 認可エンドポイントアクセス時に、ユーザー認証が行われる。
* このユーザー認証処理をクライアントアプリから制御するためのパラメータ。

| パラメータ       | 説明                                                         |
| ---------------- | ------------------------------------------------------------ |
| `none`           | ユーザー認証や同意のための画面を表示させない。<br />認証と同意が事前に済んでいる場合、リクエストが成功する。<br />認証・同意が済んでいない場合、認可サーバーはエラー`login_required`、`interaction_required`を返却する。 |
| `login`          | 認証済みの場合も、ユーザー認証を実施させる(再認証)。<br />再認証できない場は、認可サーバーはエラー`login_required`を返却する。 |
| `consent`        | 同意済みの場合も、同意確認を実施させる。<br />同意を取得できない場合、認可サーバーはエラー`consent_required`を返却させる。 |
| `select_account` | 複数のユーザーアカウントから選択することを要求する。<br />ユーザーによるアカウント選択がなされない場合、認可サーバーはエラー`account_selection_required`を返却する。 |



## Keycloakを用いた動作確認

### prompt=none

* **リクエスト**

  ```http
  http://localhost:8080/auth/realms/master/protocol/openid-connect/auth?client_id=python-client&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fauth%2Fcallback%2F&state=322ad1e19de68972457a7f2810fdcf515f4b7de8c9bf8a1605c8392307033720&scope=openid&response_type=code&prompt=none&response_mode=query.jwt&code_challenge=abBCq_ZdER-W-reLmyh4KN7nBNcVPJqAb5vhRK0yVdI&code_challenge_method=S256
  ```

  

* **レスポンス**

  * **ログイン済みの場合**

    ※ログイン画面を表示せず、認可レスポンスが返却される。

    ```http
    http://localhost:8000/auth/callback/?response=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia...8ExBggOdRFHw
    ```

  * **未ログインの場合**

    ```http
    http://localhost:8000/auth/callback?response=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldU...Qe1DTH1g
    ```

    * `response`ペイロード

      ※エラー`login_required`が設定される。

      ```json
      {
        "exp": 1645577786,
        "iss": "http://localhost:8080/auth/realms/master",
        "aud": "python-client",
        "state": "322ad1e19de68972457a7f2810fdcf515f4b7de8c9bf8a1605c8392307033720",
        "error": "login_required"
      }
      ```

      

### prompt=login

* リクエスト

  ```http
  http://localhost:8080/auth/realms/master/protocol/openid-connect/auth?client_id=python-client&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fauth%2Fcallback%2F&state=944acbac8d6863511e105b492e6aae42a9eb4ad40d368510372c9581f0545b3a&scope=openid&response_type=code&prompt=login&response_mode=query.jwt&code_challenge=XUTHhq7aTrSxLHbrjNrvaX73K-rjKJK7aHgCY04oMOw&code_challenge_method=S256
  ```

* レスポンス

  * ログイン済み/未ログインの場合

    ※必ず以下のログイン画面が表示される。

    ![keycloak_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/f31290da-c42a-6feb-24db-7eb1ce239162.png)


### prompt=consent

* リクエスト

  ```http
  http://localhost:8080/auth/realms/master/protocol/openid-connect/auth?client_id=python-client&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fauth%2Fcallback%2F&state=e8bd083e2b9ae45c5e1159820fa9bbe46d76b418c9999a0b0fd5df9fe1cd7992&scope=openid&response_type=code&prompt=consent&response_mode=query.jwt&code_challenge=0bpCd7y_zIm_MDHFio2XPYMFaU02j0oEXHAEucvMrho&code_challenge_method=S256
  ```

  

* レスポンス

  * 同意済み/同意未実施に依らず、下記画面が表示される。※クライアント設定で同意確認チェック必要

    ![keycloak_consent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/335ea83c-2479-0976-742d-68557b6745a9.png)


### prompt=select_accout

* [こちら](https://keycloak.discourse.group/t/does-keycloak-support-prompt-select-account-option-in-oidc-1-0/6346)にあるような振る舞いとなり上手く試せず...



## 参考情報

* [OpenID Connect Core 1.0 incorporating errata set 1](https://openid.net/specs/openid-connect-core-1_0.html)