首页 > 解决方案 > 带有 GCS 文件的 ActiveStorage 不上传(签名不是 base64 编码的)|| (签名不匹配)

问题描述

我正在构建一个使用 ActiveStorage 的 Rails 应用程序,但在从 S3 到 Google 时遇到了麻烦。

到目前为止,我一直使用 S3 作为我的云存储,一切正常。但我想使用 Google Storage,因为我计划使用 Google API 与上传到存储桶的文件进行交互。

我仍然在开发环境中做这一切。

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-railsrails-activestorage

解决方案


推荐阅读