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沒有。