调用 API 时返回签名错误的原因有哪些?

调用 API 时需要签名验证以保证接口数据的安全,避免出现例如请求数据被劫持篡改、请求超过时效、数据重复提交攻击等问题。

如果您是通过企业内部应用鉴权访问,则详细请参见 企业内部应用鉴权 章节描述的算法;如果您是通过第三方应用鉴权访问,则详细请参见 第三方应用鉴权(OAuth2.0) 章节描述的算法。调用方使用指定的签名算法计算方法对 HTTP 请求进行签名,通过 "X-TC-Signature" 将签名送到后台进行校验。校验签名通过,则会继续业务处理和返回结果。校验失败则会返回签名错误 "signature failed"。

签名算法步骤签名算法的步骤,可以简单概括为以下四步:

生成签名串。对签名串进行 “HMAC-SHA256” 哈希计算。将哈希串转换成16进制字符串。对16进制字符串进行 Base64 编码。被签名串签名算法的步骤中,第一步很重要。被签名串分4个部分,由“\n”分割:

HTTP 方法的大小字符串 (“POST”,“GET”,“PUT”,“DELETE”)。参加签名的 HTTP 头组成的串。HTTP URI。HTTP body,如 body 为空,例如 GET 消息,则用空字符串(“”)。被签名串的注意点HTTP 方法要大写:“POST”,“GET”,“PUT”,“DELETE”。URI 包含请求地址端口后面的全部串,例如:代码语言:javascript代码运行次数:0运行复制https://api.meeting.qq.com/v1/meetings/7567173273889276131?userid=tester1&instanceid=1 则此处的 URI 为"/v1/meetings/7567173273889276131?userid=tester1&instanceid=1"。

注意在组织被签名串时,切勿忘记各部分之间的回车换行符 “\n”。

企业内部应用鉴权 或 第三方应用鉴权(OAuth2.0)中的 Params,指的是 HTTP 请求的整个消息体 body。请注意,如果 body 为空,例如 GET 消息,则用空串。HTTP 请求头里的字段 X-TC-Key 参与签名计算,该字段填写的是用户获得的密钥对当中的 secret_id,此处容易误解而使用 secret_key。