ruby-on-rails - 带有 GCS 文件的 ActiveStorage 不上传(签名不是 base64 编码的)|| (签名不匹配)
问题描述
我正在构建一个使用 ActiveStorage 的 Rails 应用程序,但在从 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
从干净的数据库开始。
但是每次我尝试上传文件时,我都会遇到同样的错误:
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>
我已经尝试使用 Google 提供的 JSON 保存config/secrets/filename.json
并调用它,如上所示。
还将凭据信息提供给credentials.yml.enc
(当然,使用适当rails credentials:edit
的 .
还将我的环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为指向 JSON。一切都无济于事(我总是得到同样的错误)。
我什至确实在我的存储桶中设置了 CORS 以接受基本上任何东西:
[{"origin": ["*"],"responseHeader": ["Content-Type"],"method": ["GET", "POST", "PUT", "HEAD"],"maxAgeSeconds": 3600}]
我确定我做错了什么,但无法弄清楚。
提前致谢!
解决方案
推荐阅读
- ruby-on-rails - 在 ruby 的侧数组中迭代哈希数组
- php - 无法在 WordPress 网站中使用 Barba js 进行简单的页面转换
- html - 创建一个类似 css 形状的泪珠,无需旋转,并以图像为背景
- java - App crashes after accessing data from SQLite Database android
- visual-studio-code - 如何在 VS 代码上启用这些建议?
- docker - JTL-Shop / admin / 无法使用 Traefik 登录
- angular - Angular中如何过滤数据?
- javascript - Aframe 按组件选择
- parameters - 通过 IEnumerable
Blazor WASM 中的 API 方法 - python - Python中的ValueError,数组中的索引数不匹配