调用API须对HTTP请求进行签名,服务端通过签名来识别用户并验证其合法性。

签名认证方案

用户向服务器申请生成一个凭证,凭证是key/secret的密钥对。客户端对Method、Accept、Date以及其他Header字段和Url进行规定方式拼接后,通过哈希算法(如HMAC-SHA256)和用户的secret对请求进行签名。最后将key、使用的算法、参与签名的头部字段以及计算后的签名放入头部字段"Authorization"中。

签名参数 描述
username 该凭据的key
algorithm 采用的签名算法,目前只开放支持hmac-sha256
headers HTTP header名称列表,以空格隔开,用于对请求进行签名
signature 由客户端生成的经过base64编码后的签名串

签名字符串的构建方法
客户端应按照被签名对象在headers中出现的顺序来获取每个值,其中host、date和request-line这三个header字段必须参与签名,并遵循以下三个原则。

1、如果header不是request-line,则以小写的header名称,后跟ASCII冒号:和ASCII空格,再附加header值。

2、如果header是request-line,则以$http_method $request_uri $http_proto的形式生成字符串,三个值中间以ASCII空格隔开。

3、如果不是最后一个值,则附加ASCII换行符\n

举例:

请求API:

 $ curl -i -X GET http://serverIP:port/s2s/api/v1/product/list?isPage=0 \
  -H 'Host: serverIP:port' \
  -H 'Date: Tue, 26 Jun 2018 12:27:03 UTC'

在上面的请求中,应使用host、date和request-line组成待签名字符串,并使用hmac-sha256哈希算法创建摘要。

signing_string="host: serverIP:port\ndate: Tue, 26 Jun 2018 12:27:03 UTC\nGET /s2s/api/v1/product/list?isPage=0 HTTP/1.1"
digest=HMAC-SHA256(<signing_string&, <secret&)
base64_digest=base64(<digest&)

注意date必须是UTC+0或GMT时区,同时服务端会对date进行时钟偏移检查,最大允许300秒的偏差,超出偏差的请求都将被拒绝,所以请确保客户端的时钟同步。

最终得到的Authorization请求头的值应如下所示:

Authorization: hmac username=<your_key&, algorithm="hmac-sha256", headers="host date request-line", signature=<base64_digest&

将Authorization放入请求头中,完整请求应为如下的形式:

$ curl -i -X GET http://serverIP:port/s2s/api/v1/product/list?isPage=0 \
  -H 'Host: serverIP:port' \
  -H 'Date: Tue, 26 Jun 2018 12:27:03 UTC' \
  -H 'Authorization: hmac username=<your_key&, algorithm="hmac-sha256", headers="host date request-line", signature=<base64_digest&'

请求Body签名
当请求包含body时,必须对body进行签名。客户端对请求body进行SHA256计算,把计算结果进行Base64编码后放入头部字段Digest中。

Digest: SHA-256=base64(sha256(<body&))

最终构造的请求应为如下所示:

$ curl -i -X POST http://serverIP:port/s2s/api/v1/product/delete \
  -H 'Host: serverIP:port' \
  -H 'Date: Tue, 26 Jun 2018 12:27:03 UTC' \
  -H 'Digest: SHA-256=zc5lbDoNIhuwTUEzk+bu5OqCdHNxQxi4uKM5ghI2IDQ=' \
  -H 'Authorization: hmac username="alice123", algorithm="hmac-sha256", headers="host date request-line", signature="gaweQbATuaGmLrUr3HE0DzU1keWGCt3H96M28sSHTG8="' \
  -d '{"ids": ["3689034876788408320"]}'

Go & java 的签名下载地址分别为:

http://mscsdk.cn-bj.ufileos.com/sign-go.zip

http://mscsdk.cn-bj.ufileos.com/sign-java.zip

results matching ""

    No results matching ""