Я экспериментирую с ActiveStorage, потому что хочу создать приложение Rails, где пользователь может загружать данные прямо в пространства DigitalOcean.
Однако я уже столкнулся с проблемой CSRF.
Я объявил цифровой океан в моем хранилище.yml:
do:
service: S3
access_key_id: this_is_a_secret
secret_access_key: this_is_also_a_secret
region: ams3
bucket: this_is_also_a_secret
endpoint: 'https://this_is_also_a_secret.ams3.digitaloceanspaces.com'
Я выбрал эту услугу хранения в моем development.rb
config.active_storage.service = :do
и я добавил драгоценный камень aws в Gemfile
gem "aws-sdk-s3", require: false
Мне потребовалось activestorage
в моем комплекте javascript.
и я добавил для проверки следующее:
= form_for(VideoUpload.first, url: "/") do |form|
div = form.file_field :file, direct_upload: true
div = form.submit("Send that file")
Когда я отправляю форму, включается библиотека activestorage.js. Она вызывает http://127.0.0.1:3000/rails/active_storage/direct_uploads
, что в свою очередь выдает 422 из-за отсутствующего токена CSRF. Я проверил запрос, и контроллер не ошибается. В заголовках HTTP не установлен токен CSRF, X-CSRF-Token
странным образом равен undefined
.
Тело запроса содержит: {"blob":{"filename":"9T6qqsA-png-wallpapers.jpg","content_type":"image/jpeg","byte_size":122990,"checksum":"gqU9VBgS9mmH7s45qHIbug=="}}
, поэтому здесь токена CSRF тоже нет.
Но форма, в которой указан элемент входного файла, содержит токен, поэтому я предполагаю, что activestorage.js
подхватит его.
Что мне здесь не хватает? Документация на https://edgeguides.rubyonrails.org/active_storage_overview.html#direct-uploads
не подразумевает, что какая-либо специальная конфигурация на стороне JS необходима.
Я использую Rails 5.2.1 и Ruby 2.5.1