1,騰訊雲api的簽名生成及使用


騰訊雲API途徑:
1,通過API文檔
2,通過SDK
3,通過CLI

 

簽名流程:
1,申請安全憑證
2,生成簽名串
2-1,參數排序
2-2,拼接請求字符串
2-3,拼接簽名與原文字符串
2-4,生成簽名串
3,簽名串編碼

1,申請安全憑證
登陸到api密鑰控制台,創建SecretId/SecretKey
2,生成簽名串
2-1,參數排序
首先對所有請求參數按參數名做字典序升序排列,所謂字典序升序排列,直觀上就
如同在字典中排列單詞一樣排序,按照字母表或數字表里遞增順序的排列次序,即先
考慮第一個字母,在相同的情況下考慮第二個字母,依次類推。
{
'a':1,
'b':2
}
2-2,拼接請求字符串
將上面排序好的請求參數格式化成"參數名稱"="參數值"的形式,參數值為原始值
而非url編碼后的值。然后將格式化后的各個參數用&拼接在一起,最終生成的請求字符串為:
a=1&b=2&f=E

2-3,拼接簽名與原文字符串
接下來拼接簽名與原文字符串,由以下幾個參數構成,
2-3-1,請求方法
2-3-2,請求主機,即接口請求域名: cvm.tencentcloudapi.com
2-3-3,請求路徑
2-3-4,請求字符串,即上面生成的請求字符串

簽名原文字符串的拼接規則為:請求方法+請求主機+請求路徑+?+請求字符串

2-4-4,生成簽名串
生成簽名串可以理解為2個步驟
1)首先使用HMAC-SHA1算法加密
2)然后將生成的簽名串使用Base64進行編碼,即獲得最終的簽名串

3,簽名串編碼
生成的簽名串並不能直接作為請求參數,需要對其進行URL編碼。
注意:如果用戶的請求方法是GET,則對所有請求參數值均需要做URL編碼。

#! /usr/bin/python3
# -*- coding:utf-8 -*-

SecretId='AKID79vAsfgdfgdfhdrturt9R4092SmrtyiyRhHDeRpxcA5apcIK3AWc'
SecretKey='ziDgvpV9WegT071dtghdfgfjf5ykjyFuQvFhfhjhjfhjfNE1Zwxvrgq'

import time
uri = 'cvm.tencentcloudapi.com'

paramDict = {
    'Action':'DescribeRegions',
    'Version':'2017-03-12',
    'SecretId':SecretId,
    'Nonce':123456,
    'Timestamp':int(time.time()),
}

tempList = []
tempDict = {}

for eveKey,eveValue in paramDict.items():
    tempLowerData =eveKey.lower()
    tempList.append(tempLowerData)
    tempDict[tempLowerData] = eveKey
tempList.sort()
print(tempDict)
print(tempList)

resultList = []
for eveData in tempList:
    tempStr = str(tempDict[eveData]) + '=' + str(paramDict[tempDict[eveData]])
    resultList.append(tempStr)
print(resultList)

sourceStr = '&'.join(resultList)
print(sourceStr)

requestStr = '%s%s%s%s%s' %('GET',uri,'/','?',sourceStr)

print(requestStr)

import sys
if sys.version_info[0] > 2:
    signStr = requestStr.encode('utf-8')
    print(signStr)
    SecretKey = SecretKey.encode('utf-8')

import hashlib
digestmod = hashlib.sha1

import hmac
hashed = hmac.new(SecretKey,signStr,digestmod)

import binascii
base64Data = binascii.b2a_base64(hashed.digest())[:-1]
print(type(base64Data))

if sys.version_info[0] > 2:
    base64Data.decode()

import urllib.parse
base64Data = urllib.parse.quote(base64Data)
url = "https://" + uri + '/' + '?' + sourceStr + '&Signature=' + base64Data
print(url)

import urllib.request
import json

#print(urllib.request.urlopen(url).read().decode('utf-8'))
for eveData in json.loads(urllib.request.urlopen(url).read().decode('utf-8'))['Response']['RegionSet']:
    print(eveData)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM