当前位置: 首页 > 知识库问答 >
问题:

上载时aws预签名的url请求签名不匹配

苍元章
2023-03-14

我试图上传一个图像使用预先签名的网址

const s3Params = {
  Bucket: config.MAIN_BUCKET,
  Key: S3_BUCKET + '/'+fileName,
  ContentType: fileType,
  Expires: 900,
  ACL: 'public-read'
};
const s3 = new AWS.S3({
  accessKeyId: config.accessKeyId,
  secretAccessKey: config.secretAccessKey,
  'region': config.region
});
const url = await s3.getSignedUrlPromise('putObject', s3Params)
return url

我得到了一个类似的url

https://s3.eu-west-1.amazonaws.com/bucket/folder/access.JPG?AWSAccessKeyId=xxxx

  1. 我已经尝试上传文件与内容类型图像/jpg,多部分/表单数据。
  2. 尝试生成没有文件类型和上传的网址。
  3. 尝试了放后法

但似乎什么都不管用

错误总是:

我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

Access凭据具有适当的权限,因为在尝试通过对象上载(通过api而不是预先签名的url)时,这些上载文件可以正常运行

编辑:

邮递员似乎正在以多部分/表单数据的形式发送内容类型;边界=----------------------------336459561795502380899802。这里添加了额外的边界。如何解决这个问题?

共有2个答案

鱼浩荡
2023-03-14

我在测试邮递员的表格数据。但是getsignedUrl()函数不支持这一点。尝试使用二进制,效果很好。对于multipart,aws sdk中似乎有一个不同的函数

羿经武
2023-03-14

根据AWS S3文档签名和验证REST请求,S3默认使用SignatureVersion4。

但是nodejs AWS-SDK默认使用SignatureVersion2。

因此,您必须在请求标头中显式指定SignatureVersion4

在S3配置中添加此代码

    s3 = new AWS.S3({
        'signatureVersion':'v4'
    });
 类似资料:
  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 我试图上传图像/视频使用PHP/Javascript到AWS S3 这是我的PHP代码 这是我的Java脚本代码 所有这些功能工作伟大,我想即使在执行它给我文件上传成功消息too.but当我检查s3什么都没有。 即使在控制台中,它也会像下面一样生成预签名URL。但当我尝试单击它时,它会给我SignatureDesNotMatch错误。(请单击URL)。可能是什么错误。。? https://ibra

  • 我想将用户配置文件图片存储在S3桶中,但保留这些图片的私密性。为了做到这一点,我正在创建一个预先签名的网址,每当图像是必需的。然而,这每次都会创建一个独特的网址,这意味着浏览器永远不会缓存图像,最终我会在GET请求中支付更多。 下面是生成url的代码示例,我使用的是Laravel: 我认为,通过指定日期时间而不是时间单位,它将创建相同的url,但实际上会将剩余秒数添加到url,下面是一个示例: x

  • 我遵循了关于这个问题的说明https://github.com/aws/aws-sdk-go/issues/467,其中清楚地记录了如何为PUT请求创建预签名的url。目标是预置url,这样我就可以安全地直接从浏览器上传图像

  • 有没有办法让预签名的aws上传URL在出现错误时返回json响应,而不是xml响应。 目前,如果url过期,它会返回如下内容。 如果这是json响应就好了。