签名规则完整的请求 Headers 中有 accesstoken,timestamp,signature 三个参数。
accesstoken 可以在“认证获取token”这个接口中获取(详见下一章)
timestamp 是当前请求的时间戳,输入当前时间即可
signature 是接口签名认证,则需要进行构造。
其中,signature 签名规则如下。
1 构造源串
• GET 请求:
得到所有参数,按照字典升序排列,参照(key=value)用&拼接起来。
原先的参数请求是 c=1&a=a&b=b,排序之后就变成 a=a&b=b&c=1
• POST/PUT/DELETE 请求:
请求的 JSON 直接作为一个完整参数。
• 在基础参数上按顺序加上 token,timestamp:
a=a&b=b&c=1&token=d0f462f8-73d3-4cec-8d7d-11367c264fa6×tamp=1574821902392
{“a”:”a”,”b”:”b”,”c”:1}&token=d0f462f8-73d3-4cec-8d7d-11367c264fa6×tamp=1574821902392
2 URL编码
在第一步“构造源串”中得到的字符串,在此步骤中用来 URL 编码。
除了用普通方法来 URL 编码外,还有几个字符需要特殊处理。
Java 方法:
String sources = getSourceParameters(); //第一步“构造源串”
String newSources = URLEncoder.encode(sources, "UTF8")
newSources = newSources.replace("+", "%20");
newSources = newSources.replace("*", "%2A");
newSources = newSources.replace("~","%7E");
3 加密
• HMAC256 加密
对在第二步得到的字符串进行 HMAC256 编码,HMAC256 编码的 key 为之前的 accesstoken。
• Base64 加密
在 HMAC256 加密之后,再进行一次 Base64 加密。
4 去掉特殊字符
去掉 Base64 加密后之后的\r\n,然后就得到最终的签名。
5 示例
• 源串:
top=30&robotNo=2d3d833bd2e711e997ae6c0b84d60408
• 排序:
robotNo=2d3d833bd2e711e997ae6c0b84d60408&top=30
• 加上 token,timestamp:
robotNo=2d3d833bd2e711e997ae6c0b84d60408&top=30&token=d0f462f8-73d3-4cec-8d7d-11367c2
64fa6×tamp=15748219023
• URL 编码:
robotNo%3D2d3d833bd2e711e997ae6c0b84d60408%26top%3D30%26token%3Dd0f462f8-73d3-4cec
-8d7d-11367c264fa6%26timestamp%3D15748219023
• HMAC256 加密:
c63017ee79bd6b8947c353b2e7f7ec9a466e4ae70bc906aa7bc42eca4eacb133
• Base64 加密:
YzYzMDE3ZWU3OWJkNmI4OTQ3YzM1M2IyZTdmN2VjOWE0NjZlNGFlNzBiYzkwNmFhN2JjNDJlY2E0ZW
FjYjEzMw==
• 去掉\r\n:
YzYzMDE3ZWU3OWJkNmI4OTQ3YzM1M2IyZTdmN2VjOWE0NjZlNGFlNzBiYzkwNmFhN2JjNDJlY2E0ZW
FjYjEzMw==
这个就是最终的接口签名值,需要在 header 里面传递。