Я создаю приложение в NodeJS, которое хранит файлы в Amazon S3, используя 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
Согласно всем документам, которые я прочитал, что это правильный URL. Я не получаю никаких ошибок от Amazon с этим URL. Истечение срока действия является правильным (я могу проверить это, создав истечение 1 секунды, а затем получив истекшую ошибку). Путь к файлу правильный.
Когда я ударил URL-адрес в своем браузере, мой браузер (последний Chrome OSX) отменяет загрузку файла, хотя я получаю ответ 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 ОК». content-length
из 341390 также является правильной длиной файла, который я пытаюсь загрузить, - это фактический размер файла. Я получаю тип контента как «приложение/октет-поток», потому что так я сказал S3, чтобы хранить файлы ... Я просто хочу, чтобы загрузка была загружена в основном.
Но после получения ответа от S3 Chrome отменяет загрузку. Вот ScreenCap из Devtools, снова:
FireFox и Safari как скачать файл, как и ожидалось. Почему хром отменяет загрузку? Что я делаю не так? Это тип контента? или ?