我們提供了部分語言的調用API方法,如果您使用別的語言來調用,則需要對該語言加簽。

系統級Header

  • 【必選】X-Ca-Key:AppKey。
  • 【必選】X-Ca-Signature:簽名字符串。
  • 【可選】X-Ca-Timestamp:API調用者傳遞時間戳,值為當前時間的毫秒數,即從1970年1月1日起至今的時間轉換為毫秒。時間戳有效時間為15分鐘。
  • 【可選】X-Ca-Nonce:API調用者生成的UUID,結合時間戳防重復。
  • 【可選】X-Ca-Stage請求API所屬Stage,目前僅支持TEST 、PRE和RELEASE,默認為RELEASE。若您調用非線上環境的API,請一定要指定該參數的值,否則會報URL錯誤。

簽名校驗

  1. 構建加密字符串。
    String stringToSign= 
    HTTPMethod + "\n" + 
    Accept + "\n" + //建議顯示設置Accept Header。當Accept為空時,部分Http客戶端給Accept設置默認值*/*,會導致簽名校驗失敗
    Content-MD5 + "\n" 
    Content-Type + "\n" + 
    Date + "\n" + 
    Headers + 
    Url

    其中,HTTPMethod為全大寫,如POST。AcceptContent-MD5Content-TypeDate如果為空也需要添加換行符\nHeaders如果為空不需要添加\n

    • Content-MD5

      Content-MD5是指Body的MD5值,只有當Body非Form表單時才計算 MD5,計算方式如下。

      String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8"))); //bodyStream為字節數組
    • Headers

      Headers是指參與簽名計算的Header的Key、Value拼接的字符串,建議對 X-Ca 開頭的Header和自定義Header計算簽名。

      說明 以下參數不參與Headers簽名計算:X-Ca-Signature、X-Ca-Signature-Headers、Accept、Content-MD5、Content-Type、Date。

      Headers組織方法如下。

      對參與簽名計算的Header的Key按照字典排序后使用。如果某個Header的Value為空,則使用HeaderKey + “:”+“\n”參與簽名,需要保留Key和英文冒號。示例如下所示。

      String headers =
      HeaderKey1 + ":" + HeaderValue1 + "\n"\+
      HeaderKey2 + ":" + HeaderValue2 + "\n"\+
      ...
      HeaderKeyN + ":" + HeaderValueN + "\n"

      此外,還需要將所有參與簽名的Header的key拼接到一起(用英文冒號分隔,假設此處拼接得到的字符串為Key1:Key2:Key3),且在調用API的HTTP Request中添加對應的Header項,即X-Ca-Signature-Headers : Key1:Key2:Key3

    • URL

      URL指Path+Query+Body中Form參數,組織方法如下。

      對Query+Form參數按照字典對Key進行排序后,按照如下方法拼接,如果Query或Form參數為空,則URL=Path,不需要添加,如果某個參數的Value為空只保留Key參與簽名,等號則不需要再加入簽名。

      String url =
      Path +
      "?" +
      Key1 + "=" + Value1 +
      "&" + Key2 + "=" + Value2 +
      ...
      "&" + KeyN + "=" + ValueN                    
  2. 計算簽名。
    Mac hmacSha256 = Mac.getInstance("HmacSHA256");
    byte[] keyBytes = secret.getBytes("UTF-8");  //App端調用則為App的appsecret;云端API調用則為云云對接的appSecret
    hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
    String sign = new String(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));
  3. 傳遞簽名。
    將計算的簽名結果放到Request的Header中,KeyX-Ca-Signature
  4. 排查簽名錯誤。
    當簽名校驗失敗時,API網關會將服務端的StringToSign放到HTTP Response的Header中返回到客戶端,KeyX-Ca-Error-Message。只需要將本地計算的StringToSign與服務端返回的StringToSign進行對比即可找到問題。

    如果服務端與客戶端的StringToSign一致請檢查用于簽名計算的密鑰是否正確。因為HTTP Header中無法表示換行,因此StringToSign中的換行符都被過濾掉了,對比時請忽略換行符。

  5. 簽名Demo。
    簽名計算的詳細Demo(JAVA)請參見api-gateway-demo-sign-java