node.js - 错误 : The request signature we calculated does not match the signature you provided. 检查您的 key 和签名方法

标签 node.js amazon-s3

过去三天我陷入了同样的签名问题。我不明白如何摆脱这个困境。

我正在尝试使用以下内容获取预签名网址:

    s3.getSignedUrl('putObject',
    event.pre_signed_url =    
           {Bucket:config.awsBucket,Key:event.filename}
      ); in Node js.

我使用这个预签名 URL 将图像文件上传到 s3 存储桶中:

   request({
      method:'PUT',
      url: event.pre_signed_url,
      ContentType: 'image/png',
      body: fs.createReadStream('./image.png')}
      , function(err, res, body)
   { if(err)console.log(err); return callback(body); }
  );

文件已成功上传到 s3 存储桶,我可以在 aws s3 存储桶控制台中看到。

问题是,如果我尝试使用终端中的curl 放置任何其他图像文件或尝试在浏览器中打开该URL,我得到的预签名URL 会给我签名不匹配错误。

如果我做错了或者我对预签名网址使用的理解是错误的,请指导我。

最佳答案

我在使用 S3.getSignedUrl('putObject', 服务器端,然后尝试使用该 url 客户端时遇到了同样的问题。您在请求上设置了一个额外的 header ,但该 header 未被处理在参数中设置。

在我的案例中,我注意到(可能与您的案例相关)是使用所有 S3.getSignedUrl 创建的签名都会考虑请求 header 。因此,如果您生成 URL,它将失败并显示您收到的相同错误消息,除非使用相同的 header 发送。

一个失败的例子:像这样生成..

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000 };
s3.getSignedUrl('putObject', params, function (err, url) {
      if(err){
        return cb(err);
      }
      return cb(null, url)
    });

当使用相同的 url 生成时,以下请求将失败。此请求是从浏览器发出的。

RequestMethod: Put
Headers: {
    Accept:*/*
    Accept-Encoding:gzip, deflate, br
    Accept-Language:en-US,en;q=0.9
    Connection:keep-alive
    Content-Length:11768
    Content-Type:application/x-www-form-urlencoded; charset=UTF-8
}

不同之处在于,上面创建的签名不包含内容类型,而请求确实指定了内容类型。参数需要匹配 header ,否则抛出的错误将是签名不匹配。

成功示例如下:

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000, Content-Type: 'application/x-www-form-urlencoded; charset=UTF-8' };
s3.getSignedUrl('putObject', params, function (err, url) {
      if(err){
        return cb(err);
      }
      return cb(null, url)
    });

关于node.js - 错误 : The request signature we calculated does not match the signature you provided. 检查您的 key 和签名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42245981/

相关文章:

android - 带标签/标签的照片的云存储架构/解决方案

amazon-s3 - 为什么要随机化云存储/CDN 的文件名?

amazon-web-services - 如何修复 AccessDenied 调用 CopyObject

javascript - 需要原型(prototype)内部或外部的功能?

node.js - 是否可以使用 Testcafe 检查 E2E 测试中预期的颜色代码?

node.js - 使用 Node Express 提供静态文件时正确的脚本路径是什么?

javascript - 如何创建 Grunt Multitask 来处理我的模板

amazon-web-services - 从 EC2 访问 AWS S3 存储桶

amazon-web-services - 如何使用 golang 从 AWS S3 下载

jquery - 如何在 jsdom@5 中使用 jQuery?