说明
签名算法遵循RFC 2104 HMAC-SHA1规范,使用AccessSecret对编码、排序后的整个请求串计算HMAC值作为签名。签名的元素是请求自身的一些参数,由于每个API请求内容不同,所以签名的结果也不尽相同。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )
签名步骤
构建待签名字符串
待签名字符串(StringToSign)是API请求拼装的字符串,用于计算签名,包括:- 请求方法(GET | POST | PUT 等),后面添加换行符"\n"
如:GET\n
- 请求API的路径,后面添加换行符"\n"
请求api路径为请求地址根域名之后首个问号之前的部分,如:请求地址为xxx.com/common/config.do?apiAdvertData=xxxx,请求路径是/common/config.do;如果请求的是根域名部分,请求路径为/;
- 签名密钥ID(SignKeyId),后面添加换行符"\n"
签名密钥由后端创建,一个ID对应一个密钥
密钥ID同时需要放入header中的ski项
- 请求参数部分
请求参数包括:
- 地址参数,即请求url里?后边的部分
- content-type为form-data时表单里的非文件参数
- content-type为x-www-form-urlencoded时表单里的所有参数
将所有参数按照ASCII码的顺序对参数名进行排序后,以参数名=参数值&参数名=参数值的格式进行拼接,如a=va&b=vb...
##### 请求参数包含以下关键项:
- timestamp: gmt+8时区毫秒级时间戳(北京时间13位时间戳),必须项
- appv: app版本号,如3.0.6,必须项
- apiv: 请求api的版本号,如1,非必须项
- os:请求客户端类型,用以区分安卓、ios、h5等, 必须项
- token:用户身份令牌,非必须项
- cmd5:请求content-type为 multipart/form-data时的文件md5值(32位小写);content-type为text、text/plain、application/json时的请求body字符串md5值(32位小写),非必须项
- 计算签名
使用构建完成的待签名字符串,和预先分配的签名密钥,通过hmac-sha1算法生成签名,将得到的结果作base64转码 - 完成请求
将生成的签名内容,追加到请求地址之后的sign参数处发起请求。 示例
原始请求
Request URL: xxx.com/user?a=1&c=3&b=2&appv=3.0.1×tamp=1562919679325&os=1&cmd5=283b33cfab85968d961c489295d58531 Request Method: PUT ski: ios1907 request payload: {"id":1,"username":"admin","nickName":"admin","password":"","mobile":"123321","isDisabled":0,"bindRoleIds":[1]}
待签名字符串
PUT\n /user\n ios1907\n a=1&appv=3.0.1&b=2&c=3&cmd5=283b33cfab85968d961c489295d58531&os=1×tamp=1562919679325
- 完成请求
将以上得到的待签名字符串,使用签名密钥(假定密钥值为"qktx")进行 hmac-sha1运算(结果作base64转码处理),得到最终sign值: rOqRxnby6Eo06e8HWRgSs7m8u6I=;
将值追加到请求地址之后的sign参数处,完成最终请求:Request URL: xxx.com/user?a=1&c=3&b=2&appv=3.0.1×tamp=1562919679325&os=1&cmd5=283b33cfab85968d961c489295d58531&sign=rOqRxnby6Eo06e8HWRgSs7m8u6I%3D Request Method: PUT ski: ios1907 request payload: {"id":1,"username":"admin","nickName":"admin","password":"","mobile":"123321","isDisabled":0,"bindRoleIds":[1]}
参考资料:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。