动态签名验证
每次调用接口都需要添加签名才能使用,签名是根据当前时间戳和其他参数实时计算出来的,并且签名一般只能使用一次。签名具体方式是在访问接口时添加额外的URL请求参数,如下所示
?adminkey={adminkey}&customerId={customerId}&nonce={nonce}×tamp={timestamp}&sign={sign}
签名相关参数说明
名称 | 说明 |
---|---|
adminkey | 客户管理key |
adminsecret | 客户密钥 |
customerId | 客户编码 |
robotsecret | 机器人密钥 |
nonce | 随机数(自己随机生成即可) |
timestamp | 当前时间戳(调用方生成13位当前时间戳,要尽可能准确,否则会导致签名失败) |
uri | 接口URL(不含URL请求参数) |
sign | 计算出的签名(计算方法见下节) |
签名计算方法
md5(adminkey:${adminKey},adminsecret:${adminSecret},customerId:${customerId},nonce:${nonce},robotsecret:${robotSecret},timestamp:${timestamp},uri:${uri})
签名计算注意事项
- 使用13位当前时间戳,并尽可能准确,以保证签名有效
- 不同接口计算签名时,uri参数不同;同一个接口如果租户不同、机器人不同或者知识规则不同时,uri参数也不同
- 每次调用接口前,签名要根据当前时间戳实时计算出来,不能把签名缓存下来使用
签名计算示例
Python
import hashlib
...
hashlib.md5().update("adminkey:aWNzLWJpZy1jdXN0b21lci13eXMtMTUyMzUyMDg5NDU0MQ==,adminsecret:a3a2338ba18c9a9e240fd38f5ee1af09,customerId:wys,nonce:12345678,robotsecret:acb1ceb16997c62664197638e0f89cc0,timestamp:1524131680855,uri:/v1/openapi/tenants/132/robots/f638ad60-84c7-4f14-9990-7f8af0dfe3b3/robot/ask")
Java
import org.apache.commons.codec.digest.DigestUtils;
...
DigestUtils.md5Hex("adminkey:aWNzLWJpZy1jdXN0b21lci13eXMtMTUyMzUyMDg5NDU0MQ==,adminsecret:a3a2338ba18c9a9e240fd38f5ee1af09,customerId:wys,nonce:12345678,robotsecret:acb1ceb16997c62664197638e0f89cc0,timestamp:1524131680855,uri:/v1/openapi/tenants/132/robots/f638ad60-84c7-4f14-9990-7f8af0dfe3b3/robot/ask");