2010-07-30 2 views
6

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

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

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

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

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

ответ

7

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

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

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

3

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

Вот сценарий 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> 
+0

Вот мой голос из-за статьи, которая объясняет все. – Saeger

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