【问题标题】:AWS S3 ajax PUT returning 'The request signature we calculated does not match the signature you provided'?AWS S3 ajax PUT 返回“我们计算的请求签名与您提供的签名不匹配”?
【发布时间】:2015-07-23 02:11:44
【问题描述】:

我正在尝试通过预签名 URL 将文件上传到 S3。我已经通过curl 测试该 URL 确实有效

curl --request PUT --upload file {filename} "{url}"

它把它推到那里 A-OK。

但是,当我从 javascript 中尝试它时,我收到了这条消息:

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

我已经采取了尽可能多的调试步骤——例如,确保预签名 url 和我实际尝试上传的内容之间的内容类型和内容长度匹配。

我找到了这个SO Thread 并尝试了其中的所有内容:

  • 我的密钥没有尾随空格或斜杠
  • 我的存储桶名称中没有斜杠。
  • 尝试对我的密钥进行 URL 编码 -- 没有区别
  • 确保我的键名符合要求

所以,我有点不知所措。谁能确定导致 S3 拒绝此请求的原因?

Javascript:

$(document).ready(function () {
            $('[type=submit]').click(function (evt) {
                evt.preventDefault();
                
                console.log($('#id_attachment').get(0).files[0].size);

                var reader = new FileReader();
                reader.onloadend = function (evt) {
                    console.log(evt.target.result);
                    $.ajax({
                        url: 'https://bucketname.s3.amazonaws.com/simple.png?Signature=vYIEOmAay9v6zwB1cz78FhXv6Yo%3D&Expires=1416243285&AWSAccessKeyId=ACCESSKEY',
                        type: 'PUT',
                        contentType: "image/png",
                        data: evt.target.result,
                        success: function () {
                            console.log('Uploaded data successfully.');
                        }
                    });
                };
                reader.readAsBinaryString($('#id_attachment').get(0).files[0]);

            });


        });

【问题讨论】:

  • 另一个可能的原因是您的计算机本地时间与亚马逊的时间有明显的偏差。超过一分钟的偏移量会为我触发此错误。
  • 这种情况下的错误信息是不同的。

标签: javascript amazon-web-services amazon-s3


【解决方案1】:

在创建预签名 URL 时,您是否指定了 image/png 的 Content-Type 或任何 Content-Type?

如果你不是,因为你在浏览器上传中包含了 Content-Type,亚马逊可能指的签名不匹配是 ajax PUT 确实有一个 Content-Type 标头,但签名 URL 上的签名没有。

我最近遇到了这个问题,因为我正在使用 .NET AWSSDK 创建预签名 URL,并且在生成 URL 时没有指定内容类型。

从一些普通的示例 C# 代码上传工作正常,但在我的浏览器应用程序中失败,因为我使用的框架自动附加了 Content-Type 标头,导致不匹配。使用网络调试器重新播放请求(我正在使用Fiddler),并从浏览器的请求中删除 Content-Type 标头有效,这让我找出了导致我不匹配的原因。

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2023-03-23
    • 2022-01-18
    • 2021-10-15
    相关资源
    最近更新 更多