閱讀445 返回首頁    go 阿裏雲


請求簽名說明文檔__使用手冊(調用API)_API 網關-阿裏雲

  • 每個 API 服務都屬於一個 API 分組,每個 API 分組有不同的域名。域名是由服務端綁定的獨立域名,API 網關通過域名來尋址定位 API 分組。
  • 域名的格式為 www.[獨立域名].com/[Path]?[HTTPMethod]
  • API 網關通過域名定位到一個唯一的分組,通過 Path+HTTPMethod 確定該分組下唯一的 API。
  • 您購買後在控製台“已購買的 API”可以獲得 API 文檔說明,若無購買行為,則可以聯係 API 提供者操作授權,授權後您就可以在控製台“已授權的 API”獲得 API 文檔說明。

係統級Header

  • 【必選】X-Ca-Key:AppKey。
  • 【必選】X-Ca-Signature:簽名字符串。
  • 【可選】X-Ca-Timestamp:API 調用者傳遞時間戳,值為當前時間的毫秒數,也就是從1970年1月1日起至今的時間轉換為毫秒,時間戳有效時間為15分鍾。
  • 【可選】X-Ca-Nonce:API 調用者生成的 UUID,結合時間戳防重放。
  • 【可選】Content-MD5 當請求 Body 非 Form 表單時,可以計算 Body 的 MD5 值傳遞給雲網關進行 Body MD5 校驗。
  • 【可選】X-Ca-Stage請求 API 所屬 Stage,目前僅支持 TEST 和 RELEASE,默認RELEASE,若您調用的 API 不在線上環境,請一定要指定該參數的值,否則會報 URL 錯誤。

簽名校驗

組織參與簽名計算的字符串

  1. String stringToSign=
  2. HTTPMethod + "n" +
  3. Accept + "n" + //建議顯示設置 Accept Header,部分 Http 客戶端當 Accept 為空時會給 Accept 設置默認值:*/*,導致簽名校驗失敗。
  4. Content-MD5 + "n"
  5. Content-Type + "n" +
  6. Date + "n" +
  7. Headers +
  8. Url

HTTPMethod 為全大寫,如 POST。

Accept、Content-MD5、Content-Type、Date 如果為空也需要添加換行符”n”,Headers如果為空不需要添加”n”。

Content-MD5

Content-MD5 是指 Body 的 MD5 值,隻有當 Body 非 Form 表單時才計算 MD5,計算方式為:

  1. String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));

bodyStream 為字節數組。

Headers

Headers 是指參與 Headers 簽名計算的 Header 的 Key、Value 拚接的字符串,建議對 X-Ca 開頭以及自定義 Header 計算簽名,注意如下參數不參與 Headers 簽名計算:X-Ca-Signature、X-Ca-Signature-Headers、Accept、Content-MD5、Content-Type、Date。

Headers 組織方法:

先對參與 Headers 簽名計算的 Header的Key 按照字典排序後使用如下方式拚接,如果某個 Header 的 Value 為空,則使用 HeaderKey + “:” + “n”參與簽名,需要保留 Key 和英文冒號。

  1. String headers =
  2. HeaderKey1 + ":" + HeaderValue1 + "n"+
  3. HeaderKey2 + ":" + HeaderValue2 + "n"+
  4. ...
  5. HeaderKeyN + ":" + HeaderValueN + "n"

將 Headers 簽名中 Header 的 Key 使用英文逗號分割放到 Request 的 Header 中,Key為:X-Ca-Signature-Headers。

Url

Url 指 Path + Query + Body 中 Form 參數,組織方法:對 Query+Form 參數按照字典對 Key 進行排序後按照如下方法拚接,如果 Query 或 Form 參數為空,則 Url = Path,不需要添加”?”,如果某個參數的 Value 為空隻保留 Key 參與簽名,等號不需要再加入簽名。

  1. String url =
  2. Path +
  3. "?" +
  4. Key1 + "=" + Value1 +
  5. "&" + Key2 + "=" + Value2 +
  6. ...
  7. "&" + KeyN + "=" + ValueN

注意這裏 Query 或 Form 參數的 Value 可能有多個,多個的時候隻取第一個 Value 參與簽名計算。

計算簽名

  1. Mac hmacSha256 = Mac.getInstance("HmacSHA256");
  2. byte[] keyBytes = secret.getBytes("UTF-8");
  3. hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
  4. String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

secret 為 APP 的密鑰。

傳遞簽名

將計算的簽名結果放到 Request 的 Header 中,Key為:X-Ca-Signature。

簽名錯誤排查方法

當簽名校驗失敗時,API網關會將服務端的 StringToSign 放到 HTTP Response 的 Header 中返回到客戶端,Key為:X-Ca-Error-Message,隻需要將本地計算的 StringToSign 與服務端返回的 StringToSign 進行對比即可找到問題;

如果服務端與客戶端的 StringToSign 一致請檢查用於簽名計算的密鑰是否正確;

因為 HTTP Header 中無法表示換行,因此 StringToSign 中的換行符都被過濾掉了,對比時請忽略換行符。

簽名demo

簽名計算的詳細demo(JAVA)請參照鏈接:https://github.com/aliyun/api-gateway-demo-sign-java

在API網關控製台,調用API——SDK下載處還有更多語言的調用demo。

最後更新:2016-11-23 17:16:06

  上一篇:go 使用限製__使用手冊(調用API)_API 網關-阿裏雲
  下一篇:go 獲取API的定義文檔__快速入門(調用API)_API 網關-阿裏雲