Получите непубличный файл JavaScript из AWS S3, используя свой API

I am attempting to follow the AWS API for getting a JavaScript file from a private S3 bucket. The guide is here: Signing and Authenticating REST Requests

Среда - это браузер с jQuery, поэтому это реализация JavaScript. Я проработал то, что считал сложным, - подписывая запрос секретным ключом. Но теперь я повесил трубку на что-то, что было легко. У меня есть этот запрос REST для передачи:

GET /gss3/sayHello.js HTTP/1.1
Host: gss3.s3.amazonaws.com
Date: Thu Feb 07 2013 08:16:25 GMT-0500 (Eastern Standard Time)
Authorization: AWS AKIAJTURNBE6SXNTVVGQ:eWJOLZnj6Eja3CEC2CyifeURnxg=

Поскольку это вызов s3.amazonaws.com с сайта www.mydomain.com, я смотрел на JSONP, чтобы обойти одну и ту же политику происхождения. Однако я не вижу возможности добавлять дополнительные заголовки к вызову jQuery JSONP, а для аутентификации с AWS вы должны пройти эту 4-ю строку:

Authorization: AWS AKIAJTURNBE6SXNTVVGQ:eWJOLZnj6Eja3CEC2CyifeURnxg=

Поэтому мой вопрос заключается в следующем: как я передаю этот запрос REST AWS в моей среде browser/jQuery? Что мне здесь не хватает? Спасибо, банда ....

3
nl ja de

2 ответы

Хотя этот источник был написан для PHP, блог Амазонка AWS S3 Аутентификация строки запроса с помощью PHP показывает, как скомпилировать обычную старую строку запроса и передать подпись в качестве параметра S3.

$url .= '?AWSAccessKeyId='.$awsKeyId
.'&Expires='.$expires
.'&Signature='.$signature;

Используя крипто-js и конвертируя в Javascript, мы дадим нам что-то вроде этого:

var filePath = "/bucket/file.js";
var dateTime = Math.floor(new Date().getTime()/1000) + 300;//allows for 5 minutes clock diff
var stringToSign = "GET\n\n\n" + dateTime + "\n" + filePath;
var signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(stringToSign, secretAccessKey));
var queryString = "?AWSAccessKeyId=" + accessKeyId + "&Expires=" + dateTime + "&Signature=" + encodeURIComponent(signature);

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://s3.amazonaws.com/bucket/file.js" + queryString;
$("head").append(script);//jQuery version

И вот вы, почти весь банан, написанный для вас. Надеюсь, это поможет кому-то.

4
добавлено

Вы не можете добавлять заголовки к вызову JSON-P, так как вызов JSON-P - это просто динамический тег для скриптов, добавленный на вашу веб-страницу, если только S3 не поддерживает передачу его как параметра GET.

Если вы используете JSON-P, проблема с междоменным вопросом больше не имеет значения. До тех пор, пока его действительный JS можно потянуть на вашу веб-страницу из любого домена. Вам просто нужно убедиться, что S3-файл имеет разрешение на просмотр любым пользователем.

Последний способ сделать это - включить ведро S3 с CORS (кросс-домен ajax), которое является новой функцией S3. Затем вы можете сделать ваниль ajax, назовите перекрестный домен вашему ведро s3 и добавьте дополнительные заголовки в контент ваших сердец.

0
добавлено
re: ваш комментарий «Вам просто нужно убедиться, что S3-файл имеет разрешение на просмотр любым пользователем», это именно то, что я пытаюсь удалить из-за использования заголовка авторизации. Это контент для подписчиков.
добавлено автор Geek Stocks, источник
Вопрос состоял в том, «как я передаю этот запрос REST ...», тема гласит: «Получите не-общедоступный файл JavaScript». Ваш ответ вообще не затрагивал проблему авторизации. Вы сказали мне, что я не могу сделать, вместо ответа на вопрос о авторизации. «Что еще мне нужно»? Я не знаю, как насчет точности?
добавлено автор Geek Stocks, источник
CORS, если вы читаете документы , это решение PUBLIC для междоменных проблем для элементов, не относящихся к javascript, для которых браузеру требуется предварительная проверка (например, в документе используются файлы веб-шрифтов). Вы не используете CORS в качестве замены для авторизации ведра PRIVATE.
добавлено автор Geek Stocks, источник
@GeekStocks, я просто дал вам ответ, что вы не можете установить заголовок с вызовом JSON-P, а затем дал способы сделать это с открытыми разрешениями и без них. Что еще вы хотите? aws.amazon.com/about-aws/whats-new/2012/08/31/…
добавлено автор Mauvis Ledford, источник
«Последний способ сделать это - включить ведро S3 с CORS (кросс-домен ajax), которое является новой функцией поддержки S3. Затем вы можете сделать vanilla ajax перекрестным доменом в своем ведро s3 и добавить дополнительные заголовки в контент вашего сердца. "
добавлено автор Mauvis Ledford, источник
Я признаю, что был немного отрывистым, но, на мой взгляд, вы никогда не заявляли, что все мои решения не работают. Я только что просмотрел «Подписание и аутентификация запросов REST», и вы можете полностью отправлять запросы на аутентификацию GET, и, поскольку мы знаем, что JSON-P - это простой запрос GET (с помощью взлома JavaScrip), у вас есть все компоненты для работы. См. Пример «Проверка подлинности запроса запроса запроса» в самом конце документы .aws.amazon.com/AmazonS3/последний/DEV/RESTAuthentication.h & ZWNJ; TML
добавлено автор Mauvis Ledford, источник
Кроме того, re: CORS, похоже, что частный файл, работающий с ошибкой CORS, был исправлен на S3, хотя я лично не проверял его (последнее обновление 14 декабря): forums.aws.amazon.com/thread.jspa?messageID=381557 . Сначала я попробую JSON-P, но это также может быть вариантом.
добавлено автор Mauvis Ledford, источник
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском