Как убедиться, что ActiveStorage URL действительно истекает? - PullRequest
2 голосов
/ 25 марта 2020

РЕДАКТИРОВАТЬ : Обсуждение продолжается в Rails дискуссионной группе .

Пока этот мартышка-патч сделала свое дело (примените его с ActiveStorage::Blob.include(ActiveStorageBlobMonkeyPatch)):

module ActiveStorageBlobMonkeyPatch
  extend ActiveSupport::Concern

  included do
    def signed_id
      ActiveStorage.verifier.generate(id, purpose: :blob_id, expires_in: 5.minutes)
    end
  end
end

Оригинальный вопрос :

Если я загружаю страницу, содержащую URL-адрес, во вложение ActiveStorage (*), подождите более 5 минут, скопируйте URL-адрес из исходного кода и вставьте его в браузер, он загружается нормально, хотя я ожидаю, что по истечении срока действия произойдет сбой был превышен. Это происходит потому, что часть URL в кодировке base64 содержит "exp"=>nil:

url = app.url_for(post.cover_image)
params = url[/blobs\/(.*)--/,1]
JSON.parse(Base64.decode64(params))
=> {"_rails"=>{"message"=>"BAhpJA==", "exp"=>nil, "pur"=>"blob_id"}}

Только после запроса этого URL он выполняет перенаправление 302, которое приводит к новому URL, который сам по себе содержит срок действия. из 5 минут в будущем.

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

(*) Протестировано с приложением Rails 6.0.2.2 с Post s, настроенным с has_one_attached :cover_image и использующим ActiveStorage служба дисков. config.active_storage.service_urls_expire_in не было определено и по умолчанию 5 минут. Посты были обработаны с style="background-image: url(#{url_for post.cover_image)})" (без простоты). URL фонового изображения в источнике страницы имеет структуру /rails/active_storage/blobs/XXX--YYY/ZZZ.jpg, где XXX - часть, закодированная в Base64.

...