445
阿裏雲
請求簽名說明文檔__使用手冊(調用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 錯誤。
簽名校驗
組織參與簽名計算的字符串
String stringToSign=
HTTPMethod + "n" +
Accept + "n" + //建議顯示設置 Accept Header,部分 Http 客戶端當 Accept 為空時會給 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 是指參與 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 和英文冒號。
String headers =
HeaderKey1 + ":" + HeaderValue1 + "n"+
HeaderKey2 + ":" + HeaderValue2 + "n"+
...
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 參與簽名,等號不需要再加入簽名。
String url =
Path +
"?" +
Key1 + "=" + Value1 +
"&" + Key2 + "=" + Value2 +
...
"&" + KeyN + "=" + ValueN
注意這裏 Query 或 Form 參數的 Value 可能有多個,多個的時候隻取第一個 Value 參與簽名計算。
計算簽名
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
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
上一篇:
使用限製__使用手冊(調用API)_API 網關-阿裏雲
下一篇:
獲取API的定義文檔__快速入門(調用API)_API 網關-阿裏雲
如何開通移動安全__使用手冊_移動安全-阿裏雲
SSL 方式接入示例__Java 接入示例_MQTT 接入(物聯)_消息隊列 MQ-阿裏雲
RAM中可以移動推送資源進行授權的Action__OpenAPI RAM授權_OpenAPI 1.0_移動推送-阿裏雲
probe__服務編排文檔_用戶指南_容器服務-阿裏雲
數據準備__基礎示例—完整數據開發_場景教程_大數據開發套件-阿裏雲
連通分量__示例程序_圖模型_大數據計算服務-阿裏雲
視頻轉碼 Python SDK 安裝及調用___視頻專區_媒體轉碼-阿裏雲
ALIYUN::ESS::ScalingGroup__資源列表_資源編排-阿裏雲
HLS封裝接口__Media-C-SDK_SDK 參考_對象存儲 OSS-阿裏雲
任務運維__運維中心手冊_用戶操作指南_大數據開發套件-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲