全部產品
Search
文件中心

Function Compute:為自訂網域名配置JWT認證鑒權

更新時間:Jul 06, 2024

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實現認證的整個商務程序時序圖(使用非對稱式加密演算法),步驟詳細解析如下。

  1. 用戶端向自訂授權服務發起認證請求,請求中一般會攜帶終端使用者的使用者名稱和密碼。

  2. 自訂授權服務讀取請求中的驗證資訊(例如使用者名稱、密碼等)進行驗證,驗證通過之後使用私密金鑰產生標準的token

  3. 自訂授權服務將攜帶token的應答返回給用戶端,用戶端需要將這個token緩衝到本地。

  4. 用戶端向HTTP觸發器發送業務請求,請求中攜帶token

  5. HTTP觸發器使用使用者佈建的公開金鑰對請求中的token進行驗證。

  6. 驗證通過之後,將請求透傳給受保護的函數。

  7. 受保護的函數處理業務請求,並進行應答。

  8. HTTP觸發器將業務應答返回給用戶端。

使用限制

  • 可以使用任何方式來產生和分發JWT,Function Compute通過觸發器配置的Public JWKS來認證JWT。

  • 支援不含kid的JWK。

  • 支援為一個觸發器配置多個JWK。

  • 支援從headerQuery參數(GET)、表單參數(POST)和cookie中讀取Token。

  • 支援將claims作為headerQuery參數(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認證

前提條件

建立自訂網域名

操作步驟

  1. 登入Function Compute控制台,在左側導覽列,選擇進階功能 > 網域名稱管理

  2. 在頂部功能表列,選擇地區,然後在網域名稱管理頁面,單擊目標網域名稱。

  3. 單擊右上方的編輯,在編輯自訂網域名頁面,設定以下配置項,然後單擊儲存

    1. 認證方式選擇為JWT 認證

      image.png

    2. 配置JWKS。

      為自訂網域名配置JWT鑒權,首先需要提供一個有效JWKS(JSON Web Key Set)。您可以自行產生JWKS,或者搜尋JSON Web Key Generator尋找線上可用的產生工具,例如mkjwk.org。如果您已經有pem格式的密鑰,可以藉助工具(例如jwx),將其轉換為JWKS格式。JWKS樣本如下。

      本文以使用mkjwk.org工具產生JWKS為例進行介紹。如下圖所示,選擇Key UseAlgorithmShow X.509,然後單擊Generate產生JWKS。在您的代碼中需要使用Private Key(下圖中①)簽發JWT Token,請妥善儲存。您可以複製Public Key(下圖中②)中的內容填入到控制台中的JWKS的keys數組中。

      image

      本文配置的JWKS樣本如下。

      {
          "keys": [
              {
                  "alg": "RS256",
                  "e": "AQAB",
                  "kty": "RSA",
                  "n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR--dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ",
                  "use": "sig"
              }
          ]
      }
    3. 配置JWT Token。

      選擇token所在位置和token的名稱。token位置支援Header、Cookie、Query參數(GET)和表單參數(POST)。如果token位置選擇為Header,則還需為其指定首碼,Function Compute在擷取Token時,會刪除此首碼。

      image.png

    4. 配置JWT Claim轉換。

      選擇透傳給函數的參數所在位置、參數原始名稱和參數透傳給函數之後的名稱。映射參數位置支援Header、Cookie、Query參數(GET)和表單參數(POST)。

      image.png

結果驗證

在調測工具(本文以Postman工具為例)中,根據自訂網域名的JWT配置,填寫自訂網域名、Token等,驗證是否可以正常通過自訂網域名訪問函數。如下圖所示。

  1. 使用配置JWT認證時產生的Private Key建立JWT Token。

  2. 使用Postman工具驗證自訂網域名是否可以正常訪問。

    1. Function Compute控制台左側導覽列選擇進階功能 > 網域名稱管理,在網域名稱管理頁面擷取自訂網域名。

    2. 在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之間要有一個空格。

    3. 單擊Send,查看返回資訊。image.pngnametofunction為Claim透傳給函數後的名稱。

常見問題

為什麼自訂網域名開啟JWT鑒權之後,訪問網域名稱提示:invalid or expired jwt?

該提示說明JWT鑒權失敗,可能原因如下。

  • 您的Token簽名、格式等非法,導致校正出錯。

  • 您的Token已到期,導致校正出錯。

  • 您的Token中的kid與您在自訂網域名中配置的JWKS不匹配,或者匹配到的JWK不準確,無法正確檢驗Token。

為什麼自訂網域名開啟JWT鑒權之後,訪問網域名稱提示:the jwt token is missing?

該提示說明Function Compute無法根據自訂網域名中的JWT Token配置找到Token,請檢查請求中是否攜帶了Token、Token的位置或Token的名稱是否正確。如果您在配置JWT Token 配置時選擇讀取位置為header,則需要在設定Token時加上去除首碼及空格,否則會報錯。

開啟JWT認證後,是否會產生額外的費用?

不會。Function Compute預設提供的網關相關的功能計費都是在函數調用次數中進行收費,所以不管您是否開啟JWT認證,都不會產生額外的費用。