通过签名网址将文件放到谷歌云存储(GCS)

2022-09-04 19:54:16

我正在尝试使用“签名网址”访问文件并将其上传到 Google Cloud Storage (GCS)。

按照 https://developers.google.com/storage/docs/accesscontrol#Signing-Strings 中的说明进行操作

我做了什么:

  • 在 Google Cloud Console 注册了一个“Web 应用程序”。
  • 使用已注册 Web 应用程序屏幕的“证书”部分中的“生成新密钥”生成新的私钥。
  • 创建要签名的字符串,并使用页面的“如何签名”部分提供的示例代码对其进行签名(只需对Java主程序的硬编码值进行微小的调整)。更新:为gcsSigner创建了一个要点.java。
  • 确保签名字符串是 URL 编码的。
  • 指定的 HTTP 标头:x-goog-api-version、x-goog-project-id、Content-Type。
  • 指定的网址参数:GoogleAccessId、签名、过期。
  • 使用Postman(Chrome扩展程序)来模拟PUT请求。

但是,我仍然得到这个(状态:403禁止):

<?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>
    <StringToSign>PUT

text/plain
1384084959392
x-goog-api-version:2
x-goog-project-id:99999
/mybucket/myfile.txt</StringToSign>
</Error>

即使我根据“StringToSign”中的值对字符串进行签名来重试,我仍然会得到相同的错误。

在这里阅读各种相关帖子,但找不到任何解决方案,其中大部分都是指我使用版本2时。x-goog-api-version:1

我错过了什么?任何帮助将不胜感激。


答案 1

最后设法使用签名网址将文件PUP到Google Cloud Storage。这是通过创建一个简单的Java程序来模拟来完成的:

  • Server对字符串进行签名和编码为签名。
  • Uploader作为仅使用 提供的签名提交 PUT 请求的未经身份验证的用户。浏览器是使用Apache的HTTP客户端库模拟的。Server

您可以在此处查看演示应用程序

我真的不明白为什么当我通过Chrome的Postman扩展程序提交时它不起作用。


答案 2

虽然文档说是可选的,但它实际上意味着你设置了正确的对应于你的http请求头。Content-Typemustcontent-Type

在这种情况下,您必须添加签名字符串。content-type: text/plain

https://cloud.google.com/storage/docs/access-control/create-signed-urls-program


推荐