我正在尝试使用签名调用方法从前端上传图像,但无法使其正常工作。 我分配的唯一参数是时间戳。 如果我弄清楚了这一点,我还想分配更多内容,但我现在只是做时间戳只是为了完成这项工作。
我收到“无效签名 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
}
签名不是 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))