Как разрешить клиентам загружать в Amazon S3, не выдавая мои ключи? - PullRequest
7 голосов
/ 30 июля 2010

У одного из моих клиентов есть сайт, на котором отображаются файлы мультимедиа, загруженные из клиентского приложения.

Это приложение изначально использовало FTP, но мы переходим на S3 из-за различных данных и производительности.

Я бы хотел, чтобы этот клиент загружал файл напрямую в наш центральный магазин S3 (ala dropbox / jungledisk и т. Д.), Но я не вижу способа сделать это без передачинаши ключи и встраивание их в приложение - не идеально!

Есть ли способ предоставить клиентскому приложению ключ сеанса / временный URL для загрузки / что-то?Это можно сделать с помощью API нашего веб-сайта, который, разумеется, имеет полный доступ к любым необходимым секретным ключам S3.

Предложения?

Ответы [ 2 ]

6 голосов
/ 18 марта 2011

Да, это должно быть возможно. Вам нужно создать подписанный файл политики на загрузку или на пользователя . Этот файл политики, подпись и некоторые другие данные должны быть отправлены клиентской программой с помощью POST-запроса в корзину, которую вы хотите использовать. Amazon изучит запрос, проверит, что параметры находятся в пределах файла политики, сопровождающего запрос, и разрешит публикацию. Обратите внимание, что эту политику не следует путать с политикой корзины . Фактически, это политика, которая может измениться при каждом запросе, и она отправляется клиентской программой (после того, как клиентская программа получила от вас подписанную копию).

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

Вы также можете проверить эту веб-страницу, которая может дать вам представление о том, как настроить параметры: http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html

3 голосов
/ 19 сентября 2013

Это можно сделать, используя загрузку HTML на основе форм: Эта статья хорошо объясняет, как это возможно. После прочтения статьи вы можете использовать мои сценарии, упомянутые ниже, чтобы облегчить жизнь.

Вот скрипт Python, который я использую для генерации своей политики, ее подписи и строки base64.

IMP: Убедитесь, что файл policy.json находится в том же каталоге

import base64
import hmac, hashlib
import os
AWS_SECRET_ACCESS_KEY = 'Your Access Key'

os.system('clear')
print "This policy generator is for key : " + AWS_SECRET_ACCESS_KEY  
print "Make sure this is the correct key."
print "IMP: Please be consistent with the file policy.json small changes in space or newline can fail policy"

policy_document = file("policy.json",'rb').read()
policy = base64.b64encode(policy_document)
signature = base64.b64encode(hmac.new(AWS_SECRET_ACCESS_KEY, policy, hashlib.sha1).digest())

print
print "Policy (BASE64_POLICY to be inserted in HTML):-"
print policy
print
print "Signature:-"
print signature
print

А вот соответствующий файл policy.json, который я использую:

{
  "expiration": "2014-01-01T00:00:00.00Z",
  "conditions": [
    {"bucket": "BUCKET NAME" },
    ["starts-with", "$key", "PREFIX_IF_ANY"],
    {"acl": "public-read" },
    {"success_action_redirect": "http://REDIRECTED_URL" },
    ["starts-with", "$Content-Type", "CONTENT_TYPE"],
    ["content-length-range", 0, 1048576],
  ]
}

Форма HTML для этого кода такова:

<html> 
    <head>
        <title>S3 POST Form</title> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>

    <body> 
        <form action="http://BUCKET_NAME.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
            <input type="hidden" name="key" value="picbum/${filename}">
            <input type="hidden" name="AWSAccessKeyId" value="AccessID"> 
            <input type="hidden" name="acl" value="public-read"> 
            <input type="hidden" name="success_action_redirect" value="http://REDIRECTED_URL">
            <!-- Fill these HTML fields with data generated from python script -->
            <input type="hidden" name="policy" value='BASE64_POLICY'>
            <input type="hidden" name="signature" value="SIGNATURE_GENERATED">
            <input type="hidden" name="Content-Type" value="CONTENT_TYPE">
            <!-- Include any additional input fields here -->

            File to upload to S3: 
            <input name="file" type="file"> 
            <br> 
            <input type="submit" value="Upload File to S3"> 
        </form> 
    </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...