因为场景的问题,代码没实现
1.Content-Type:"application/x-www-form-urlencoded"
2.url带有?的场景
一、调用阿里API的方式(文档地址)
二、生成签名
数据准备:
appKey = 'XXXXXXXXXXXXXXXXX'
appSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
md5 = self.md5(request_data)
time1 = self.time1()
nonce = self.uuid1()
headers = {
'Accept': '*/*',
"Content-Type": "application/json",
"X-Ca-SignatureMethod": "HmacSHA256",
}
请求数据得处理
def md5(self,data):
data = json.dumps(data, ensure_ascii=False)
m = hashlib.md5()
m.update(data.encode('utf-8'))
md5 = base64.b64encode(bytes.fromhex(m.hexdigest()))
md5 = md5.decode()
return md5
获取当前时间戳
def time1(self):
now = datetime.now()
timestamp = now.timestamp()
print("当前时间戳:", timestamp)
timestamp = str(timestamp)
timestamp = timestamp.split('.')
return timestamp[0] + timestamp[1][:-3]
随机数得处理
def uuid1(self):
uid = uuid.uuid1()
return str(uid)
从HTTP请求中提取出关键数据,组合成一个签名串
def textToSign(self,request_method,md5,date):
request_method = request_method.upper()
textToSign = ""
textToSign += request_method + "\n"
textToSign += "*/*\n"
textToSign += md5 + "\n"
textToSign += "application/json\n"
textToSign += date + "\n"
return textToSign
从HTTP请求中提取出关键数据组装成签名串后,需要对签名串进行加密及编码处理,形成最终的签名
def headersToSign(self,appKey,nonce,SignatureMethod):
headers = {
"x-ca-key": appKey,
"x-ca-nonce": nonce,
"x-ca-signaturemethod": SignatureMethod
}
return headers
def sortedKeys(self,headersToSign):
headersToSign_list = []
for key in headersToSign:
headersToSign_list.append(key)
return headersToSign_list
def signatureHeaders(self,sortedKeys,textToSign,headersToSign):
signatureHeaders=''
for headerName in sortedKeys:
if (headerName == "x-ca-nonce" or headerName == "x-ca-timestamp" or headerName == "x-ca-key" or headerName == "x-ca-signature-method"):
textToSign += headerName + ":" + headersToSign[headerName] + "\n"
signatureHeaders += headerName + ","
else:
continue
signatureHeaders = signatureHeaders.strip(",")
return textToSign,signatureHeaders
返回得url得数据要与textToSign拼接在后面
def urlToSign(self,contentType,url):
if (contentType and contentType == 'application/x-www-form-urlencoded'):
pass
ss = url.split('?')
if (len(ss)>1 and ss[1]):
pass
if '://' in ss[0]:
protocolIndex = ss[0].split('://')
protocolIndex_len = len(protocolIndex[0])
else:
protocolIndex_len = -1
apiNameIndex = ss[0][protocolIndex_len + 3:].split('/')
apiNameIndex_len = len(apiNameIndex[0])
url = ss[0][protocolIndex_len + apiNameIndex_len + 3:]
return url
加密最终的签名过程
def get_hmac_sha256(self,textToSign, appSecret):
textToSign = textToSign.encode('utf-8')
appSecret = appSecret.encode('utf-8')
signature = base64.b64encode(hmac.new(key=appSecret, msg=textToSign, digestmod=hashlib.sha256).digest()).decode(
"utf-8")
return signature
得出的签名数据
headers_all ={
"Accept": "*/*",
"Content-Type": "application/json",
"X-Ca-SignatureMethod": "HmacSHA256",
"X-Ca-Key": appKey,
"X-Ca-Nonce": nonce,
"X-Ca-Signature": signature,
"X-Ca-Signature-Headers": signatureHeaders,
"Content-MD5": md5,
"Date": time1,
}