JWT是一種基於令牌的便捷請求認證鑒權方案。使用者狀態資訊儲存在token中,由用戶端提供,函數(服務端)無需儲存,是一種Serverless友好的鑒權方式。Function Compute可以通過使用者綁定在自訂網域名上的Public JWKS實現對到達自訂網域名上的請求進行JWT認證。並根據自訂網域名上的配置,將claims作為參數轉寄給函數,函數無需對請求進行鑒權,只需關注商務邏輯即可。
背景資訊
簡介
JWT(JSON Web Token,RFC7519)是一種基於令牌的便捷請求認證鑒權方案。使用者狀態資訊儲存在token
中,由用戶端提供,函數(服務端)無需儲存,是一種Serverless友好的鑒權方式。Function Compute可以通過使用者綁定在自訂網域名上的Public JWKS實現對到達自訂網域名上的請求進行JWT認證。並根據自訂網域名上的配置,將claims作為參數轉寄給函數,函數無需對請求進行鑒權,只需關注商務邏輯即可。如果需要瞭解JWT的token
認證流程及基礎知識,請參見基於JWT的token認證和JWT簡介。
JWT認證流程
自訂網域名的JWT認證流程同HTTP觸發器的JWT認證流程。
上圖是Function ComputeHTTP觸發器利用JWT實現認證的整個商務程序時序圖(使用非對稱式加密演算法),步驟詳細解析如下。
用戶端向自訂授權服務發起認證請求,請求中一般會攜帶終端使用者的使用者名稱和密碼。
自訂授權服務讀取請求中的驗證資訊(例如使用者名稱、密碼等)進行驗證,驗證通過之後使用私密金鑰產生標準的
token
。自訂授權服務將攜帶
token
的應答返回給用戶端,用戶端需要將這個token
緩衝到本地。用戶端向HTTP觸發器發送業務請求,請求中攜帶
token
。HTTP觸發器使用使用者佈建的公開金鑰對請求中的
token
進行驗證。驗證通過之後,將請求透傳給受保護的函數。
受保護的函數處理業務請求,並進行應答。
HTTP觸發器將業務應答返回給用戶端。
使用限制
可以使用任何方式來產生和分發JWT,Function Compute通過觸發器配置的Public JWKS來認證JWT。
支援不含
kid
的JWK。支援為一個觸發器配置多個JWK。
支援從
header
、Query
參數(GET)、表單參數(POST)和cookie
中讀取Token。支援將
claims
作為header
、Query
參數(GET)、表單參數(POST)和cookie
轉寄給函數。Function Compute支援為一個自訂網域名配置一組JWT(JWKS),在JWKS中尋找與token中的kid相同的JWK公開金鑰,並使用這個公開金鑰對token進行簽名校正。一個自訂網域名的JWKS最多隻允許一個JWK的kid不存在或者為空白字串。
目前Function Compute的JWT支援如下演算法。
簽名演算法
alg取值
RSASSA-PKCS1-V1_5
RS256,RS384,RS512
RSASSA-PSS
PS256,PS384,PS512
Elliptic Curve (ECDSA)
ES256,ES384,ES512
HMAC
HS256,HS384,HS512
EdDSA
EdDSA
HMAC簽名演算法為對稱式加密,安全性相對較低,建議使用安全性更高的非對稱式加密演算法。
使用非對稱式加密演算法時,出於安全考慮,您的JWT中只需要包含公開金鑰資訊即可,不建議包含私密金鑰資訊。
建議使用HTTPS來對請求中的
token
等敏感資訊進行保護,可以有效避免Token泄露。
配置JWT認證
前提條件
操作步驟
登入Function Compute控制台,在左側導覽列,選擇 。
在頂部功能表列,選擇地區,然後在網域名稱管理頁面,單擊目標網域名稱。
單擊右上方的編輯,在編輯自訂網域名頁面,設定以下配置項,然後單擊儲存。
認證方式選擇為JWT 認證。
配置JWKS。
為自訂網域名配置JWT鑒權,首先需要提供一個有效JWKS(JSON Web Key Set)。您可以自行產生JWKS,或者搜尋JSON Web Key Generator尋找線上可用的產生工具,例如mkjwk.org。如果您已經有pem格式的密鑰,可以藉助工具(例如jwx),將其轉換為JWKS格式。JWKS樣本如下。
本文以使用mkjwk.org工具產生JWKS為例進行介紹。如下圖所示,選擇Key Use、Algorithm和Show X.509,然後單擊Generate產生JWKS。在您的代碼中需要使用Private Key(下圖中①)簽發JWT Token,請妥善儲存。您可以複製Public Key(下圖中②)中的內容填入到控制台中的JWKS的keys數組中。
本文配置的JWKS樣本如下。
{ "keys": [ { "alg": "RS256", "e": "AQAB", "kty": "RSA", "n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR--dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ", "use": "sig" } ] }
配置JWT Token。
選擇token所在位置和token的名稱。token位置支援Header、Cookie、Query參數(GET)和表單參數(POST)。如果token位置選擇為Header,則還需為其指定首碼,Function Compute在擷取Token時,會刪除此首碼。
配置JWT Claim轉換。
選擇透傳給函數的參數所在位置、參數原始名稱和參數透傳給函數之後的名稱。映射參數位置支援Header、Cookie、Query參數(GET)和表單參數(POST)。
結果驗證
在調測工具(本文以Postman工具為例)中,根據自訂網域名的JWT配置,填寫自訂網域名、Token等,驗證是否可以正常通過自訂網域名訪問函數。如下圖所示。
使用配置JWT認證時產生的Private Key建立JWT Token。
使用Postman工具驗證自訂網域名是否可以正常訪問。
在Function Compute控制台左側導覽列選擇 ,在網域名稱管理頁面擷取自訂網域名。
在Postman的Headers配置Token參數資訊。本文填寫的Token樣本如下。
名稱
值
說明
Key
Authentication
填寫在JWT Token 配置中設定的參數名稱。
Value
Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg
填寫在JWT Token 配置中設定的去除首碼Bearer和上一步產生的JWT Token。Bearer與JWT Token之間要有一個空格。
單擊Send,查看返回資訊。
nametofunction
為Claim透傳給函數後的名稱。