54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
#!/usr/bin/python
|
||
# -*- coding:utf-8 -*-
|
||
|
||
import base64
|
||
import hmac
|
||
from hashlib import sha1
|
||
import uuid
|
||
from urllib import parse
|
||
import json
|
||
from util.url import url_format_list
|
||
from util.http import application_x_www_form_urlencoded,application_json
|
||
|
||
__request_body = "request_body"
|
||
|
||
|
||
def __generate_signature(parameters, access_key_secret):
|
||
sorted_parameters = sorted(parameters.items(), key=lambda parameters : parameters[0])
|
||
string_to_sign = url_format_list(sorted_parameters)
|
||
secret = access_key_secret + "&"
|
||
|
||
# print(secret)
|
||
h = hmac.new(secret.encode('utf-8'), string_to_sign.encode('utf-8'), sha1)
|
||
signature = base64.b64encode(h.digest()).strip()
|
||
signature = str(signature, encoding="utf8")
|
||
# signature = bytes(signature, encoding="utf8")
|
||
return signature
|
||
|
||
|
||
def get_signature(url_params, body_params, request_method, content_type, access_key_secret):
|
||
signature_nonce = str(uuid.uuid1())
|
||
|
||
sign_param = {
|
||
'signature_nonce': signature_nonce
|
||
}
|
||
|
||
if (content_type == application_x_www_form_urlencoded or content_type == application_json) \
|
||
and (request_method == 'POST' or request_method == 'PATCH' or request_method == 'PUT')\
|
||
and body_params is not None and len(body_params) != 0:
|
||
if content_type == application_x_www_form_urlencoded:
|
||
sign_param[__request_body] = parse.urlencode(body_params)
|
||
else:
|
||
sign_param[__request_body] = json.dumps(body_params)
|
||
# 生成签名使用Python,发送签名使用其他语言时使用separators
|
||
# sign_param[__request_body] = json.dumps(body_params,separators=(',',':'))
|
||
|
||
for key in url_params.keys():
|
||
sign_param[key] = url_params[key]
|
||
|
||
signature = __generate_signature(sign_param, access_key_secret)
|
||
return signature, signature_nonce
|
||
|
||
|
||
|