7
votes

Affichage des images privées téléchargées sur AWS S3 - Créer une signature de la clé d'accès secret

Je télécharge des images sur une application Rails via PaperClip Strong> GEM que je veux que seuls les administrateurs sur le backend pour pouvoir visualiser. En conséquence, je les ai définies comme privées.

Puis j'ai recherché une solution sur la manière dont il suffit d'administrer des liens spécifiques pouvant afficher les fichiers. C'est ce que je a trouvé . P>

Je suis allé Pour essayer cela, mais j'ai du mal à créer la signature nécessaire. La formule est donnée sur la liaison ci-dessus et est la suivante: p>

Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKeyID, UTF-8-Encoding-Of( StringToSign ) ) ) );

StringToSign = HTTP-VERB + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Expires + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource;  


0 commentaires

3 Réponses :


5
votes

Tout d'abord, il n'y a pas de différence entre pouvoir visualiser une image dans le navigateur ou pouvoir télécharger une image. Dans les deux cas, le navigateur de l'utilisateur obtient les octets qui composent l'image et peuvent faire ce qu'il veut avec eux.

Amazon fournit le gemme AWS-SDK comme moyen officiellement soutenu d'accéder à leurs services, y compris S3. Pour générer une URL S3 présigné, vous feriez quelque chose comme xxx

qui renvoie un lien valide pendant 1 heure (cela suppose que vous avez des informations d'identification fournies ou que des variables d'environnement aws_access_key_id et aws_secret_access_key avec vos informations d'identification. Sinon, vous devez spécifier ensuite lors de la création de l'objet de ressource.)


2 commentaires

Frederick, merci pour l'entrée. Y a-t-il un endroit où vous avez? Je veux lire plus d'où les clés sont placées, où le lien est placé et comment je peux fournir ceci à mes besoins. Par exemple, est la "clé / pour / objet" du chemin et du nom du fichier? Où puis-je passer les clés?


S3 n'a pas vraiment des chemins - les objets ont des clés, bien qu'ils soient souvent affichés en tant que chemins. Le meilleur endroit pour commencer est probablement le doctorat docs.aws.amazon.com/sdkforruby/api < / a>. Le blog AWS Ruby a également beaucoup d'exemples



1
votes

Définit un téléchargeable? Méthode qui peut être utilisée pour implémenter les droits d'accès des utilisateurs sur la piste. Pour la simplicité, il suffit de permettre à tous les utilisateurs connectés d'accéder à la piste, mais vous pouvez le remplacer avec la logique que votre application nécessite.

has_attached_file :mp3,
                  :url => ':s3_domain_url',
                  :path => 'assets/:class/:id/:style.:extension',
                  :storage => :s3,
                  :s3_credentials => File.join(Rails.root, 'config', 's3.yml'),
                  :s3_permissions => 'authenticated-read',
                  :s3_protocol => 'http'


0 commentaires

5
votes

Puisque vous utilisez PaperClip, vous pouvez simplement utiliser son expirant_url fonctionnalité . Donc, vous pouvez avoir un #show ou #download action du contrôleur qui redirige juste à l'URL temporaire. Il n'est pas nécessaire de tout mettre en œuvre vous-même.

J'ajouterai que bien que les DOC ci-dessus recommandent 10 minutes pour l'heure d'expiration, j'ai constaté que si l'horloge de votre serveur oblige à une autre et à incliner une autre, l'URL peut expire avant qu'il n'existe . Donc, peut-être 20 ou 30 minutes est plus sûre.

Évidemment, si vous ajoutez une action du contrôleur de ce type, assurez-vous que seuls les administrateurs sont autorisés à l'utiliser.


1 commentaires

C'est la solution la plus facile. Tout ce dont vous avez besoin est le gemme 'AWS-SDK' et PaperClip. Définissez vos options PaperClip pour utiliser S3 et définissez la S3_Perrissions sur privée I.E. "HAS_ATTACHED_FILE: document,: S3_Perrissions =>: privé,: stockage => 'S3'"