移动云产品的API通过移动云API网关开放,提供Access Key ID(AK)和Secret Access Key(SK)对称加密方式验证接口调用者身份。AK和SK由移动云官方颁发给访问者,可通过移动云官方网站申请和管理。
移动云API服务会对每个访问的请求进行身份验证,需要在请求中包含签名(Signature)信息。 其中:
AK用于标识访问者的身份。
SK用于对请求签名字符串进行摘要加密,同时也是API服务器端验证签名字符串的密钥,用户应谨慎保管SK。
移动云API服务的签名机制请参见“签名机制”。
用户可调用云API提供的SDK获取签名,目前提供了JAVA和Python两种语言的SDK:
移动云API服务会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(Signature)信息。用户通过Access Key和Secret Key对称加密的方法来验证请求的发送者身份。Access Key和Secret Key 由移动云官方颁发给访问者(可以通过移动云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份;Secret Key用于对请求签名字符串进行摘要加密,同时也是API服务器端验证签名字符串的密钥,Secret Key必须严格保密,只有移动云和用户知道。
用户在访问时,按照下面的方法对请求进行签名处理:
以“获取用户密钥对”为例,假设使用的 Access Key Id 是 “testid”, Access Key Secret 是 “testsecret”。 那么签名前的请求 URL 为:
https://api-guangzhou-2.cmecloud.cn/api/keypair?
Version=2016-12-05
&AccessKey=testid
&Timestamp=2017-01-11T15:15:11Z
&SignatureMethod=HmacSHA1
&SignatureVersion=V2.0
&SignatureNonce=9d81ffbeaaf7477390db5df577bb3299
1. 使用请求参数构造规范化的请求字符串(Canonicalized Query String)
|
a) 参数排序。 按照参数名称的字典顺序对请求中所有的请求参数(包括“公共请求参数”和接口的自定义参数,但不能包括“公共请求参数”中提到的Signature 参数本身)进行排序。 注意:当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。
b) 参数编码。 对排序之后的请求参数的名称和值分别用UTF-8字符集进行URL编码。编码的规则如下: i. 对于字符 A-Z、a-z、0-9 以及字符“-”、“_”、“.”、“~”不编码。 ii. 对于其他字符编码成 “%XY” 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如英文的双引号(”)对应的编码就是 %22。 iii. 对于扩展的 UTF-8 字符,编码成 “%XY%ZA…” 的格式。 iv. 需要说明的是英文空格( )要被编码是 %20,而不是加号(+)。 注意:该编码方式和一般采用的“application/x-www-form-urlencoded” MIME格式编码算法(比如Java标准库中的 java.net.URLEncoder的实现) 相似, 但又有所不同。 实现时, 可以先用标准库的方式进行编码, 然后把编码后的字符串中加号(+)替换成 %20、星号(*)替换成 %2A、%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。
c) 将编码后的参数名称和值用英文等号(=)进行连接。 d) 将等号连接得到的参数组合按步骤(a)排好的顺序依次使用&符号连接,即得到规范化请求字符串:
|
2. 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串:
a) 其中 HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。 b) percentEncode(“/”) 是按照 1.b 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 “%2F”。 c) shaEncode是指对上一步获得的字符串进行摘要加密,加密算法为SHA-256。 d) 将这3个字符串相连,得到待签名字符串:
|
|
a) 按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值,即得到签名值Signature。 注意:计算签名时使用的 Key 就是字符串“BC_SIGNATURE&”加上用户持有的 Access Key Secret,使用的哈希算法是 SHA1。拼接后的Access Key Secret:BC_SIGNATURE&testsecret。
注意:计算签名时使用的 Key 就是字符串“BC_SIGNATURE&”加上用户持有的 Access Key Secret,使用的哈希算法是 SHA1。拼接后的Access Key Secret:BC_SIGNATURE&testsecret b) 将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。 注意:得到的签名值在作为最后的请求参数值提交给ECS服务器的时候,要和其他参数一样,按照 RFC3986 的规则进行 URL 编码。
|
3. 得到最终url:
https://api-guangzhou-2.cmecloud.cn/api/keypair?Version=2016-12-05&AccessKey=testid&Timestamp=2017-01-11T15:15:11Z&Signature=2976158792407a581305786b2a82c56d9b007362&SignatureMethod=HmacSHA1&SignatureVersion=V2.0&SignatureNonce=9d81ffbeaaf7477390db5df577bb3299