PKCE及令牌安全

PKCE:全稱“Proof Key for Code Exchange,交換代碼的驗證密鑰”,是為了增強授權碼流的安全性。PKCE 通過在授權端點和令牌端點之間增加代碼驗證器和代碼挑戰機制,確保授權碼的安全性。

令牌安全包括:訪問令牌(Access Token)的安全及身份令牌(ID Token)的安全。


授權端點的PKCE處理

在授權端點(Authorize Endpoint)中加入一個客戶端對本次請求設定的一個值。在獲得授權碼后用授權碼調用令牌端點(Token Endpoint)需提供此值。 此值是機密的且每次應不一樣,這樣加強獲得身份令牌(ID Token)及訪問令牌(Access Token)過程的安全性。

假設在一次授權請求準備使用一個隨機值:ABC24N5Y20R1135#$$。中央授權中心要求為長度為12-128的單字節組成的字符串。

使用SHA256處理并用Base64Url編碼后得到值:
        pkFm6Ptni_ZLVuAqhP9Le-opQRitqg38rxT-oQi7Jw8

GET /connect/authorize?
    client_id=client1&
    scope=openid profile foxconn civet.api.msg&
    response_type=code&
    redirect_uri=https://mybu.foxconn.com/callback&
    state=abc&
    code_challenge=pkFm6Ptni_ZLVuAqhP9Le-opQRitqg38rxT-oQi7Jw8&
    code_challenge_method=S256

(刪除了URL編碼,并添加了換行符以提高可讀性)


令牌端點的PKCE處理

在令牌端點(Token Endpoint)中POST請求中,加入參數 code_verifier,值為授權端點傳入的原值ABC24N5Y20R1135#$$

POST /connect/token

    client_id=client1&
    client_secret=secret&
    grant_type=authorization_code&
    code=[授權端點重載頁面時帶上的code參數值]&
    redirect_uri=https://mybu.foxconn.com/callback&
    code_verifier=ABC24N5Y20R1135#$$

在 PKCE 模式下使用 client_secret 的必要性

在 PKCE 模式下,雖然可以不使用 client_secret,但這可能不夠安全。PKCE 本身通過代碼驗證器和代碼挑戰機制增強了授權碼流的安全性,特別是對公共客戶端(如移動應用)而言。然而,對于可信客戶端(如服務器端應用),不使用 client_secret 可能導致客戶端被冒用,從而無法保證客戶端的真實性和安全性。

中央授權中心通常要求每個客戶端都使用 client_secret(通過控制Client的RequireClientSecret參數實現),以確保每個客戶端的真實性來防止被冒用。因此,盡管 PKCE 增加了額外的安全措施,但在適用的情況下,仍建議使用 client_secret 以提供更高的安全保障。


使用 oidc-client.js 的注意事項

1) oidc-client.js 是前端 JavaScript 代碼,存在跨域調用的安全風險。

2) 中央授權中心調用令牌端點時,要求必須使用 client_secret (原因如上) ,前端調用 client_secret 會被洩露。

3) 在開發實踐中,單獨顯示用戶基礎信息的頁面意義不大,通常需配合服務器后端接口一起使用來顯示各系統更多內容。 為了安全,中央授權中心建議獲取Token功能以及與其它系統的WebAPI交互功能在服務器后端代碼實現。

介於以上原因,中央授權中心不提供oidc-client.js調用功能


授權類型與響應類型關係
授權類型grant_type 響應類型response_type 說明
授權碼模式 authorization code code 請求授權碼
隱式授權模式 implicit id_token 請求身份令牌(僅允許身份范圍)
隱式授權模式 implicit token 請求訪問令牌(僅允許資源范圍)
隱式授權模式 implicit id_token token 請求身份令牌和訪問令牌
混合模式 hybrid code id_token 請求授權代碼和身份令牌
混合模式 hybrid code id_token token 請求授權代碼,身份令牌和訪問令牌

中央授權中心致用于為token(訪問令牌,Access Token)建立一套安全的訪問機制,所以不支持隱式授權模式和混合模式。

根據OIDC 1.0的標準文檔,中央授權中心通過控制AllowedGrantTypes參數值來實現。

Access Token是用于WebAPI的Bearer安全驗證的令牌。

ID Token是身份令牌,可通過設定Client參數Always Include User Claims In IdToken值為true,來實現ID Token搭載完整的用戶信息。但會增加接口返回值的長度。

Access Token 與 ID Token 在格式上的明顯區別在于: Access Token有scopes的申聲(Claim),而ID Token沒有。