Using Paperclip with S3 authenticated url
Für Channelthing ist es besonders wichtig, dass die hochgeladenen Dokumente, die wir bei S3 ablegen, nur durch authentifizierte Benutzer abgerufen werden können. Daher haben wir uns eine kleine Extension zu Paperclip gebaut, die solch eine verschlüsselte URL von S3 erhält, sobald ein Dokument, etc. angezeigt werden soll.
Dazu muss man zum einen den Bucket erstmal “sicher” machen. Mit der kleinen Firefox-Extension S3Fox Organizer. Man erlaubt nur dem Owner auf das Bucket zuzugreifen.
Unsere Extension erhält nur die Methode authenticated_s3_url die über die get_link Methode von dem s3-Objekt unsere URL mit einem Hash zurückgibt der nur über eine bestimmte Zeit aufgerufen werden kann. Die url-Methode von Paperclip überscheiben wir anschliessend.
module Railslove module Paperclip module SecureS3 def authenticated_s3_url(style = nil, include_updated_timestamp = true, time_limit = 15.minutes) url = original_filename.nil? ? interpolate(@default_url, style) : self.s3.interface.get_link(self.s3_bucket.to_s, self.path(style), time_limit) include_updated_timestamp && updated_at ? [url, updated_at].compact.join(url.include?("?") ? "&" : "?") : url end end end end Paperclip::Attachment.send(:include, Railslove::Paperclip::SecureS3) Paperclip::Attachment.class_eval("alias :url :authenticated_s3_url")
Man sollte daran denken auch die entsprechenden Rechte, jedem hochgeladenem Dokument zu setzen. Die können über den Parameter s3_permissions gesetzt werden:
paperclip:
storage: "s3"
s3_credentials: <%= "#{RAILS_ROOT}/config/s3.yml" %>
path: ":attachment/:id/:style.:extension"
bucket: "RailsloveLovesS3"
s3_permssions: "authenticated-read"Nun haben wir unser gewünschtes Ziel erreicht.