You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloudinary签名调用错误:无效签名问题求助

问题原因及解决方案

核心错误:签名生成逻辑不符合Cloudinary规则

你当前的签名生成代码犯了关键错误:错误地将API Secret追加到了要签名的参数字符串中,同时重复用Secret作为HMAC密钥。Cloudinary的签名规则是:仅对排序后的参数键值对字符串(如timestamp=1730359693)使用API Secret作为密钥进行HMAC-SHA1哈希,不需要把Secret拼接到参数串里。

你的代码中这一行是问题根源:

stringToSign += secret

这会导致要哈希的字符串变成timestamp=xxx<你的Secret>,而Cloudinary期望的哈希对象仅仅是timestamp=xxx,最终生成的签名自然不匹配。


修正后的签名生成函数

替换GenerateUploadSignature函数为以下代码:

func GenerateUploadSignature(params map[string]string) (string, error) {
    keys := make([]string, 0, len(params))
    for key := range params {
        keys = append(keys, key)
    }
    sort.Strings(keys)

    // 拼接排序后的参数串,格式为key=value&key=value(无末尾&)
    var stringToSign strings.Builder
    for i, key := range keys {
        if i > 0 {
            stringToSign.WriteByte('&')
        }
        stringToSign.WriteString(fmt.Sprintf("%s=%s", key, params[key]))
    }

    // 直接用API Secret作为密钥,对参数串做HMAC-SHA1哈希
    mac := hmac.New(sha1.New, []byte(secret))
    mac.Write([]byte(stringToSign.String()))
    signature := hex.EncodeToString(mac.Sum(nil))

    return signature, nil
}

额外验证要点

  1. 确保timestamp完全一致:前端必须使用后端返回的timestamp,不能自行生成,你的当前代码已经满足这一点,无需修改。
  2. API Secret正确性:确认后端使用的secret变量是Cloudinary控制台中的API Secret,而非API Key或其他值。
  3. 扩展参数注意事项:后续添加更多参数(如public_id、folder)时,必须将这些参数同时加入后端的params map(参与签名生成)和前端的FormData(上传时传入),且键值完全一致,否则签名会再次失效。

内容的提问来源于stack exchange,提问作者GCnomore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:04:52