OpenID Connect Core 1.0(六)使用隱式驗證流

a.thinker發表於2018-10-19

3.2 使用隱式驗證流(Authentication using the Implicit Flow)

本節描述如何使用隱式流程執行驗證。使用隱式流程時,所有令牌從授權終結點返回;不使用令牌終結點返回。

隱式流程主要是由客戶在瀏覽器中使用指令碼語言實現。直接返回Access Token和ID Token到客戶端,這可能會讓他們接觸到終端使用者和應用程式,這些使用者可以訪問終端使用者的使用者代理。授權伺服器不進行客戶端驗證。

 

3.2.1隱式流程步驟(Implicit Flow Steps)

隱式流程動遵循以下步驟:

1、客戶準備一個包含所需的驗證請求的請求引數。

2、客戶端傳送請求到授權伺服器。

3、授權伺服器驗證使用者。

4、授權伺服器獲得使用者同意/授權。

5、授權伺服器將終端使用者返回給客戶端,並使用ID Token,如果需要的話,則可以使用一個Access Token。

6、客戶端驗證ID Token和檢索終端使用者的從屬識別符號。

 

3.2.2 授權終結點(Authorization Endpoint)

當使用隱式流程時,是以3.1.2節定義的授權碼流程的一樣的方式使用授權的終結點,除了在本節中指出的差異。

 

3.2.2.1驗證請求(Authentication Request)

驗證請求是由3.1.2.1節中定義,除了如下驗證請求引數:

response_type

必需的。OAuth 2.0授權處理流程規定的響應型別值,包括返回終結點的引數。使用隱式流時,這個值是 “id_token token” 或 “id_token” 。這兩個值的含義在OAuth 2.0多個響應型別編碼實踐 [OAuth.Responses] 中定義。沒有Access Token值時只返回 id_token 。

注意:雖然OAuth 2.0還定義了隱式流程令牌響應型別值,但OpenID Connect不使用這種響應型別,因而沒有返回ID Token。

redirect_uri

必需的。將發回響應的URI重定向。這個URI必須精確匹配客戶端預註冊的OpenID提供者的一個重定向URI值,匹配執行在 6.2.1節 (RFC3986) (簡單的字串比較) 中描述。當使用隱式流程時,重定向的URI 不能使用 http方案,除非客戶端是一個本地應用程式,在這種情況下,它可能使用 http: 主機名是localhost。

nonce

必需的。用於將客戶端會話與ID Token關聯起來的字串值,並減輕重播攻擊。該值在請求ID Token中是不會修改的。nonec必須足夠複雜,以防止攻擊者猜測。實現說明,請參閱 15.5.2節 。

下面是一個非規範化的,使用隱式流程請求示例,這將是由使用者代理髮送到授權伺服器,為以響應客戶端相應的HTTP 302重定向響應(換行僅用於顯示目的):

  GET /authorize?

    response_type=id_token%20token

    &client_id=s6BhdRkqt3

    &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb

    &scope=openid%20profile

    &state=af0ifjsldkj

    &nonce=n-0S6_WzA2Mj HTTP/1.1

  Host: server.example.com

 

3.2.2.2驗證請求驗證(Authentication Request Validation)

使用隱式流程時,其驗證請求,與在 3.1.2.2節中定義的授權碼流程方式一致。

 

3.2.2.3授權伺服器驗證使用者(Authorization Server Authenticates End-User)

使用隱式流程時,終端使用者執行驗證,與在 3.1.2.3節中定義的授權碼流程方式一致。

 

3.2.2.4授權伺服器獲得使用者同意/授權(Authorization Server Obtains End-User Consent/Authorization)

使用隱式流程時,終端使用者同意,與在 3.1.2.4節中定義的授權碼流程方式一致。

 

3.2.2.5成功的驗證響應(Successful Authentication Response)

使用隱式流程時,驗證響應與在 3.1.2.5節中定義的授權碼流程方式一致。

使用隱式流程時,所有響應引數新增到重定向的URI片段元件中,在 OAuth 2.0有多個響應型別編碼實踐 (OAuth.Responses),除非指定不同的響應模式。

下列引數將從授權終端返回:

access_token

OAuth 2.0的Access Token。該值會返回,除非所使用的 response_type 值是id token。

token_type

OAuth 2.0令牌型別的值。該值必須是Bearer或另一個與授權伺服器協商好了的token_type 值。客戶實現這個配置,必須支援 OAuth 2.0使用的Bearer令牌 (RFC6750)規範。配置僅僅描述了使用Bearer令牌。access_token返回情況相同。

id_token

必需的。ID Token。

state

OAuth 2.0狀態值。如果state引數是出現在授權請求中。客戶端必須確認state值是否等於授權請求時傳入的state值。

expires_in

可選的。從響應發生到Access Token過期時間的秒數。

  OAuth 2.0 (RFC6749) 中4.2.2節,當使用隱式流程沒有code結果返回。

下面是一個使用隱式流成功響應的非規範示例(換行僅用於顯示目的):

  HTTP/1.1 302 Found

  Location: https://client.example.org/cb#

    access_token=SlAV32hkKG

    &token_type=bearer

    &id_token=eyJ0 … NiJ9.eyJ1c … I6IjIifX0.DeWt4Qu … ZXso

    &expires_in=3600

    &state=af0ifjsldkj

 

3.2.2.6驗證錯誤響應(Authentication Error Response)

當使用隱式流程,授權錯誤響應與在 3.1.2.6節中定義的授權碼流程方式一致。

如果終端使用者拒絕了請求,或者終端使用者身份驗證失敗,授權伺服器必須在重定向URI的片段元件中返回錯誤授權響應,OAuth 2.0 (RFC6749) 4.2.2.1中定義的和 OAuth 2.0多個響應型別編碼實踐 (OAuth.Responses),除非指定不同的響應模式。

 

3.2.2.7重定向URI片段處理(Redirect URI Fragment Handling)

由於響應引數在重定向URI片段值中返回,所以客戶端需要讓使用者代理解析片段編碼的值,並將其傳遞給客戶端的處理邏輯以供消費。有關URI片段處理的實現說明,請參閱第15.3節。

 

3.2.2.8驗證響應驗證(Authentication Response Validation)

使用隱式流程時,客戶端必須驗證響應如下:

1、驗證的響應符合第五節 (OAuth.Responses) 。

2、遵循RFC 6749的驗證規則,尤其是4.2.2和10.12部分。

3、按照3.2.2.11部分的ID Token驗證規則。

4、按照3.2.2.9部分的Access Token驗證規則,除非 response_type 使用的值是 id_token。

 

3.2.2.9 Access Token驗證(Access Token Validation)

要驗證帶有ID Token的授權端點發出的Access Token,客戶端應該做到以下幾點:

1、用JWA 中指定的雜湊演算法對access_token的ASCII表示進行雜湊計算,以獲得ID令牌的JOSE Header的alg頭引數。例如,如果alg是RS256,那麼使用的雜湊演算法是SHA-256。

2、取最左邊的一半雜湊和base64url編碼。

3、ID令牌中的at_hash值必須與上一步中生成的值相匹配。

 

3.2.2.10 ID Token(ID Token)

ID Token的內容在第二節中描述。使用隱式流程時,要求以下額外的宣告申請ID Token:

nonce

使用 nonce 宣告在隱式流中是必需。

at_hash

Access Token 雜湊值。它的值是base64url編碼,它是 access_token  值的ASCII表示的八進位制雜湊中最左半部分的編碼,其中使用的雜湊演算法是在ID令牌的JOSE 標頭的alg頭引數中使用的雜湊演算法。例如,如果alg是RS256,用SHA-256將 access_token  值雜湊,然後用最左邊的128位和base64url編碼它們。at_hash值是一個大小寫敏感字串。

如果帶有 access_token值的 ID Token從授權端點頒發 ,當response_type值是id_token token,這是必需的;當response_type值是id_token時 access_token不會使用。

 

3.2.2.11 ID Token驗證(ID Token Validation)

使用隱式流程時,必須以3.1.3.7中定義授權碼流程的同樣方式驗證ID Token的內容,除了在本節中指定的差異。

1、客戶端必須使用JWS的方法來驗證 ID Token 的簽名,其演算法是在JOSE Header的alg頭引數中指定。。

2. 必須檢查nonce 宣告值,以驗證它是否與在認證請求中傳送的值相同。客戶端應該檢查nonce值以防止重放攻擊。檢測重放攻擊的精確方法用於特定客戶端的。

相關文章