跳到主要内容

Restful API 访问签名生成方式

更新时间 2025/02/22 07:19:43

签名是什么

英飞画布 Restful API 基于签名来验证请求的合法性,只有签名验证通过后才会进行业务请求的受理。 签名是将业务参数以 参数名称=参数值 的形式按照 参数名称 的字⺟表升序排序,并⽤ & 拼接, 然后⽤ HMAC-sha1 签名并以 Hex 格式输出的字符串。

签名需要由调用者自行生成,每次发送 restful 请求都需要创建新的签名,并于请求参数中携带签名。 请求的常规格式为:

POST {REQ_URL}?{QUERY_PARAMS}&signature={SIGNATURE}

// 例子
curl POST 'https://api.infi.cn/u3wbs/wbs/websdk/createBoard?appId=test&expire=12345678901234&creatorId=test&signature=70D59A285EE91C666020FB3D0359FBAAA1867145'
  • REQ_URL: 接口的具体路径,详情请参考各具体接口文档。
  • QUERY_PARAMS: 请求数据,以 URLsearchParams 形式传至英飞服务端,详情请参考各具体接口文档。
  • SIGNATURE: 访问签名,生成方式请参考下文。

除了签名中携带参数外,部分复杂接口还需要携带Body参数,详情请参考各具体接口文档。

签名生成所需信息

固有信息(所有接口请求都需要附带的信息)

  • appId: 应用 ID, string 类型;每个英飞画布应用都会有一个唯一的 appId 作为其标识,appId 可于控制台/应用详情中中查看获取。appId 会参与签名过程,并需要在请求参数中携带。

  • appSecret: 应用秘钥,string 类型;每个英飞画布应用都会有一个唯一的 AppSecret,可于控制台/应用详情中获取。secret key 会作为 HMAC-sha1 算法的 key 值参与签名的计算,但不需要在请求参数中携带(注:请妥善保管 AppSecret 信息,不推荐基于网络传输 AppSecret。)。

  • expire: 签名过期时间戳,number 类型; 服务器在受理请求时,如果检查到 expire 时间戳早于系统时间戳,则不会受理请求,并反馈错误信息。

数据信息

请求本身所需要的业务数据也会参与签名过程,具体情况请查看各接口详细参数说明。

生成签名代码 Demo

// 平台分配给开发者的应用秘钥
const signKey = 'APP_SECRET_KEY_HERE';
// 业务请求本身所需要的数据
const businessParams = { "name":"Bob", "phone":"12245678900" };

// 在业务参数的基础上, 补充必要参数信息
businessParams["appId"] = "APP_ID_HERE";
businessParams["expire"] = Date.now() + 60000;

// 将参数名与参数值拼接,并按照参数首字母升序排序
const sortedParams = Object.keys(businessParam).sort().map(key => `${key}=${businessParam[key]}`);
// 连接成字符串
const content = sortedParams.join('&');

// 使用分配的应用秘钥来加密生成访问签名
const signature = crypto.createHmac('sha1', signKey).update(content).digest('hex').toUpperCase();