# 接口认证签名方法

在每次API调用时,为了验证调用者的身份,防止未授权的调用。数产平台要求企业系统根据请求的API生成一个签名,作为请求参数一起发送到数产平台。 数产平台验证签名正确后,才允许对API的调用。

创建企业应用时,数产平台为每个企业应用生成了一组App IDApp Secret,用于企业系统调用API时生成签名。企业系统需要将这组值放置于配置文件中,并做好保密。

# 1. 在请求参数中加入当前时间戳

获取当前时间戳,以Query参数的形式拼接在请求URL后。 注意时间戳必须是Unix Timestamp的格式,精确到秒。例如:

https://api.ip.hetutec.com/v2/apps/1583379053837029376/hashes?timestamp=1666341958

# 2. 生成待签名字符串

将待发送请求的Query参数和Body参数全部放在一起(不要signature字段),按照字母表顺序进行排序,然后使用Query String的方式进行编码,并拼接在请求的request path后面。

下面是个待签名字符串的例子,注意最后生成的待签名字符串中参数的数量和顺序。

待签名请求:

[POST] https://api.ip.hetutec.com/v2/apps/1583379053837029376/hashes?timestamp=1666341958

[Body]
{
  "hash": "85ca20b5ff6c404e75426f7b14caef6cfee82b0ae3822ae56e3a674856afbf6f",
  "type": 4
}

待签名字符串:

https://api.ip.hetutec.com/v2/apps/1583379053837029376/hashes?hash=85ca20b5ff6c404e75426f7b14caef6cfee82b0ae3822ae56e3a674856afbf6f&timestamp=1666341958&type=4

# 3. 生成签名

使用HMAC-SHA256算法,将App Secret作为密钥,生成上面的待签名字符串的校验码,即为请求的签名。

在Golang中生成签名的代码示例:

signatureData = hmacSha256({ signString }, { appSecret })
signature = hex.EncodeToString( {signatureData} )

签名示例:

[POST] https://api.ip.hetutec.com/v2/apps/1583379053837029376/hashes?timestamp=1666341958

[Body]
{
  "hash": "85ca20b5ff6c404e75426f7b14caef6cfee82b0ae3822ae56e3a674856afbf6f",
  "type": 4
}

[App ID]
1583379053837029376

[App Secret]
UgHWn1Cd0lEdNOZV6a2FpOaL3b5HFDbU

待签名字符串:

https://api.ip.hetutec.com/v2/apps/1583379053837029376/hashes?hash=85ca20b5ff6c404e75426f7b14caef6cfee82b0ae3822ae56e3a674856afbf6f&timestamp=1666341958&type=4

生成的签名:

a7feff32026eb4dd4b36b0f384696c74745cb6ddb6754d54c2645fd75cfcc043

# 4. 将签名加入请求参数中,发起请求

在请求的Query参数中增加signature字段,并填入上一步生成的值,然后就可以发送API请求了。

[POST] https://api.ip.hetutec.com/v2/apps/1583379053837029376/hashes?timestamp=1666341958&signature=a7feff32026eb4dd4b36b0f384696c74745cb6ddb6754d54c2645fd75cfcc043

[Body]
{
  "hash": "85ca20b5ff6c404e75426f7b14caef6cfee82b0ae3822ae56e3a674856afbf6f",
  "type": 4
}