签名算法

在生成API请求中的签名(Signature)时,需要提供账户中的PublicKey和PrivateKey,本例中假设

PublicKey  = 'ucloudsomeone@example.com1296235120854146120'
PrivateKey = '46f09bb9fab4f12dfc160dae12273d5332b5debe'

注解:你可以使用上述的 PublicKey 和 PrivateKey 调试你的代码, 当得到跟后面一致的签名结果后(即表示你的代码是正确的),可再换为你自己的 PublicKey 和 PrivateKey 以及其他 API 请求。

本例中假设用户请求参数串如下:

{ 
    "Action"     :  "CreateUHostInstance",
    "Region"     :  "cn-bj2",
    "Zone"       :  "cn-bj2-04",
    "ImageId"    :  "f43736e1-65a5-4bea-ad2e-8a46e18883c2", 
    "CPU"        :  2,
    "Memory"     :  2048,
    "DiskSpace"  :  10,
    "LoginMode"  :  "Password",
    "Password"   :  "VUNsb3VkLmNu",
    "Name"       :  "Host01",
    "ChargeType" :  "Month",
    "Quantity"   :  1,
    "PublicKey"  :  "ucloudsomeone@example.com1296235120854146120"
}

注解:上例中的"Password"值为"AutoAI.cn",但是调用时需要用base64进行编码。编码方法:echo -n "AutoAI.cn" |base64;输出结果为"VUNsb3VkLmNu"。

构造HTTP请求详细流程

1.将请求参数按照名进行升序排列

{ 
    "Action"     :  "CreateUHostInstance",
    "ChargeType" :  "Month",
    "CPU"        :  2,
    "DiskSpace"  :  10,
    "ImageId"    :  "f43736e1-65a5-4bea-ad2e-8a46e18883c2", 
    "LoginMode"  :  "Password",
    "Memory"     :  2048,
    "Name"       :  "Host01",
    "Password"   :  "VUNsb3VkLmNu",
    "PublicKey"  :  "ucloudsomeone@example.com1296235120854146120",
    "Quantity"   :  1,
    "Region"     :  "cn-bj2",
    "Zone"       :  "cn-bj2-04"
}

2.构造被签名参数串

被签名串的构造规则为: 被签名串 = 所有请求参数拼接(无需HTTP转义)。并在本签名串的结尾拼接API密钥的私钥(PrivateKey)。

ActionCreateUHostInstanceCPU2ChargeTypeMonthDiskSpace10ImageIdf43736e1-65a5-4bea-ad2e-8a46e18883c2LoginModePasswordMemory2048NameHost01PasswordVUNsb3VkLmNuPublicKeyucloudsomeone@example.com1296235120854146120Quantity1Regioncn-bj2Zonecn-bj2-0446f09bb9fab4f12dfc160dae12273d5332b5debe

3.计算签名

生成被签名串的 SHA1 签名,即是请求参数”Signature”的值。

按照上述算法,本例中,计算出的Signature为 4f9ef5df2abab2c6fccd1e9515cb7e2df8c6bb65

Python 生成签名代码

import hashlib
import urlparse
import urllib
 
def _verfy_ac(private_key, params):
​    items=params.items()# 请求参数串
​    items.sort()# 将参数串排序
 
    params_data = "";
    for key, value in items:
        params_data = params_data + str(key) + str(value)
    params_data = params_data + private_key
 
    sign = hashlib.sha1()
    sign.update(params_data)
    signature = sign.hexdigest()
 
    return signature
    # 生成的Signature值

PHP 生成签名代码

function _verfy_ac(undefined, undefined) {
   ksort(undefined);
   # 参数串排序
   undefined = "";
 
   foreach(undefined as undefined => undefined) {undefined .= undefined;undefined .= undefined;
   }
 
   undefined .= undefined;
   return sha1(undefined); 
   # 生成的Signature值
}

4.使用签名组合HTTP请求

4.1 Json方式

curl -X POST \
  https://api.ucloud.cn \
  -H 'Content-Type: application/json' \
  -d '{ 
​    "Action"     :  "CreateUHostInstance",
​    "ChargeType" :  "Month",
​    "CPU"        :  2,
​    "DiskSpace"  :  10,
​    "ImageId"    :  "f43736e1-65a5-4bea-ad2e-8a46e18883c2", 
​    "LoginMode"  :  "Password",
​    "Memory"     :  2048,
​    "Name"       :  "Host01",
​    "Password"   :  "VUNsb3VkLmNu",
​    "PublicKey"  :  "ucloudsomeone@example.com1296235120854146120",
​    "Quantity"   :  1,
​    "Region"     :  "cn-bj2",
​    "Zone"       :  "cn-bj2-04",
    "Signature"  :  "4f9ef5df2abab2c6fccd1e9515cb7e2df8c6bb65"
}'

4.2 拼接参数方式

对排序后的请求参数进行URL编码,URL 编码的规则如下:

  • 字符 A~Z、a~z、0~9不编码;
  • 字符“-”、“_”、“.”、“~”不编码;
  • 其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如:英文的双引号(”)对应的编码为 %22;
  • 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式;
  • 英文空格( )要编码成 %20,而不是加号(+)。
  • "PublicKey" 无需编码

构造HTTP请求,参数名和参数值之间用 "=" 连接,参数和参数之间用"&"号连接,构造的URL请求为:

http(s)://api.ucloud.cn/?Action=CreateUHostInstance
&CPU=2
&ChargeType=Month
&DiskSpace=10
&ImageId=f43736e1-65a5-4bea-ad2e-8a46e18883c2
&LoginMode=Password
&Memory=2048
&Name=Host01
&Password=VUNsb3VkLmNu
&PublicKey=ucloudsomeone%40example.com1296235120854146120
&Quantity=1
&Region=cn-bj2
&Zone=cn-bj2-04

将签名参数附在原有请求串的最后面。最终的HTTP请求串为(为了查看方便,我们人为地将参数之间用回车分隔开),完整的请求URL如下:(为了方便,我们人为地将参数之间用回车分隔开)

http(s)://api.ucloud.cn/?Action=CreateUHostInstance
&CPU=2
&ChargeType=Month
&DiskSpace=10
&ImageId=f43736e1-65a5-4bea-ad2e-8a46e18883c2
&LoginMode=Password
&Memory=2048
&Name=Host01
&Password=VUNsb3VkLmNu
&PublicKey=ucloudsomeone%40example.com1296235120854146120
&Quantity=1
&Region=cn-bj2
&Zone=cn-bj2-04
&Signature=4f9ef5df2abab2c6fccd1e9515cb7e2df8c6bb65