1. 程式人生 > >騰訊API SecretId 與 SecretKey 鑑權

騰訊API SecretId 與 SecretKey 鑑權

騰訊雲 API 使用簽名方法(Signature)對介面進行鑑權。每一次請求都需要在請求中包含簽名信息, 以驗證使用者身份。
在第一次使用雲API之前,使用者首先需要在騰訊雲網站上申請安全憑證,安全憑證包括 SecretId 和 SecretKey, SecretId 是用於標識 API 呼叫者的身份,SecretKey是用於加密簽名字串和伺服器端驗證簽名字串的金鑰。SecretKey 必須嚴格保管。避免洩露。

1. 申請安全憑證

1. 登入 騰訊雲, 進入 管理中心 頁面
2. 點選 管理賬號 下的 安全憑證 連結, 進入 雲API訪問金鑰管理 頁面 
3. 在 雲API訪問金鑰管理 頁面可以新建 SecretId, 每個帳號最多可以建立兩個 SecretId 

2. 生成簽名串

假設上一步申請的 SecretId 和 SecretKey 分別是:
SecretId: AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
SecretKey: Gu5t9xGARNpq86cd98joQYCN3Cozk1qA


以 查詢例項列表 請求為例, 請求引數為:
方法名: Action=DescribeInstances
SecretId: SecretId= AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
當前時間戳: Timestamp=1408704141
隨機正整數: Nonce=345122
區域: Region=gz


介面簽名的詳細步驟如下:

1. 對引數排序

對請求引數按引數名做字典序升序排列, 結果如下:

{    'Action' : 'DescribeInstances',    'Nonce' : 345122,    'Region' : 'gz',    'SecretId' : 'AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA',    'Timestamp' : 1408704141}
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/介面鑑權