FineUploader S3浏览器直接上传:启用分块POST到AWS失败:403 SignatureDoesNotMatch

时间:2015-06-05 19:42:39

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

对于小于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帖子的标题,用于多部分上传:

1 个答案:

答案 0 :(得分:0)

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

以下内容来自Fine Uploader的文档,特别是分块上传:

  

Chunked Uploads

     

Fine Uploader S3使用Amazon S3的REST API来启动,上传,完成和中止分段上传。 REST API通过对标准格式的标头进行签名来处理身份验证。这种签名是您实现服务器端所需要的。您的所有服务器需要做的是验证和支持直接到Amazon S3的分块上传,这是一个字符串,表示Fine Uploader发送给S3的请求的标头。此字符串位于签名请求的有效内容中:

     

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

     

此属性的precense向您的服务器指示这实际上是签署REST /多部分请求而不是策略文档的请求。

     

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

     

{“signature”:/ * signed headers string * /}

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