Python 使用摘要签名认证方式调用API

 因为场景的问题,代码没实现

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,
        }

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值