2016-06-14 7 views
6

Ich lade einige Bilder auf eine Rails App durch Paperclip Gem, die ich nur die Admins auf dem Backend in der Lage sein soll zu sehen. Infolgedessen habe ich sie als privat gesetzt.Anzeigen privater Bilder, die auf AWS S3 hochgeladen wurden - Erstellen einer Signatur aus Secret Access Key

Dann suchte ich nach einer Lösung auf, wie nur Admins mit bestimmten Links die Dateien anzeigen können. Das ist was ich found.

Ich fuhr fort, dies zu versuchen, aber ich kämpfe um die erforderliche Signatur zu erstellen. Die Formel ist auf dem obigen Link gegeben und ist:

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; 

Ich hatte keine Ahnung, die Bibliothek/Modul/gem ich brauche, um diese auf Rails Ruby zu arbeiten. Durch die Suche fand ich über die aws-s3 gem. Ich lese ihre wiki und sah dies "Zugriff auf private Objekte von einem Browser".

Also habe ich sie gem installiert, ging weiter und öffne meine Rails-Konsole und versuchte sie zu testen. Ich konnte eine Verbindung mit AWS S3 herstellen, aber dann kann ich nichts machen, da ich Fehler wie "nicht initialisierte Konstante" und "NameError" erhalte.

Jede Spitze/Führung in die richtige Richtung wird geschätzt.

Letzten Hinweis, was ich versuche zu tun ist Links zu generieren, die die Admins in der Lage sein werden, die Bilder in ihrem Browser zu sehen und nicht herunterladen. Von dem was ich lese ist das was es macht. Aber ist es sicher oder lädt sie einfach auf den Computer des Administrators?

Antwort

5

Da Sie Büroklammer verwenden, können Sie nur noch die expiring_url feature verwenden. Sie könnten also eine #show oder #download Controller-Aktion haben, die nur auf die temporäre URL umleitet. Es ist nicht notwendig, alles selbst zu implementieren.

Ich werde hinzufügen, dass, obwohl die Dokumente oben 10 Minuten für die Ablaufzeit empfehlen, habe ich festgestellt, dass, wenn die Uhr Ihres Servers eine Richtung und S3 eine andere verzerrt, die URL expire before it exists. Also sind vielleicht 20 oder 30 Minuten sicherer.

Offensichtlich, wenn Sie eine Controller-Aktion wie diese hinzufügen, sollten Sie sicherstellen, dass nur Administratoren es verwenden dürfen.

+0

Dies ist die einfachste Lösung. Alles, was Sie brauchen, ist das 'Aws-SDK' Juwel und Büroklammer. Legen Sie Ihre Büroklammeroptionen fest, um s3 zu verwenden, und legen Sie die s3_permissions auf privat fest, z. B. "has_attached_file: document, : s3_permissions =>: private, : speicher => 's3'" – zarazan

4

Erstens gibt es keinen Unterschied zwischen der Möglichkeit, ein Bild im Browser anzuzeigen oder ein Bild herunterladen zu können. In jedem Fall erhält der Browser des Benutzers die Bytes, aus denen das Bild besteht, und kann mit ihnen machen, was er will.

Amazon bietet die AWS-SDK Gem als die offiziell unterstützte Möglichkeit, auf ihre Dienste zuzugreifen, einschließlich s3. ein s3 presigned URL erzeugen Sie so etwas wie

s3 = Aws::S3::Resource.new(region: "us-east-1") 
s3.bucket("bucket-name").object("key/for/object").presigned_url("get", expires_in: 3600) 

die einen Link gültig für 1 Stunde zurückgibt (dies setzt voraus, Sie haben Beispiel angegebenen Anmeldeinformationen oder Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY mit Ihren Anmeldeinformationen tun würde. Wenn nicht, Sie müssen Geben Sie dann beim Erstellen des Ressourcenobjekts an.)

+0

Frederick, danke für die Eingabe. Gibt es einen Ort, von dem du das hast? Ich möchte mehr darüber lesen, wo die Schlüssel platziert sind, wo der Link platziert ist und wie ich dies meinen Bedürfnissen anpassen kann. Zum Beispiel ist der "Schlüssel/für/Objekt" der Pfad und der Name der Datei? Wo gebe ich die Schlüssel weiter? –

+1

s3 hat keine Pfade - Objekte haben Schlüssel, obwohl sie oft als Pfade angezeigt werden. Der beste Ort, um zu beginnen, ist wahrscheinlich der Edelstein docs http://docs.aws.amazon.com/sdkforruby/api/. Der aws ruby ​​blog hat auch viele Beispiele –

1

Definiert ein herunterladbares? Methode, mit der Benutzerzugriffsrechte auf die Spur implementiert werden können. Der Einfachheit halber können alle angemeldeten Benutzer nur auf die Spur zugreifen. Sie können diese jedoch durch die von Ihrer App benötigte Logik ersetzen.

def downloadable?(user) 
    user != :guest 
end 

und ändern Sie Ihre attachemnet Modell wie dieses

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' 

have a look at this

Verwandte Themen