xy520 / auth_util.py
XY520's picture
Upload 18 files
076384f verified
Raw
History Blame Contribute Delete
2.35 kB
#!/usr/bin/env python
# encoding: utf-8
import random
import string
import time
import hashlib
import hmac
import base64
import urllib.parse
__all__ = ['gen_sign_headers']
# 随机字符串
def gen_nonce(length=8):
chars = string.ascii_lowercase + string.digits
return ''.join([random.choice(chars) for _ in range(length)])
# 如果query项只有key没有value时,转换成params[key] = ''传入
def gen_canonical_query_string(params):
if params:
escape_uri = urllib.parse.quote
raw = []
for k in sorted(params.keys()):
tmp_tuple = (escape_uri(k), escape_uri(str(params[k])))
raw.append(tmp_tuple)
s = "&".join("=".join(kv) for kv in raw)
return s
else:
return ''
def gen_signature(app_secret, signing_string):
bytes_secret = app_secret.encode('utf-8')
hash_obj = hmac.new(bytes_secret, signing_string, hashlib.sha256)
bytes_sig = base64.b64encode(hash_obj.digest())
signature = str(bytes_sig, encoding='utf-8')
return signature
def gen_sign_headers(app_id, app_key, method, uri, query):
method = str(method).upper()
uri = uri
timestamp = str(int(time.time()))
app_id = app_id
app_key = app_key
nonce = gen_nonce()
canonical_query_string = gen_canonical_query_string(query)
signed_headers_string = 'x-ai-gateway-app-id:{}\nx-ai-gateway-timestamp:{}\n' \
'x-ai-gateway-nonce:{}'.format(app_id, timestamp, nonce)
signing_string = '{}\n{}\n{}\n{}\n{}\n{}'.format(method,
uri,
canonical_query_string,
app_id,
timestamp,
signed_headers_string)
signing_string = signing_string.encode('utf-8')
signature = gen_signature(app_key, signing_string)
return {
'X-AI-GATEWAY-APP-ID': app_id,
'X-AI-GATEWAY-TIMESTAMP': timestamp,
'X-AI-GATEWAY-NONCE': nonce,
'X-AI-GATEWAY-SIGNED-HEADERS': "x-ai-gateway-app-id;x-ai-gateway-timestamp;x-ai-gateway-nonce",
'X-AI-GATEWAY-SIGNATURE': signature
}