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
- JavaScript
- Go
// 平台分配给开发者的应用秘钥
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();
func Encrypt(params map[string]string, appkey string) (string, error){
if len(appkey) == 0 {
return "", errors.New("miss appkey")
}
keys := make([]string, 0, len(params))
for k, _ := range params {
keys = append(keys, k)
}
sort.Strings(keys)
keyValues := []string{}
for _, k := range keys {
if k == "signature" || len(k) == 0 {
continue
}
keyValues = append(keyValues, k+"="+params[k])
}
var p = strings.Join(keyValues, "&")
mac := hmac.New(sha1.New, []byte(appkey))
mac.Write([]byte(p))
var signature = fmt.Sprintf("%X", mac.Sum(nil))
return signature, nil
}
// 调用本函数,给入包含必要信息的的请求体,与应用秘钥,即可获得请求签名
func GetSignature(urlparams url.Values, appkey string) (string, error)
{
params := make(map[string]string)
for k, v := range urlparams {
params[k] = v[0]
}
return Encrypt(params, appkey)
}