OpenID Connect - 使用 prompt 參數

OpenID Connect 是一個身分驗證的協定,裡面定義了非常多流程與參數。其中 prompt 參數最近剛好有機會應用到,來寫個筆記。

我主要使用 Hydra 做為範例,來說明這個參數的用途。

OpenID Connect 定義了 Authentication Request,做為啟動 OP(OpenID Connect Provider)身分認證流程的請求。

裡面有定義許多參數就不提了,主要要講的是 prompt,原文定義如下:

OPTIONAL. Space delimited, case sensitive list of ASCII string values that specifies whether the Authorization Server prompts the End-User for reauthentication and consent.

這段內容大概可以了解這個參數的幾個特性:

  • 值是預定義好的,所以是從數個選擇裡找出自己想要的
  • 此參數為可選,因此沒給這個參數的時候,應該會是預定義的其中一個選擇(但事實上這件事沒被定義)
  • 它會要求 Authorization Server 要不要提示使用者做「重新驗證」或「重新授權」

預定義的值如下表:

Value Description
none The Authorization Server MUST NOT display any authentication or consent user interface pages. An error is returned if an End-User is not already authenticated or the Client does not have pre-configured consent for the requested Claims or does not fulfill other conditions for processing the request. The error code will typically be login_required, interaction_required, or another code defined in Section 3.1.2.6. This can be used as a method to check for existing authentication and/or consent.
login The Authorization Server SHOULD prompt the End-User for reauthentication. If it cannot reauthenticate the End-User, it MUST return an error, typically login_required.
consent The Authorization Server SHOULD prompt the End-User for consent before returning information to the Client. If it cannot obtain consent, it MUST return an error, typically consent_required.
select_account The Authorization Server SHOULD prompt the End-User to select a user account. This enables an End-User who has multiple accounts at the Authorization Server to select amongst the multiple accounts that they might have current sessions for. If it cannot obtain an account selection choice made by the End-User, it MUST return an error, typically account_selection_required.
  • none 要求強制不顯示,所以當條件未達成,需要顯示登入頁或授權頁的時候,它將會回傳錯誤訊息
  • login 與蠻明確的,即便曾完成身分驗證,一樣要顯示登入頁
  • consent 類似 login,即便曾完成授權,當帶入這個值就必須要顯示授權頁
  • select_account 讓使用者從多個帳號中做選擇
  • 上面有提到,prompt 參數為可選,當沒有這個參數的時候,它預設的行為即為:若身分驗證或授權曾經通過,就會 by pass 對應的流程。

應用

使用情境:在某些情況下,可以從後端取得一次性的登入 token,而這個 token 會做為登入參數的一部分,讓 Authorization Server 知道這次 Request 是必須要改用 Token 做為身分驗證的方法。

正常在 Hydra 的流程裡,若第一次使用 A 使用者的 token 登入後,在登入狀態下,再強制換 B 使用者的 token 登入會發生下面的錯誤訊息。這是因為 Hydra 會認為 A 未登出的狀態下,是不能換 B 使用者的。

Subject from payload does not match subject from previous authentication

一種方法是使用 select_account 做多帳號切換,但目前 Hydra 並不支援。那另一種方法就是使用 prompt=login 來強制讓 Hydra 忽略前一個登入狀態。

參考資料