签名方法
最近更新时间:2023-07-07 17:09:39 前往 Coding 编辑 导出文档
为什么要进行签名
签名通过以下方式帮助保护请求:
- 验证请求者的身份
签名确保请求是由持有有效访问密钥的人发送的。请参阅控制台 云 API 密钥 页面获取密钥相关信息。 - 保护传输中的数据
为了防止请求在传输过程中被篡改,新联云 API 会使用请求参数来计算请求的哈希值,并将生成的哈希值加密后作为请求的一部分,发送到新联云 API 服务器。服务器会使用收到的请求参数以同样的过程计算哈希值,并验证请求中的哈希值。如果请求被篡改,将导致哈希值不一致,新联云 API 将拒绝本次请求。
推荐使用新联云 API 配套的几种常见的编程语言 SDK,已经封装了签名和请求过程,均已开源,支持 JavaScript、Go、NodeJS。
申请安全凭证
本文使用的安全凭证为密钥,密钥包括 SecretId 和 SecretKey。
- SecretId:用于标识 API 调用者身份,可以简单类比为用户名。
- SecretKey:用于验证 API 调用者的身份,可以简单类比为密码。
- 用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄漏,请立刻禁用该安全凭证。
申请安全凭证的具体步骤如下:
- 注册登录 新联云管理中心控制台 。
- 前往 云API密钥 的控制台页面。
- 在 云API密钥 页面,单击【新建密钥】创建密钥对。
签名版本签名过程
云 API 支持 GET 和 POST 请求。对于POST方法,目前支持 Content-Type: application/json
具体的请求方式参考业务接口文档说明。
下面详细解释签名计算过程。
1. 拼接规范请求串
GET请求
说明:先把请求参数中的key=>value键值对,把所有的key按从小到大排序,然后参数按key的顺序组装参数,最后转成json字符串
例如:
{"123":"123","abc":"abc","task_id":1}
代码示例(GO):
params := make(map[string]string)
for key, value := range request.GetParams() {
params[key] = value
}
rp, err := json.Marshal(params)
if err != nil {
return err
}
requestPayload = string(rp)
POST请求
说明:直接使用body的json串数据
代码示例(GO):
rp, err := json.Marshal(request)
if err != nil {
return err
}
requestPayload = string(rp)
2. 拼接待签名字符串
按如下格式拼接待签名字符串:
StringToSign = requestPayload + "_" + nonce + "_" + timestamp + "_" + secretid
字段名称 | 解释 |
---|---|
requestPayload | 第一步生成的规范请求串。 |
nonce | 当前请求的唯一字符串,即请求头部的公共参数 X-NC-Nonce取值 |
timestamp | 请求时间戳,即请求头部的公共参数 X-NC-Timestamp 取值,取当前时间 UNIX 时间戳,精确到秒。此示例取值为 1551113065 。 |
secretid | 需要携带在系统申请的SecretId信息。 |
注意:
说明:
- Timestamp 必须是当前系统时间,且需确保系统时间和标准时间是同步的,如果相差超过五分钟则必定失败。如果长时间不和标准时间同步,可能运行一段时间后,请求必定失败,返回签名过期错误。
根据以上规则,示例中得到的待签名字符串如下:
{"123":"123","abc":"abc","task_id":1}
d410b5a4-2369-452b-8282-fc1fc81ae70b
1551113065
7019a55be8395899b900fb5564e4200d984910f34794a27cb3fb7d10ff6a1e84
3. 计算签名
1)计算派生签名密钥,伪代码如下:
SecretKey = "Gu5t9xGARNpq86cd98joQYCN3*******"
SecretService = SHA256(StringToSign) // StringToSign 为第二步生成的待签名字符串
signature = HexEncode(HMAC_SHA256(SecretService, SecretKey))
4. 拼接 Authorization
按如下格式拼接 Authorization:
Authorization = signature
最终完整的调用信息如下:
https://winner-api.neunit.com:18053/cloud/tts/v1/text_to_voice
Authorization: 2a1c6b3d1690520da1abe41da12dfabaf2c1574892b6ff7927629d7a0b11cdfc
Content-Type: application/json
Host: winner-api.neunit.com:18053
X-NC-SecretId: 7019a55be8395899b900fb5564e4200d984910f34794a27cb3fb7d10ff6a1e84
X-NC-Nonce: d410b5a4-2369-452b-8282-fc1fc81ae70b
X-NC-Timestamp: 1551113065
{
"text": "你好",
"session_id": "f3632265-7232-44ca-bdc3-70c3c86617e8",
"voice_type": 0
}
签名演示
在实际调用 API 时,推荐使用配套的新联云 SDK ,SDK 封装了签名的过程,开发时只关注产品提供的具体接口即可。详细信息参见下方例子 。当前支持的编程语言有: