【问题标题】:FineUploader S3 browser direct upload: chunking enabled POST to AWS fails: 403 SignatureDoesNotMatchFineUploader S3 浏览器直接上传:启用分块 POST 到 AWS 失败:403 SignatureDoesNotMatch
【发布时间】:2015-06-05 19:42:38
【问题描述】:

对于小于 5mb 的文件,我的配置正在上传。对于大于 5mb 的文件,它们总是会因 AWS 的 Post 响应而失败:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>..

我正在使用 NodeJS,演示 s3handler.js 中的相关函数未更改,例如:signRestRequest() 函数似乎按照本文档的预期工作:

http://blog.fineuploader.com/2013/08/16/fine-uploader-s3-upload-directly-to-amazon-s3-from-your-browser/#support-chunking

对于具有此配置的小于 5mb 的文件,如果连接关闭然后自动重新打开,则恢复工作。我在同一个本地 Ubuntu VM 中托管页面和 NodeJS。我的浏览器端配置:

$('#fineUploader').fineUploaderS3({
        request: {            
            endpoint: "https://s3-us-west-2.amazonaws.com/bucket-name-redacted/",
            accessKey: "keyredacted",                
        }, 
        signature: {
            endpoint: "http://192.168.1.203:8000/s3handler"
        },
        uploadSuccess: {
            endpoint: "http://192.168.1.203:8000/s3UploadSuccess"
        },
        retry: {
            enableAuto: true 
        },
        chunking: {
            enabled: true //not working
        },
        resume: {
            enabled: true 
        }            
    });

这是经过 SHA1 HMac 编码,然后是 base64 编码之前的响应:

POST

application/pdf

x-amz-acl:private
x-amz-date:Fri, 05 Jun 2015 19:26:17 GMT
x-amz-meta-qqfilename:filename.pdf
/bucket-name/13af5c15-ba04-4375-a6f9-25c2691ed827.pdf?uploads

我的临时测试 S3 Bucket CORS 配置:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <ExposeHeader>ETag</ExposeHeader>
        <AllowedHeader>x-amz-acl</AllowedHeader>
        <AllowedHeader>x-amz-meta-qqfilename</AllowedHeader>
        <AllowedHeader>x-amz-date</AllowedHeader>
        <AllowedHeader>x-amz-server-side-encryption</AllowedHeader>
        <AllowedHeader>authorization</AllowedHeader>
        <AllowedHeader>*</AllowedHeader>

</CORSRule>

我可以根据需要提供任何其他信息并已购买许可证。谢谢!!

这是发送到 AWS 帖子以进行分段上传的标头:

【问题讨论】:

    标签: node.js amazon-web-services file-upload amazon-s3 fine-uploader


    【解决方案1】:

    如果 AWS 报告您的签名不正确,则问题出在您的签名生成代码上。如文档所述,分块请求(默认文件大于 5 MB)使用 S3 的分段上传 API,并且签名要求不同。

    以下来自 Fine Uploader 的文档,专门针对分块上传:

    分块上传

    Fine Uploader S3 使用 Amazon S3 的 REST API 来启动、上传、完成和中止分段上传。 REST API 通过签署规范格式的标头来处理身份验证。此签名是您需要在服务器端实现的东西。您的服务器需要做的就是验证和支持直接到 Amazon S3 的分块上传,只需签署一个字符串,该字符串代表 Fine Uploader 发送到 S3 的请求的标头。此字符串在签名请求的负载中找到:

    { "headers": /* 要签名的字符串 */ }

    此属性的存在向您的服务器表明,这实际上是对 REST/multipart 请求进行签名的请求,而不是策略文档。

    标头字符串的此签名与策略文档签名略有不同。在签名之前,您不应该对标头字符串进行 base64 编码。在服务器端,您所要做的就是使用您的 AWS 密钥生成字符串的 HMAC SHA1 签名,然后对结果进行 base64 编码。您的服务器应在“应用程序/json”响应的正文中响应以下内容:

    { "signature": /* 签名头字符串 */ }

    Fine Uploader's server-examples repo even includes a full node.js example that handles chunked and non-chunked signing logic.

    【讨论】:

    • 感谢您的回复。我正在使用您已经链接到的 s3handler.js。它可以工作,除非我在浏览器端启用分块选项。有什么其他建议可以让我继续解决这个问题吗?
    • 您的下一步应该是验证您的端点是否将正确的签名返回给精细上传者,然后该签名是否正确地发送到 s3,而在生成签名时没有考虑任何额外的标头。
    • 不确定是否相关,但我添加了两行代码以在您的 s3handler.js 文件中启用 CORS。
    • nodeJS 端点返回由 s3hanlder.js 中提供的代码生成的签名,用于多部分上传。它由浏览器中的 fileUploaderS3 对象提供。我在浏览器和 node.log() 输出中验证了对帖子匹配的响应。
    • 这都是 F.U.涉及代码,我没有写任何东西。由于关闭分块时客户端访问密钥有效,我不确定如何解决此问题。这可能是示例代码中的错误,或者可能是 S3 CORS 上的某些配置不正确?
    猜你喜欢
    • 2015-05-27
    • 2013-09-06
    • 2018-12-31
    • 1970-01-01
    • 2016-03-24
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多