鉴权相关
概述
本站上提到的所有接口都需要严格的验签。请仔细阅读以下章节,了解如何生成签名和认证。 所有HTTP方法 (GET, POST, PUT, DELETE), 必须包含特定的key:
AuthorizationTimestampNonce
请在请求头中使用正确的值,否则将导致响应码为1011或其他非0响应码。
请求 Headers
所有的接口请求头中都需要添加以下key-value:
| 参数名 | 描述 | 参数值 |
|---|---|---|
Authorization | 签名信息 | cbs:APPID:Signature |
Timestamp | 请求时间秒级时间戳 | 单位为秒。时区必须设置为UTC。例如,2022-02-28 08:00:00 (UTC+0) ,对应的时间戳应该是1646035200。 |
Nonce | 随机数 | 建议每个请求的nonce不相同,最大长度为36个字符。 |
注意:
Timestamp为请求当时的时间戳,请勿随意修改Timestamp的值,服务端会根据Timestamp的值离当前时间是否超过60s来判断请求是否过期,这有助于防止潜在的重复攻击。
Authorization字段
- cbs:为固定前缀,填写cbs即可。
- APPID:调用者调用API所用的APPID的值。
- Signature:使用APPID和APPSECRET对请求进行对称加密的签名计算,计算步骤详见下一小节。
注意:
cbs、APPID、Signature以:进行拼接,请确保前后没有空格。
签名计算
签名的计算公式如下:
Signature = Base64(HMAC-SHA256(APPSECRET, StringToSign))其中StringToSign是需要构造的待签名字符串,构造方法为:
StringToSign = Method + "\n" +Content-MD5 + "\n" + Timestamp + "\n" + Nonce + "\n" + CanonicalizedResource注意:
"\n"为换行符,Method、Content-MD5等拼接顺序不能随意调换
具体各部分的含义如下:
| Name | Description |
|---|---|
Method | HTTP请求的方法:GET、POST、PUT、DELETE(均为大写)。 |
Content-MD5 | Content-MD5为请求内容的Base64(MD5(body)),body为请求中的报文主体(request body), 请参考Body Requirement |
Timestamp | Timestamp为Header头中的时间戳的值。 |
Nonce | Nonce为Header头中的随机数的值。 |
CanonicalizedResource | CanonicalizedResource为规范资源的值。请参考Canonicalized Resource |
Body Requirement
- 请求方法为
GET、DELETE时,报文主体为空,Content-MD5不参与签名。 - 当请求方法为
POST、PUT时请使用真实发送的JSON报文。 图片上传API,Content-MD5不参与签名。 MD5(body)为MD5后的字节流,不需要进行hex转化。
CanonicalizedResource
CanonicalizedResource表示想要访问URL的规范描述,需要将path和query参数拼接生成子资源字符串,query参数按照名称进行字典序(a-z)升序排列并以“&”为分隔符。
示例:
- url的原始请求链接
/api?status=COMPLETE&name=test_alert&callback=https%3A%2F%2Fwww.baidu.com%3Fquery%3Dchina- 签名时要求的规范资源值为
/api?callback=https://www.baidu.com?query=china&name=test_alert&status=COMPLETE注意:
CanonicalizedResource的计算规则仅代表签名时需要按照此规范,原始的url链接不需要变动。- 参与签名时所有的query值(如非英文字符、url、特殊字符等)不需要
UrlEncode,否则会导致服务器签名校验不通过。
API请求鉴权示例
假设我们有一个APPID和APPSECRET对:
APPID=85206f97-2f4f-4b6e-8830-f3f4ec6fd6aeAPPSECRET=c6ae8924a68a5d839947a7885894dfe4
POST、PUT请求示例
POST、PUT请求的签名类似,下面以POST请求为例,请求报文如下:
POST http://127.0.0.1:8080/ir/recongize?name=hk&callback=https%3A%2F%2Fwww.baidu.com%3Fquery%3Dchina
Content-Type:application/json
Nonce:sweewew
Timestamp:1666764711
Authorization:cbs:85206f97-2f4f-4b6e-8830-f3f4ec6fd6ae:OaUMtmkO2pxAuP/iU3hj8+Bn4FosdVyu8eflY8mMcyE=请求体如下:
{"request_id":"9177er67378273888287321","image_url":"https://f-dev.clobotics.cn/4/0040ca4d85f5e5ef7354102f486ef843.jpg","scene_type":"104","ext_info":"this is a test"}1、计算请求body的Content-MD5=ilHp6H9FaX49IFrwOj/TDw==
2、得到stringToSign=
POST
ilHp6H9FaX49IFrwOj/TDw==
1676764711
ererere
/ir/recongize?callback=https://www.baidu.com?query=china&name=hk注意:
callback和name按照字典序排序,同时callback签名时使用urlEncode之前的值。
3、通过 Base64(HMAC-SHA256(APPSECRET, StringToSign))计算SignatureSignature=OaUMtmkO2pxAuP/iU3hj8+Bn4FosdVyu8eflY8mMcyE=
4、最终得到Authorization=cbs:85206f97-2f4f-4b6e-8830-f3f4ec6fd6ae:OaUMtmkO2pxAuP/iU3hj8+Bn4FosdVyu8eflY8mMcyE=
GET、DELETE请求示例
GET、DELETE的请求类似,下面以GET请求为例,请求报文如下:
GET http://127.0.0.1:8080/ir/recognize/result/7177er67378273888287321
Nonce:ererere
Timestamp:1666764711
Authorization: cbs:85206f97-2f4f-4b6e-8830-f3f4ec6fd6ae:7qyLW5QVHcgUC8nHwwtJWTxAGn1TDA5TQigoLngWo+o=1、得到stringToSign:
GET
1676764711
ererere
/ir/recognize/result/7177er67378273888287321注意:
GET、DELETE请求不需要计算Content-MD5
2、通过 Base64(HMAC-SHA256(APPSECRET, StringToSign))计算SignatureSignature=7qyLW5QVHcgUC8nHwwtJWTxAGn1TDA5TQigoLngWo+o=
3、最终得到 Authorization
Authorization=cbs:85206f97-2f4f-4b6e-8830-f3f4ec6fd6ae:7qyLW5QVHcgUC8nHwwtJWTxAGn1TDA5TQigoLngWo+o=