预签名的S3 URL签名不匹配

Onu*_*kan 6 amazon-s3 amazon-web-services node.js pre-signed-url

标题说明了一切.这是我的代码;

我正在使用node-formidable文件.

form.on("end",function(field, file){
        params.Body = fs.createReadStream(params.filePath)
        delete params.filePath;
        S3.getSignedUrl('putObject',params, function(err, url) {
            if(err){console.log(err);}
            console.log(url);
        });
    })
Run Code Online (Sandbox Code Playgroud)

成功上传后,url变量返回s3 url,类似这样;

https://bucket-name.s3.amazonaws.com/746575308_8c081369df.jpg?AWSAccessKeyId=[key]&Expires=[date]&Signature=[signature]&x-amz-acl=public-read

但仍然收到SignatureDoesNotMatch错误.在描述中说

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

这是我的参数

params = {
    Bucket:"bucketname",
    Key: file.name,
    ACL: 'public-read'
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

far*_*llw 16

我在使用S3.getSignedUrl('putObject'服务器端时遇到了同样的问题,然后尝试使用该 url 客户端。

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

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

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

使用生成的相同 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
}
Run Code Online (Sandbox Code Playgroud)

不同之处在于上面创建的签名不包括内容类型,其中请求确实指定了内容类型。params 需要匹配 headers,否则抛出的错误将是签名不匹配。

成功例子如下:

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

  • 即使您的内容类型正确,如果您使用浏览器的 POST 请求而不是 PUT,您也会收到此错误(正如我在用头撞墙 2 小时后发现的那样) (4认同)