Cloudinary签名调用错误 - 无效签名

问题描述 投票:0回答:1

我正在尝试使用签名调用方法从前端上传图像,但无法使其正常工作。 我分配的唯一参数是时间戳。 如果我弄清楚了这一点,我还想分配更多内容,但我现在只是做时间戳只是为了完成这项工作。

我收到“无效签名 MY_HASHED_STRING。要签名的字符串 - 'timestamp=1730359693'。” 当我调用 Cloudinary 的 api 时。

这是我的打字稿前端部分:

const formData = new FormData();
formData.append("api_key", import.meta.env.VITE_CLOUDINARY_API_KEY);
formData.append("file", resizedImage as Blob);
formData.append("signature", signature);
formData.append("timestamp", timestamp);

axios
   .post(
      `https://api.cloudinary.com/v1_1/${cloudName}/image/upload`,
      formData,
   )
   .then((res) => {
      setTrimImg(res.data.secure_url);
   })
   .catch((error) => {
      console.error("Error uploading image:", error);
      onError && onError();
   });

这是我用 go 编写的后端部分:

处理程序

func (h *ClientSideHandler) GetUploadSignature(w http.ResponseWriter, r *http.Request) {
    timestamp := strconv.FormatInt(time.Now().Unix(), 10)
    params := map[string]string{
        "timestamp": timestamp,
    }

    signature, err := utils.GenerateUploadSignature(params)
    if err != nil {
        logger.Error.Printf("Failed to generate signature: %v", err.Error())
        http.Error(w, "Failed to generate signature", http.StatusInternalServerError)
        return
    }

    res := map[string]interface{}{
        "signature": signature,
        "timestamp": timestamp,
    }
    utils.JsonRes(w, res, "success", false)
   return
}

创建签名的函数:

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)

    stringToSign := ""
    for _, key := range keys {
        value := params[key]
        stringToSign += fmt.Sprintf("%s=%s&", key, value)
    }
    // Remove the trailing '&'
    stringToSign = stringToSign[:len(stringToSign)-1]

    stringToSign += secret
    fmt.Println("stingsssssss", stringToSign)

    mac := hmac.New(sha1.New, []byte(secret))
    mac.Write([]byte(stringToSign))
    signature := hex.EncodeToString(mac.Sum(nil))

    return signature, nil
}

javascript typescript go cloudinary
1个回答
0
投票

签名不是 HMAC,而是简单的 SHA1 哈希值

你应该使用

    sum := sha1.Sum([]byte(stringToSign))
    signature := hex.EncodeToString(sum[:])

而不是

    mac := hmac.New(sha1.New, []byte(secret))
    mac.Write([]byte(stringToSign))
    signature := hex.EncodeToString(mac.Sum(nil))
© www.soinside.com 2019 - 2024. All rights reserved.