騰訊API SecretId 與 SecretKey 鑑權
騰訊雲 API 使用簽名方法(Signature)對介面進行鑑權。每一次請求都需要在請求中包含簽名信息, 以驗證使用者身份。
在第一次使用雲API之前,使用者首先需要在騰訊雲網站上申請安全憑證,安全憑證包括 SecretId 和 SecretKey, SecretId 是用於標識 API 呼叫者的身份,SecretKey是用於加密簽名字串和伺服器端驗證簽名字串的金鑰。SecretKey 必須嚴格保管。避免洩露。
1. 登入 騰訊雲, 進入 管理中心 頁面
2. 點選 管理賬號 下的 安全憑證 連結, 進入 雲API訪問金鑰管理 頁面
3. 在 雲API訪問金鑰管理 頁面可以新建 SecretId, 每個帳號最多可以建立兩個 SecretId
假設上一步申請的 SecretId 和 SecretKey 分別是:
SecretId: AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
SecretKey: Gu5t9xGARNpq86cd98joQYCN3Cozk1qA
以 查詢例項列表 請求為例, 請求引數為:
方法名: Action=DescribeInstances
SecretId: SecretId= AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
當前時間戳: Timestamp=1408704141
隨機正整數: Nonce=345122
區域: Region=gz
介面簽名的詳細步驟如下:
對請求引數按引數名做字典序升序排列, 結果如下:
2. 拼接請求字串
把上一步排序好的請求引數, 格式化成 k=v,然後用"&"拼接在一起。注意不包括Signature引數,v為原始值而非url編碼後的值。結果為:
Action=DescribeInstances&Nonce= 345122&Region=gz&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1408704141
3. 拼接簽名源文字串
拼接簽名原文時需要如下引數:
請求方法: 支援 POST 和 GET 方式, 這裡架設為 GET 請求, 注意 GET 為全大寫
請求主機: cvm.api.qcloud.com, 根據介面所屬模組不同域名也不同, 詳見介面文件
請求路徑: /v2/index.php
請求字串: 即前 2 步生成的請求字串
簽名源文的拼接規則為:
請求方法 + 請求主機 +請求路徑 + ? + 請求字串
拼接結果為:
GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce= 345122&Region=gz&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1408704141
4. 生成簽名串
1. 騰訊雲 API 使用 HMAC-SHA1 演算法對請求進行簽名
2. 簽名串需要使用 Base64 編碼
3. 傳送請求時, 對簽名串進行 Url Encode
以 PHP 語言為例:
$secretKey = 'Gu5t9xGARNpq86cd98joQYCN3Cozk1qA';
$srcStr = 'GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Timestamp=1408704141';
$signStr = base64_encode(hash_hmac('sha1', $srcStr, $secretKey, true));
echo $signStr;
這裡得到的簽名串為:
HgIYOPcx5lN6gz8JsCFBNAWp2oQ=
使用其它程式設計語言開發時, 可用上面示例中的原文進行簽名驗證, 得到的簽名串與例子中的一致即可
5. 添加簽名, 傳送請求1. 請求引數中新增 Signature 引數, 引數值為上一步生成的簽名串, 並且對簽名進行 Url Encode
2. 傳送 HTTPS 協議的 GET 請求即可得到 JSON 字串格式的介面返回值
最終的請求 URL 為:
https://cvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&Signature=HgIYOPcx5lN6gz8JsCFBNAWp2oQ%3D&Timestamp=1408704141
將示例程式碼中的 YOUR_SECRET_ID 和 YOUR_SECRET_KEY 替換成實際的 SecretId 和 SecretKey
示例程式碼僅供參考, 請根據實際情況使用。
原文:
http://www.qcloud.com/wiki/介面鑑權