Skip to content

鉴权相关

概述

本站上提到的所有接口都需要严格的验签。请仔细阅读以下章节,了解如何生成签名和认证。 所有HTTP方法 (GET, POST, PUT, DELETE), 必须包含特定的key:

  • Authorization
  • Timestamp
  • Nonce

请在请求头中使用正确的值,否则将导致响应码为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等拼接顺序不能随意调换

具体各部分的含义如下:

NameDescription
MethodHTTP请求的方法:GETPOSTPUTDELETE(均为大写)。
Content-MD5Content-MD5为请求内容的Base64(MD5(body)),body为请求中的报文主体(request body), 请参考Body Requirement
TimestampTimestamp为Header头中的时间戳的值。
NonceNonce为Header头中的随机数的值。
CanonicalizedResourceCanonicalizedResource为规范资源的值。请参考Canonicalized Resource

Body Requirement

  • 请求方法为GETDELETE时,报文主体为空,Content-MD5不参与签名。
  • 当请求方法为POSTPUT时请使用真实发送的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请求鉴权示例

假设我们有一个APPIDAPPSECRET对:

  • APPID=85206f97-2f4f-4b6e-8830-f3f4ec6fd6ae
  • APPSECRET=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=

请求体如下:

json
{"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

注意:

callbackname按照字典序排序,同时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请求示例

GETDELETE的请求类似,下面以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

注意:

GETDELETE请求不需要计算Content-MD5

2、通过 Base64(HMAC-SHA256(APPSECRET, StringToSign))计算SignatureSignature=7qyLW5QVHcgUC8nHwwtJWTxAGn1TDA5TQigoLngWo+o=

3、最终得到 Authorization

Authorization=cbs:85206f97-2f4f-4b6e-8830-f3f4ec6fd6ae:7qyLW5QVHcgUC8nHwwtJWTxAGn1TDA5TQigoLngWo+o=