签名方法

最近更新时间:2023-07-07 17:09:39 前往 Coding 编辑

导出文档

为什么要进行签名

签名通过以下方式帮助保护请求:

  1. 验证请求者的身份
    签名确保请求是由持有有效访问密钥的人发送的。请参阅控制台 云 API 密钥 页面获取密钥相关信息。
  2. 保护传输中的数据
    为了防止请求在传输过程中被篡改,新联云 API 会使用请求参数来计算请求的哈希值,并将生成的哈希值加密后作为请求的一部分,发送到新联云 API 服务器。服务器会使用收到的请求参数以同样的过程计算哈希值,并验证请求中的哈希值。如果请求被篡改,将导致哈希值不一致,新联云 API 将拒绝本次请求。

推荐使用新联云 API 配套的几种常见的编程语言 SDK,已经封装了签名和请求过程,均已开源,支持 JavaScript、Go、NodeJS。

申请安全凭证

本文使用的安全凭证为密钥,密钥包括 SecretId 和 SecretKey。

  • SecretId:用于标识 API 调用者身份,可以简单类比为用户名。
  • SecretKey:用于验证 API 调用者的身份,可以简单类比为密码。
  • 用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄漏,请立刻禁用该安全凭证。

申请安全凭证的具体步骤如下:

  1. 注册登录 新联云管理中心控制台
  2. 前往 云API密钥 的控制台页面。
  3. 云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信息。

注意:

说明:
  1. 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 封装了签名的过程,开发时只关注产品提供的具体接口即可。详细信息参见下方例子 。当前支持的编程语言有: