ActiveStorage с файлами GCS не загружается (подпись не была закодирована в base64) ||(SignatureDoesNotMatch) - PullRequest
1 голос
/ 25 сентября 2019

Я создаю приложение Rails, использующее ActiveStorage, и у меня возникают проблемы при переходе с S3 на Google.

До сих пор я использовал S3 в качестве облачного хранилища, и все работало нормально.Но я хочу использовать Google Storage, потому что я планирую использовать Google API для взаимодействия с файлами, загруженными туда.

Я все еще делаю все это в среде разработки.

  • Я изменил config/storage.yml, чтобы добавить соответствующую информацию
google_dev:
  service: GCS
  project: [REDACTED]
  credentials: <%= Rails.root.join("config/secrets/[MY_FILE].json") %>
  bucket: [REDACTED]

и изменил config/environments/development.rb на config.active_storage.service = :google_dev

Я также сделал rails db:reset, чтобы начать сclean db.

Но каждый раз, когда я пытаюсь загрузить файл, я получаю одну и ту же ошибку:

Started POST "/rails/active_storage/direct_uploads" for ::1 at 2019-09-25 02:54:43 +0200
Processing by ActiveStorage::DirectUploadsController#create as JSON
  Parameters: {"blob"=>{"filename"=>"audioprueba03.wav", "content_type"=>"audio/wav", "byte_size"=>7080908, "checksum"=>"8WjGtwdMQH+YA/m3PkPqjw=="}, "direct_upload"=>{"blob"=>{"filename"=>"audioprueba03.wav", "content_type"=>"audio/wav", "byte_size"=>7080908, "checksum"=>"8WjGtwdMQH+YA/m3PkPqjw=="}}}
   (0.1ms)  begin transaction
  ActiveStorage::Blob Create (1.8ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "byte_size", "checksum", "created_at") VALUES (?, ?, ?, ?, ?, ?)  [["key", "0nklcvjevlgcetnz178djjhmb5hh"], ["filename", "audioprueba03.wav"], ["content_type", "audio/wav"], ["byte_size", 7080908], ["checksum", "8WjGtwdMQH+YA/m3PkPqjw=="], ["created_at", "2019-09-25 00:54:43.950138"]]
   (1.0ms)  commit transaction
  GCS Storage (1.8ms) Generated URL for file at key: 0nklcvjevlgcetnz178djjhmb5hh (https://storage.googleapis.com/my-bucket/0nklcvjevlgcetnz178djjhmb5hh?GoogleAccessId=[REDACTED].iam.gserviceaccount.com&Expires=1569373183&Signature=LKnSO1T3G4iF%2BOEw7fbS4%2FMZS7ne%2FiKqobJ5xb3iCsyONbCzNcp8X9PDcdiNKBMZUU4Pg9DyV5D%2Bq7YdEOG4GPvjokxH0GsWG9%2FbKBVYhHBYsGqWszqeDCzATMXUGcSMqnefHDZXu%2FTIwBKsS4HbRKcHfyQZwCy%2FKsFkTxR1huliSw36C650whKC3hunMD0tSwBr%2Fpi7JNIvAuGia3OwJVr9Da1PstfTebgLrMqlAdM1JxuzqRW5ZztIv6RArdJO3047MekyD5YNajI%2FWqsSfQLHsmkRiBe4G4Vy8yz%2Fhs%2B%2BmWpOTjvRYvYlMl8x8V3pazwiC%2F8qdB591MrCSiTBUQ%3D%3D)
Completed 200 OK in 11ms (Views: 0.6ms | ActiveRecord: 2.9ms | Allocations: 4962)

Если я следую по указанному URL-адресу в браузере, я получаю следующее:

<Error>
<Code>MalformedSecurityHeader</Code>
<Message>Your request has a malformed header.</Message>
<ParameterName>signature</ParameterName>
<Details>Signature was not base64 encoded</Details>
</Error>

Если я сверну URL-адрес, получится следующее:

<?xml version='1.0' encoding='UTF-8'?><Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.</Message>

Я попробовал его с помощью JSON, предоставленного Google, сохраненного в config/secrets/filename.json и вызванного, как показано выше.

Также предоставляя информацию об учетных данных для credentials.yml.enc (с правильными rails credentials:edit, конечно.

Также устанавливая мою переменную среды GOOGLE_APPLICATION_CREDENTIALS, чтобы указывать на JSON. Все безрезультатно (явсегда получаю одну и ту же ошибку).

Я даже установил CORS в своем ведре, чтобы принять basicaЛили что-нибудь:

[{"origin": ["*"],"responseHeader": ["Content-Type"],"method": ["GET", "POST", "PUT", "HEAD"],"maxAgeSeconds": 3600}]

Я уверен, что делаю что-то не так, но не могу понять.

Заранее спасибо!

...