签名方式

# 签名方式 所有HTTP请求必须带上公共头和签名,服务器端将会进行对请求进行验签。 签名参数和值区分大小写,字符编码统一采用utf-8 ### 1,签名所需的参数 #### `accessKeyId` 获取平台颁发的accessKeyId #### `timestamp` 时间戳。按照ISO8601标准表示,并需要使用UTC时间,格式为yyyy-MM-ddTHH:mm:ssZ 例如:北京时间2020/10/1 21:00:00,需要转换为2020-10-01T13:00:00Z #### `signatureNonce` 随机数,每次请求使用不同的随机数防止网络重放攻击。 #### `path` https://test.openapi.huitravel.com/api/v1/product/1?price=100.1&name= 取`/api/v1/product/1`部分。 #### query params部分 https://test.openapi.huitravel.com/api/v1/product/1?price=100.1&name= 取`price=100.1`和`name=` ### 2,拼接 stringToSign 将四个固定参数和值,外加所有Query Params参数和值,以key,value形式组成集合,请求Body不参与签名。 ``` [ {accessKeyId,7568512625}, {timestamp,2020-10-01T13:00:00Z}, {signatureNonce,0.265155265282885}, {path,/api/v1/product/1}, {price,100.01}, {name,} ] ``` 按照key的字典顺序进行排序 ``` [ {accessKeyId,7568512625}, {name,}, {path,/api/v1/product/1}, {price,100.01}, {signatureNonce,0.265155265282885}, {timestamp,2020-10-01T13:00:00Z} ] ``` 对参数值进行urlencode,编码采用<a href="https://tools.ietf.org/html/rfc3986" target="_blank">RFC3986</a>。使用 %XY 对特殊字符例如汉字进行百分比编码,其中“X”和“Y”为十六进制字符(0-9 和大写字母 A-F),并且为大写。 对于字符 `A~Z` `a~z` `0~9` 以及字符 `-` `_` `.` `~` 不编码; 对于其它字符编码成 `%XY` 的格式,其中 `XY` 是字符对应 `ASCII` 码的16进制表示。 比如英文的双引号 `"` 对应的编码为 `%22`,英文空格 ` ` 要编码成 `%20` 然后以key=value的形式用 `\n` 换行符隔开进行拼接,并且需要对value进行urlencode编码,最后得到字符串`stringToSign` ``` accessKeyId=7568512625 name= path=%2Fapi%2Fv1%2Fproduct%2F1 price=100.1 signatureNonce=0.265155265282885 timestamp=2020-10-01T13%3A00%3A00Z ``` ### 3,使用HmacSHA1摘要算法进行签名 `stringToSign`作为待签名串,平台分配的`accessKeySecret`值作为密钥,此处accessKeySecret="a02f3025-9c9b-4737-897d-7e94242797a0" ``` 得到签名结果signature fd66b76abd2de3964aca2a079fefff06c5b85898 ``` <a href="http://www.metools.info/code/c25.html" target="_blank">在线签名 </a>http://www.metools.info/code/c25.html ![image.png](https://cos.easydoc.net/75100932/files/kf25oo54.png)