api:signature

签名算法

Syscloud犀思云 API 会对每个访问的请求进行身份验证,即每个请求都需要在公共请求参数中包含签名信息(Signature)以验证用户身份。签名信息由用户所执有的安全凭证生成,安全凭证包括 SecretId 和 SecretKey,若用户还没有安全凭证,则需要在官网上自主申请,否则就无法调用云API接口。 在生成API请求中的签名(Signature)时,需要提供账户中的SecretId和SecretKey,本例中假设

SecretId  = 'AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM'
SecretKey = 'A8rKdlhOq31kESSChxylKekbDaibGl13'
SecretId:用于标识 API 调用者身份;
SecretKey:用于加密签名字符串和服务器端验证签名字符串的密钥。
注意:API 密钥是构建API请求的重要凭证,使用犀思云 API 可以操作您名下的所有资源,为了您的财产和服务安全,请妥善保存和定期更换密钥,当您更换密钥后,请及时删除旧密钥。

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

{ 
    "Action" : "QueryTunnel",
    "Timestamp" : 1465185768,
    "tunnelIds.0" : "xxxxxxxx",
    "limit" : 20,
    "offset" : 0,
    "SecretId" : "AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM"
}

构造HTTP请求详细流程

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

{ 
    "Action" : "QueryTunnel",
    "SecretId" : "AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM"
    "Timestamp" : 1465185768,
    "limit" : 20,
    "offset" : 0,
    "tunnelIds.0" : "xxxxxxxx"
}

2.对排序后的请求参数进行URL编码

{ 
    "Action" : "QueryTunnel",
    "SecretId" : "AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM"
    "Timestamp" : 1465185768,
    "limit" : 20,
    "offset" : 0,
    "uuid" : "xxxxxxxx"
}
注解:如果参数包含空格、中文等需要URL编码

3.构造HTTP请求

然后将参数名和参数值之间用 “=” 连接,参数和参数之间用“&“号连接,构造的URL请求。如对Action参数,其参数名称为”Action”,参数值为“DescribeTunnel”,因此格式化后就为Action=DescribeTunnel。 最终生成的请求字符串为:

https://api.syscxp.com/?Action=QueryTunnel
&SecretId=AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM
&Timestamp=1465185768
&limit=20
&offset=0
&uuid=xxxxxxxx

4.构造签名原文字符串

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

Action=QueryTunnel&SecretId=AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM&Timestamp=1465185768&limit=20&offset=0&uuid=xxxxxxxxA8rKdlhOq31kESSChxylKekbDaibGl13

5.生成签名串

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

按照上述算法,本例中,计算出的Signature为 b9064dd0e37b680744ebedd24a90542ed100432c 。

Python 生成签名代码

import hashlib
import urlparse
import urllib
 
def _verfy_ac(secretKey, 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 + secretKey
 
    sign = hashlib.sha1()
    sign.update(params_data)
    signature = sign.hexdigest()
 
    return signature
    # 生成的Signature值

PHP 生成签名代码

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

6.使用签名组合HTTP请求

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

Action=QueryTunnel
&secretId=AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM
&Timestamp=1465185768
&limit=20
&offset=0
&uuid=xxxxxxxx
&Signature=b9064dd0e37b680744ebedd24a90542ed100432c

完整的请求URL为(为了方便,我们人为地将参数之间用回车分隔开)

https://api.syscxp.com/?Action=QueryTunnel
&secretId=AKIDwf9QRCuyzjDQM2waT6TaS47vTlnYcTYM
&Timestamp=1465185768
&limit=20
&offset=0
&uuid=xxxxxxxx
&Signature=b9064dd0e37b680744ebedd24a90542ed100432c
如有疑问请联系 技术支持

页面工具