2010-07-30 13 views
6

Un de mes clients possède un site qui affiche les médias qui ont été téléchargés à partir d'une application cliente.Comment autoriser des clients à télécharger sur Amazon S3 sans donner mes clés?

Cette application initialement utilisé FTP, mais nous nous dirigeons vers S3 pour diverses raisons de stockage et de performance des données. Ce que je voudrais être en mesure de faire est que ce client télécharge un fichier directement dans notre magasin S3 central (ala dropbox/jungledisk etc etc), mais je ne vois pas de moyen de le faire sans remettre notre clés et les intégrer dans l'application - pas idéal!

Est-il possible de fournir une application cliente avec un téléchargement clé de session/temporaire URL/quelque chose? Cela pourrait être fait via l'API de notre site Web - qui a bien sûr accès à toutes les clés secrètes S3 requises.

Suggestions?

Répondre

7

Oui, cela devrait être possible. Ce que vous devez faire est de créer un fichier de stratégie signé par -upload ou par utilisateur. Ce fichier de stratégie, la signature et certaines autres données doivent être envoyées par le programme client à l'aide d'une requête POST envoyée au compartiment que vous souhaitez utiliser. Amazon examinera la demande, vérifiera que les paramètres sont dans les limites du fichier de politique qui accompagne la demande, puis autorisera la publication. Notez que cette politique ne doit pas être confondue avec la politique de compartiment . C'est en fait une politique qui peut changer par requête si vous le souhaitez, et elle est soumise par le programme client (après que le programme client a obtenu une copie signée de votre part).

détails sur ce qui peut être trouvé dans la section Browser Based Uploads Using POST de la documentation S3. Je recommande une révision détaillée de la section HTML Forms, et un examen de la façon d'obtenir les paramètres POST à ​​votre client (pour un navigateur, vous pouvez l'envoyer HTML, ce qui est la façon dont la documentation est libellée, pour un programme non-navigateur probablement besoin d'un appel d'API de quelque sorte suivi par le client soumettant un POST à ​​S3).

Vous pouvez également consulter cette page web qui peut vous donner une idée sur la façon de configurer les paramètres: http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html

3

Il est possible de le faire en utilisant le téléchargement HTML par formulaire: Ce article fait un bon travail expliquant comment est possible. Après avoir lu le article vous pouvez utiliser mes scripts mentionnés ci-dessous pour vous faciliter la vie.

Voici un script python que j'utilise pour générer ma politique, sa signature et la chaîne de base64.

IMP: Assurez-vous que le fichier policy.json est dans le même répertoire

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 

Et voici le fichier correspondant policy.json j'utilise:

{ 
    "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], 
    ] 
} 

Le code HTML formulaire de ce code est en tant que tel:

<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

Voici mon vote à cause de l'article qui explique tout. – Saeger