2016-06-14 11 views
6

Carico alcune immagini su un'app Rails tramite Paperclip gem che voglio che solo gli amministratori del backend possano visualizzare. Di conseguenza, li ho impostati come privati.Visualizzazione di immagini private caricate su AWS S3 - Creazione di firme dalla chiave di accesso segreta

Quindi ho cercato una soluzione su come solo gli admin con link specifici possono visualizzare i file. Questo è ciò che ho found.

Ho continuato a provare questo, ma sto facendo fatica a creare la firma necessaria. La formula è data sul link qui sopra ed è:

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; 

non avevo idea di quale libreria/modulo/gemma ho bisogno di ottenere questo al lavoro su Ruby on Rails. Cercando in giro ho trovato il aws-s3 gem. Ho letto il loro wiki e ho visto questo "Accesso agli oggetti privati ​​da un browser".

Così li ho installati gem, ho aperto la console e ho provato a testarli. Sono stato in grado di stabilire una connessione con AWS S3 ma poi non posso fare nulla perché ho errori come "costante non inizializzata" e "NameError".

Qualsiasi consiglio/guida nella giusta direzione è apprezzato.

Ultima nota, quello che cerco di fare è generare collegamenti che gli amministratori saranno in grado di utilizzare per visualizzare le immagini sul proprio browser e non scaricarle. Da quello che ho letto questo è quello che fa. Ma è sicuro o semplicemente li scarica sul computer dell'amministratore?

risposta

5

Dal momento che si sta utilizzando Paperclip, si può semplicemente usare la sua expiring_url feature. Quindi potresti avere un'azione del controller #show o #download che reindirizza solo all'URL temporaneo. Non è necessario implementarlo tutto da solo.

Aggiungerò che anche se i documenti sopra raccomandano 10 minuti per la scadenza, ho scoperto che se l'orologio del server si inclina in un modo e S3 ne inclina un altro, l'URL può expire before it exists. Quindi forse 20 o 30 minuti sono più sicuri.

Ovviamente se si aggiunge un'azione del controller in questo modo, è necessario assicurarsi che solo gli amministratori possano utilizzarlo.

+0

Questa è la soluzione più semplice. Tutto ciò di cui hai bisogno è la gemma e la graffetta "aws-sdk". Imposta le tue opzioni di paperclip per usare s3 e imposta s3_permissions su private "has_attached_file: document, : s3_permissions =>: private, : storage => 's3'" – zarazan

4

In primo luogo non vi è alcuna differenza tra la possibilità di visualizzare un'immagine nel browser o la possibilità di scaricare un'immagine. In entrambi i casi il browser dell'utente ottiene i byte che compongono l'immagine e può fare tutto ciò che vuole con loro.

Amazon fornisce la gemma aws-sdk come il modo ufficialmente supportato per accedere ai loro servizi, incluso s3. Per generare un URL presigned S3 si dovrebbe fare qualcosa di simile

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

che restituisce un link valido per 1 ora (questo presuppone che dispone di credenziali di istanza forniti o avere variabili d'ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY con le proprie credenziali. Se non è necessario specificare quindi quando si crea l'oggetto risorsa.)

+0

Frederick, grazie per l'input. C'è un posto da cui hai preso questo? Voglio leggere di più dove sono posizionate le chiavi, dove è posizionato il collegamento e come posso fornire questo alle mie esigenze. Ad esempio, la "chiave/per/oggetto" è il percorso e il nome del file? Dove passo le chiavi? –

+1

s3 non ha realmente percorsi - gli oggetti hanno le chiavi, anche se sono spesso visualizzati come percorsi. Il miglior punto di partenza è probabilmente il documento della gemma http://docs.aws.amazon.com/sdkforruby/api/. Il blog di aws ruby ​​ha anche molti esempi –

1

Definisce un file scaricabile? metodo che può essere utilizzato per implementare i diritti di accesso utente alla traccia. Per semplicità, consente solo a tutti gli utenti registrati di accedere alla traccia, tuttavia è possibile sostituirlo con qualsiasi logica l'app richieda.

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

e modificare il proprio modello attachemnet come questo

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

Problemi correlati