Я создаю приложение 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}]
Я уверен, что делаю что-то не так, но не могу понять.
Заранее спасибо!