无法使用客户端签名调用将图像上传到 Cloudinary - 签名无效

Posted

技术标签:

【中文标题】无法使用客户端签名调用将图像上传到 Cloudinary - 签名无效【英文标题】:Can't upload image to Cloudinary using client side signature call - invalid signature 【发布时间】:2021-11-07 10:27:15 【问题描述】:

我似乎无法生成正确的签名以成功上传图片。

错误信息 -

消息:'无效签名 953e29c9b5cac0f611e347d508aaff75f11f0547。要签名的字符串 - 'timestamp=1631318071'。'

也许有人可以告诉我我出了什么问题?也许某些东西的顺序(根据文档)?

仅供参考 - 我尝试更改在参数服务器端传递的顺序,但似乎对成功上传没有太大作用。

这是我如何生成签名客户端 (C#) 并将数据传递给客户端 (Angular)

DateTime foo = DateTime.Now;
long timeStamp = ((DateTimeOffset)foo).ToUnixTimeSeconds();
var p = new Dictionary<string, object>();
p.Add("api_key", _cloudinaryConfig.Value.ApiKey);
p.Add("api_secret", _cloudinaryConfig.Value.ApiSecret);
p.Add("cloud_name", _cloudinaryConfig.Value.CloudName);
p.Add("timestamp", timeStamp);
var signature = _cloudinary.Api.SignParameters(p);
return Ok(new 
   cloudUploadUrl = _cloudUploadUrl, 
   cloudName = _cloudinaryConfig.Value.CloudName, 
   cloudApiKey = _cloudinaryConfig.Value.ApiKey, 
   cloudSignature = signature,
   cloudTimeStamp = timeStamp
);

这是客户端尝试在 Angular 中上传图片

const data = new FormData();
data.append('file', croppedImage.base64);
data.append("api_key", cloudinaryParams.cloudApiKey);
data.append("signature", cloudinaryParams.cloudSignature);
data.append("timestamp", cloudinaryParams.cloudTimeStamp);

const fileResult = await fetch(cloudinaryParams.cloudUploadUrl, 
  method: 'POST',
  body: data,
);

const fileData = await fileResult.json();

if (fileData.error) 
  // do something to handle the error!

【问题讨论】:

【参考方案1】:

错误消息中的字符串显示正在服务器端根据您在上传 API 调用中提供的签名检查的参数。

基于该错误,应该用于为示例上传 API 调用创建签名的唯一参数是“时间戳”,并且它需要在两个 API 上都具有 1631318071 的值调用并在创建签名的函数中:https://cloudinary.com/documentation/signatures

如果我正确理解了您的 C# 代码,您很可能可以通过删除所有 p.add() 调用来解决此问题,但带有时间戳参数的调用除外

【讨论】:

感谢您的帮助!出于某种原因,我读错了文档,并认为您必须将其他参数(例如 api_key、api_secret、cloud_name)放在签名中。这里的文档 - cloudinary.com/documentation/…

以上是关于无法使用客户端签名调用将图像上传到 Cloudinary - 签名无效的主要内容,如果未能解决你的问题,请参考以下文章

Rails Rollback Transaction 尝试使用carrierwave上传图片时

将签名上传到 Azure Blob 存储

使用 AlamoFire 和预签名 URL 将图像上传到 S3 存储桶时出现问题

如何使用节点、createPresignedPost 和 fetch 将图像文件直接从客户端上传到 AWS S3

Android:无法使用 php 脚本将图像上传到远程 MySql DB

Amazon S3 预签名 URL - 手动或一次性上传无效