Rails, Rackspace Cloud Files, Реферальный ACL - PullRequest
3 голосов
/ 26 октября 2010

Я использую Rackspace Cloud Files в качестве сервера хранилища файлов для своего приложения.Файлы, которые пользователи загружают, должны быть авторизованы из моего приложения, затем с контроллера оно будет перенаправлено на правильный URL-адрес CDN Rackspace Cloud Files.Я пытаюсь выполнить авторизацию, используя ACL Referrer Rackspace Cloud Files.

Итак, позвольте мне добавить очень простой фрагмент, чтобы уточнить, что я пытаюсь выполнить.

class FilesController < ApplicationController
  def download
    redirect_to(some_url_to_a_file_on_cloud_files_url)
  end
end

URL-адреспользователь мог бы получить доступ к этому действию загрузки следующим образом:

http://a-subdomain.domain.com/projects/:project_id/files/:file_id/download

Итак, для гема CloudFiles я настроил регулярное выражение ACL Referrer, которое должно работать.

http\:\/\/.+\.domain\.com\/projects\/\d+\/files\/\d+\/download

Когда пользователь щелкает ссылку в веб-интерфейсе пользователя, он направляет их по указанному выше URL-адресу и, в зависимости от параметров, из действия загрузки перенаправляет пользователя на правильный URL-адрес файла Rackspace Cloud Files File.

Хорошо, то, что я получаю, является ошибкой, говоря, что я не авторизован (неправильный http реферер).У меня есть предчувствие, что, поскольку я делаю перенаправление с действия загрузки прямо в облачные файлы, оно не «считается» как HTTP Referrer и, вместо того, чтобы использовать этот URL в качестве реферера, я думаю, что оно может использовать этоURL:

http\:\/\/.+\.domain\.com\/projects\/\d+\/files

Поскольку это страница, на которой вы находитесь, когда хотите щелкнуть ссылку «загрузить», она указывает пользователю на действие загрузки в FilesController.

КогдаЯ установил HTTP Referrer для Rackspace ACL следующим образом:

http\:\/\/.+\.domain\.com\/projects\/\d+\/files

И затем нажмите на ссылку, я авторизован для загрузки.Тем не менее, это не достаточно безопасно, так как тогда любой может, например, просто включить firebug в html и вставить необработанную ссылку на файл и получить доступ.

Так что я думаю, у меня есть вопрос, есть ли у кого-нибудь какие-либо подсказки, какили почему то, что я пытаюсь достичь, не работает, и есть какие-либо предложения / идеи?Как я уже сказал, я думаю, что, возможно, когда пользователь щелкает ссылку, в качестве источника ссылки устанавливается местоположение, по которому щелкается файл, а не URL, куда пользователь перенаправляется на фактический файл в облачных файлах.

Возможно ли что-то подобное?

class FilesController < ApplicationController
  def download
    # Dynamically set a HTTP Referrer here before
    # redirecting the user to the actual file on cloud files
    # so the user is authorized to download the file?
    redirect_to(some_url_to_a_file_on_cloud_files_url)
  end
end

Любая помощь, предложения очень ценятся!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2013

Хотя по-прежнему нет проверки 'Referer', вы можете создать temp urls (подписанные URL) с текущей версией Rackspace CloudFiles.

Следующий код взят с сайта документации Rackspace .

require "openssl"
 unless ARGV.length == 4
 puts "Syntax: <method> <url> <seconds> <key>"
 puts ("Example: GET https://storage101.dfw1.clouddrive.com/v1/" +
 "MossoCloudFS_12345678-9abc-def0-1234-56789abcdef0/" +
 "container/path/to/object.file 60 my_shared_secret_key")
 else
 method, url, seconds, key = ARGV
 method = method.upcase
 base_url, object_path = url.split(/\/v1\//)
 object_path = '/v1/' + object_path
 seconds = seconds.to_i
 expires = (Time.now + seconds).to_i
 hmac_body = "#{method}\n#{expires}\n#{object_path}"
 sig = OpenSSL::HMAC.hexdigest("sha1", key, hmac_body)
 puts ("#{base_url}#{object_path}?" +
 "temp_url_sig=#{sig}&temp_url_expires=#{expires}")
 end
0 голосов
/ 13 августа 2012

Как правило, комментария Микаэля более чем достаточно, чтобы объяснить, почему S3 занимает в этом месте первое место в стойке, но если вы действительно хотите добавить некоторые специальные заголовки HTTP в свой запрос Rackspace - сделайте свой собственный HTTP-запрос и загрузите файл вручную :

class DownloadsController < ApplicationController
   def download
     send_data HTTParty.get(some_url_to_a_file_on_cloud_files_url, :headers => {"x-special-headers" => "AWESOME" }), :file_name => "myfile.something"
   end
end

Да, вы можете лучше написать этот пример, но это общая идея.

...