我們提供了部分語言的調用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錯誤。
簽名校驗
- 構建加密字符串。
String stringToSign=
HTTPMethod + "\n" +
Accept + "\n" + //建議顯示設置Accept Header。當Accept為空時,部分Http客戶端給Accept設置默認值*/*,會導致簽名校驗失敗
Content-MD5 + "\n"
Content-Type + "\n" +
Date + "\n" +
Headers +
Url
其中,HTTPMethod為全大寫,如POST。Accept、Content-MD5、Content-Type、Date如果為空也需要添加換行符\n;Headers如果為空不需要添加\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
- 計算簽名。
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"));
- 傳遞簽名。
將計算的簽名結果放到Request的Header中,Key為X-Ca-Signature
。
- 排查簽名錯誤。
當簽名校驗失敗時,API網關會將服務端的StringToSign放到HTTP Response的Header中返回到客戶端,
Key為
X-Ca-Error-Message
。只需要將本地計算的StringToSign與服務端返回的StringToSign進行對比即可找到問題。
如果服務端與客戶端的StringToSign一致請檢查用于簽名計算的密鑰是否正確。因為HTTP Header中無法表示換行,因此StringToSign中的換行符都被過濾掉了,對比時請忽略換行符。
- 簽名Demo。