2015-11-10 2 views
2

Мне нужно загрузить большие (1+ gb) файлы на S3 из браузера пользователя. Отправка их через сервер приложений (PHP) просто не является вариантом из-за ограничений по размеру и нагрузке.Как использовать AWS Signature Version 4 с AWS Javascript SDK для загрузки на S3 из браузера?

Я хотел бы использовать AWS Javascript SDK, чтобы сделать это, как показано здесь: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Uploading_a_local_file_using_the_File_API

Проблема есть, Javascript SDK только (официально) перечисляет несколько методов аутентификации, и не ясно, как вы можете использовать SDK «AWS Подпись V4» аутентификации, как показано здесь: http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

Возникает вопрос: можно ли использовать «Подпись V4» с «AWS JS SDK»?

Редактировать: Похоже, возможно, мне нужно использовать «службу токена безопасности»: http://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html Может ли кто-нибудь подтвердить, что это правильный путь?

Дополнительные сведения, которые могут иметь отношение к делу: Мой прецедент находится в административной области интернет-магазина, где пользователь admin уже аутентифицирован путем входа в раздел администратора, но все же не должен видеть мастер Секретный ключ AWS. AWS JS SDK позволяет выполнять аутентификацию с помощью Facebook или других поставщиков идентификаторов, но это было бы странным опытом пользователя, так как администратор уже выполнил вход в систему.

Поскольку эта функциональность должна быть упакована в один модуль для установки в электронной коммерции (Magento), не представляется возможным попросить установщика также перейти и создать новую роль IAM с отдельными учетными данными только для функции uploader.

ответ

0

У вас есть 2 варианта, поскольку учетные данные hardcoding никогда не являются хорошим выбором.

  1. Amazon Cognito
  2. Web Identity Federation

Я хотел бы предложить вам использовать в AWS SDK для JavaScript с AWS Cognito с Developer Authenticated идентичностей. Сценарий, который вы отметили, - именно то, к чему предназначался Cognito. Вы можете подключить администратор к системе с помощью собственного разработанного метода auth, как вы это делаете сейчас, но используйте эту авторизацию для создания токена через Cognito, который может использоваться для аутентификации для всех служб AWS.

Примеры обоих сценариев, пожалуйста, просмотрите Руководство разработчика AWS JavaScript: Загрузка учетных данных в браузере клиента: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-configuring.html#Loading_Credentials_in_the_Client_s_Browser

Ссылки, которые также могут помочь вам:

Amazon Cognito Разработчик Аутентифицированные идентичностей: http://docs.aws.amazon.com/cognito/devguide/identity/developer-authenticated-identities/

Поставщики идентификаторов и федерации: http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html

AWS SDK для JavaScript Руководство разработчика: http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/index.html

3

Для загрузки файлов из браузера в S3 вы можете использовать назначенный PUT. Таким образом, вы не будете раскрывать секрет aws для браузера. Вы можете использовать библиотеку minio-js для генерации назначенного URL-адреса PUT.

На стороне сервера вы можете создать presigned PUT URL, как это:

var Minio = require('minio') 

// find out your s3 end point here: 
// http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region 

var s3Client = new Minio({ 
    endPoint: 's3.amazonaws.com', 
    accessKey: 'YOUR-ACCESSKEYID', 
    secretKey: 'YOUR-SECRETACCESSKEY' 
}) 
var presignedUrl = s3Client.presignedPutObject('bucket', 'object', 24*60*60) 
// presignedUrl expires in 1 day 

Вы можете передать этот presigned URL в браузер, который только может сделать простой HTTP PUT Амазонке s3. Запрос PUT будет успешным, потому что подпись будет частью presignedUrl.

Вы также можете использовать назначенный POST для загрузки.

+0

Если я не могу использовать AWS SDK, ваше решение, кажется, следующий самый элегантный. Является ли назначенный URL хорошим только для одного конкретного файла? Если это так, это означает, что для получения заданного URL-адреса требуется дополнительный HTTP-запрос, прежде чем он сможет фактически загрузить. Возможно ли это сделать на стороне сервера, используя AWS PHP SDK? К сожалению, у меня нет серверной части node.js, поэтому я могу использовать только части Minio-js на стороне клиента. Я бы предпочел не использовать собственный код генератора ключей. – Eric

+0

@ Эрик - другой способ - это назначитьPostPolicy - http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html https://github.com/minio/minio-js /blob/master/examples/presigned-postpolicy.js С помощью вашей HTML-формы вы можете загрузить много объектов по заранее определенному пути, который уже предварительно разрешен. – Harshavardhana

+0

Все, что я прочитал, указывает, что ключ содержимого и объект (aka, filename) являются частью назначенного URL-адреса. Это означает, что для каждой загрузки файла потребуется новый назначенный URL-адрес, что означает еще один HTTP-запрос на сервер приложений (в дополнение к фактическому запросу на отправку на S3.) Это также означает, что я не могу использовать SDK AWS JS, который будет автоматически разбивать загрузку на более мелкие куски, изящно продолжать сетевые ошибки, предоставлять события для загрузки файлов и т. д. Есть ли что-то, что я пропускаю или неправильно понимаю? – Eric

-1

Добавление больше информации к принятому ответ, вы можете обратиться к моему блогу, чтобы увидеть бегущую версию кода, с помощью AWS Signature версии 4.

будет обобщать здесь:

Как только пользователь выбирает файл, который будет загружен, сделайте следующее:

  1. сделать вызов к веб-серверу, чтобы инициировать услугу для генерирования требуется PARAMS

  2. В этой услуге позвоните в службу AWS IAM, чтобы получить временный кредит

  3. После того, как у вас есть кредит, создайте политику ведра (базовая кодированная строка). Затем подписать политику ведра с временным ключом секрета доступа генерировать окончательную подпись

  4. Отправить необходимые параметры обратно в пользовательский интерфейс

  5. После того, как это принято, создать HTML форму объекта, установите необходимый Params и POST Это.

Для получения более подробной информации, пожалуйста, обратитесь https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/

Смежные вопросы