Amazon S3查询字符串身份验证取消下载?

时间:2013-09-10 13:47:03

标签: node.js amazon-web-services amazon-s3 http-get knox-amazon-s3-client

我正在NodeJS中构建一个应用程序,它使用Knox S3 client在Amazon S3中存储文件。一切都适用于上传文件,移动文件等。

现在我想使用Query String Authentication机制来允许直接下载文件。为此,我在我的NodeJS服务器上调用Knox库并创建了一个签名URL。

代码如下所示:


exports.getS3Policy = function(file) {
  var date = moment().add("min", 60).toDate();
  var expires = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

  return knoxClient.signedUrl(file, expires);
};

此代码返回带有身份验证参数的正确URL。例如:

https://my-bucket.s3.amazonaws.com/some/folder/file.ext?Expires=1234567890&AWSAccessKeyId=ABCDEFGHIJKLMNO&Signature=someEncodedSignature

根据我读过的所有文件,这是一个正确的网址。我没有从这个网址获得亚马逊的任何错误。到期是正确的(我可以通过创建1秒的到期然后获得过期的错误来验证这一点)。文件路径也是正确的。

但是,当我在浏览器中点击网址时,我的浏览器(OSX上的最新Chrome)取消了文件的下载,即使我收到了带有正确文件信息的200 ok响应。

以下是Chrome开发工具请求信息的副本(已替换敏感位):


Request URL:https://my-bucket.s3.amazonaws.com/some/folder/file.ext?Expires=1234567890&AWSAccessKeyId=ABCDEFGHIJKLMNO&Signature=someEncodedSignature
Request Method:GET
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:my-bucket.s3.amazonaws.com
Pragma:no-cache
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36
Query String Parameters
Expires:1234567890
AWSAccessKeyId:ABCDEFGHIJKLMNO
Signature:someEncodedSignature
Response Headers
Accept-Ranges:bytes
Content-Length:341390
Content-Type:application/octet-stream
Date:Tue, 10 Sep 2013 13:22:55 GMT
ETag:"fc4d24e752097f212e111f2736af7162"
Last-Modified:Tue, 10 Sep 2013 01:40:31 GMT
Server:AmazonS3
x-amz-id-2:some-id
x-amz-request-id:some-request-id

如您所见,服务器响应为“200 ok”。 341390的content-length也是我试图下载的文件的正确长度 - 这是实际的文件大小。我将内容类型称为“application / octet-stream”,因为这就是我告诉S3存储文件的方式......我只是想要原始下载,基本上。

但是在收到S3的回复后,Chrome取消了下载。这是来自devtools的屏幕截图,再次:

FireFox和Safari都按预期下载文件。为什么chrome取消下载?我究竟做错了什么?是内容类型吗?还是?

1 个答案:

答案 0 :(得分:1)

当我发布问题时,我会立即找到答案......这是Chrome中的一个错误

https://code.google.com/p/chromium/issues/detail?id=104331

  

此修复程序将从Chrome / Chromium 30.x开始提供。请   如果你看到版本的类似问题,请打开一个新问题   Chrome 30或以上。

     

支持指示必须下载资源的方法   是使用Content-Disposition标头字段   (http://tools.ietf.org/html/rfc6266)。

看起来我必须让S3在响应中设置content-disposition