认证方式
# 1.公共请求参数
名称 | 类型 | 是否必填 | 描述 |
---|---|---|---|
Action | String | 是 | API 的动作名称 |
AccessKeyId | String | 是 | 访问密钥 ID(位于用户中心-->用户安全-->密钥管理) |
Signature | String | 是 | 您的签名 |
SignatureMethod | String | 是 | 签名方式。取值范围:HMAC-SHA1。 |
SignatureVersion | String | 是 | 签名算法版本。取值范围:1.0。 |
SignatureNonce | String | 是 | 签名唯一随机数。用于防止网络重放攻击,建议您每一次请求都使用不同的随机数。 |
Timestamp | String | 是 | 请求的时间戳。按照标准表示,并需要使用UTC时间,格式为yyyy-MM-ddTHH:mm:ssZ。示例:2018-01-01T12:00:00Z 表示北京时间 2018 年 01 月 01 日 20 点 00 分 00 秒。 |
Version | String | 是 | API 的版本号,格式为 YYYY-MM-DD。取值范围:2019-08-08。 |
# 2.签名机制
# 步骤一:构造规范化请求字符串
排序参数。排序规则以首字母顺序排序,排序参数包括公共请求参数和接口自定义参数,不包括公共请求参数中的Signature参数。
注意: 当使用GET方法提交请求时,这些参数就是请求URL中的参数部分,即URL中
?
之后由&
连接的部分。编码参数。使用UTF-8字符集按照RFC3986规则编码请求参数和参数取值,编码规则如下:
字符A
Z、az、0~9以及字符-
、_
、.
、~
不编码。其它字符编码成
%XY
的格式,其中XY
是字符对应ASCII码的16进制。示例:半角双引号("
)对应%22
。扩展的UTF-8字符,编码成
%XY%ZA…
的格式。空格( )编码成%20,而不是加号(+)。
该编码方式与
application/x-www-form-urlencoded
MIME格式编码算法相似,但又有所不同。将编码后的字符中加号(
+
)替换为%20
、星号(*
)替换为%2A
、%7E
替换为波浪号(~
),即可得到上述规则描述的编码字符串。
使用等号(
=
)连接编码后的请求参数和参数取值。使用与号(
&
)连接编码后的请求参数,注意参数排序与[步骤1]一致。
# 步骤二:构造签名字符串
构造待签名字符串StringToSign。您可以同样使用percentEncode处理上一步构造的规范化请求字符串,规则如下:
canstring = '' for k, v in sortedD: canstring += '&' + percentEncode(k) + '=' + percentEncode(v) stringToSign = method + '&%2F&' + percentEncode(canstring[1:])
1
2
3
4按照RFC2104的定义,计算待签名字符串StringToSign的HMAC-SHA1值。示例使用的是Java Base64编码方法。
h = hmac.new(access_key_secret, stringToSign, sha1) signature = base64.encodestring(h.digest()).strip()
1
2说明 计算签名时,RFC2104规定的Key值是您的
AccessKeySecret
并加上与号(&
),其ASCII值为38。
# 3.获取签名代码
def percentEncode(str):
"""将特殊转义字符替换"""
res = urllib.quote(str.decode(sys.stdin.encoding).encode('utf8'), '')
res = res.replace('+', '%20')
res = res.replace('*', '%2A')
res = res.replace('%7E', '~')
return res
def get_signature(action, ak, access_key_secret, method, url, param={}):
"""
@params: action: 接口动作
@params: ak: ak值
@params: access_key_secret: ak秘钥
@params: method: 接口调用方法(POST/GET)
@params: param: 接口调用Query中参数(非POST方法Body中参数)
@params: url: 接口调用路径
@return: 请求的url可直接调用
"""
timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
D = {
'Action': action,
'AccessKeyId': ak,
'SignatureMethod': 'HMAC-SHA1',
'SignatureNonce': str(uuid.uuid1()),
'SignatureVersion': "1.0",
"Timestamp": timestamp,
'Version': '2019-08-08',
}
if param:
D.update(param)
sortedD = sorted(D.items(), key=lambda x: x[0])
canstring = ''
for k, v in sortedD:
canstring += '&' + percentEncode(k) + '=' + percentEncode(v)
stringToSign = method + '&%2F&' + percentEncode(canstring[1:])
h = hmac.new(access_key_secret, stringToSign, sha1)
signature = base64.encodestring(h.digest()).strip()
D['Signature'] = signature
url = url + '/?' + urllib.urlencode(D)
return url
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 4.访问地址
地区 | 访问地址 |
---|---|
中国大陆 | cdsapi.capitalonline.net |
亚太地区 | cdsapi-asia.capitalonline.net |
欧美地区 | cdsapi-us.capitalonline.net |