JWT是一種基于令牌的便捷請求認證鑒權解決方案。用戶狀態信息存儲在token中,由客戶端提供,服務端無需保存,適合Serverless環境。通過用戶綁定在自定義域名上的Public JWKS,函數計算可以實現對到達該域名的請求進行JWT認證。根據域名配置,將claims作為參數傳遞給函數,函數無需實現鑒權邏輯,請求會在網關里校驗,成功才轉發到后端函數。
簡介
JSON Web Token (JWT)是一種開放標準(RFC 7519),定義了一種緊湊且自包含的方式,用于安全地在各方之間傳輸信息,以JSON對象的形式。這些信息可以被驗證和信任,因為它們是數字簽名的。JWT可以使用密鑰(使用HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。
使用限制:
- 函數計算通過JWT認證配置的JWKS來校驗請求中的JWT。
- 支持配置多個JWK。
- 支持從Header,query參數,cookies中讀取Token。
- 支持將claims作為header轉發給函數。
目前函數計算的JWT支持如下算法。
| 簽名算法 | alg取值 |
|---|---|
| RSASSA-PKCS1-V1_5 | RS256 |
配置JWT認證
前提條件
創建自定義域名,且認證方式選擇“JWT認證”。
操作步驟
-
登錄控制臺,在左上角選擇目標地域。
-
在最左的菜單欄中選擇高級功能 > 域名管理。
-
在創建域名頁面,展開認證設置。
-
認證方式選擇JWT認證
-
配置jwks
jwt鑒權需要用戶提供有效的JWKS(JSON Web Set)。您可以使用在線生成工具生成,例如。下文以使用mkjwk.org工具生成JWKS為例說明。
按圖所示選擇Key Use,Algorihm,Show X.509,點擊Generate生成需要的公私鑰和jwks。
-
把public key填入jwks的keys字段里。
-
使用//jwt.io/ 生成請求用的jwt,如圖所示。
- 算法選擇RS256
- playload根據需要配置,但必須有iss字段,值為用戶填的自定義域名(全小寫)
- 公私鑰內容根據b步驟里生成的填寫即可
- 左側生成的“xxx.xxx.xxx”即為合法簽名后的jwt內容
-
配置JWT Token(必填)
在JWT Token 配置配置項中,選擇
token所在位置和token的名稱。token位置支持Header、Cookie、Query參數(GET)。如果token位置選擇為Header,則還需為其指定前綴,函數計算在獲取Token時,會刪除此前綴。 -
配置JWT Claim轉換(可選)
在JWT Claim 轉換配置項中,選擇透傳給函數的參數所在位置、參數原始名稱和參數透傳給函數之后的名稱。注意,這里的claim的名稱指的是jwt的payload里的key。
映射參數位置只支持Header,以下配置的意思是:從jwt的payload中查找MyHeader字段,并把MyHeader的具體值用新的header,這里是HewHeader,透傳給目標函數。目標函數收到的請求的header中就回包含一個新的,key為NewHeader的header。
-
-
測試驗證
curl -v --location --request POST '//mytest.domain.com/' \
--header 'Accept: */*' \
--header 'Host: mytest.domain.com' \
--header 'Connection: keep-alive' \
--header "JwtHeader: MyJwt eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIk15SGVhZGVyIjoiaC12YWx1ZSJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiTXlIZWFkZXIiOiJKb2huIERvZSIsImFkbWluIjp0cnVlLCJpc3MiOiJtb3p5Lm16eWNoYWNvLmVtYWlsIn0.RwbPlMzgIP-ixrMN5o9Xw8q4QYA7R8V6UPMC6iBW3NCzadYmXk469g50QNItVX-x-oDuk7a1VR7M6IHnh_r_UJX5x5IZsD-g7QzKSwVkyn3Gj0pXJnj41Bthcqw82iQbUhfzlZpcLcMN4C0vPLqh9sHAPOHoe-1BkysadNSaGe6b08I34S6IEbBVHunDswJcVqWk8SjxSDyeVUBumZ8Qf6Z4qqNj-jfFvzI4v6J4fLTNA2LCv1_-6c0VDSufnFekkQUrvZEjxIetJ1KgE_tBYheylGtuCGeBWEVlhARAUqC-T1AqM2KC28-O74mSXpxSljiFLB-LuouAFWIvWl2_9w"
如果不傳jwt,函數會返回 Jwt is missing。
如果jwt有誤,函數會返回 Jwt verification fails。
一切正常,函數會正常返回。