1

我正在尝试通过 POST 方法通过 HTML 表单将文件上传到 Google Cloud Storage。Google 在他们的文档中声明,要分配非标准 ACL,您需要一个策略和一个签名字段。

阅读他们关于如何生成这些值的描述,看起来很简单。不幸的是,经过多次尝试,我仍然无法生成可以通过 Google 过滤器的值。我不断收到错误消息,说我的签名与保单文件不符。

有人可以指导我哪里出错了吗?这是我的过程:

  1. 建立我的政策文件

这是简单的部分。我的政策文件是:

{"expiration": "2015-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", ""], 
    {"acl": "public-read" }, 
    {"bucket": "publicjs"}, 
    {"success_action_redirect": "http://localhost/gcs.php" } 
] }
  1. 然后我去了这个网站并将上述值编码为base64。 这就是我用作我的政策文件的内容。

  2. 现在签名。我需要使用我的密钥作为加密密钥来加密我的保单文件,所以我去这个网站进行加密。我将我的 base64 编码策略文档(从步骤 2 开始)输入到主文本区域,并将我的互操作性“秘密”密钥输入到密钥框中。

  3. 按回车,base64 旁边的值应该是签名值

  4. 将值放入表单,发送 POST 请求,接收错误。

我哪里错了?

4

1 回答 1

4

编码顺序应如下:

  • base64 编码策略文档(我们称之为编码策略)

  • 生成编码策略的 SHA1 哈希(仅适用于互操作密钥,如果要使用 RSA 密钥,请使用 SHA256)并对其进行 base64 编码(我们称之为签名)

  • 在表单发布请求中发送编码的策略和签名(连同表单的其余部分)

这是 Python 中序列的理想化实现:

  POLICY = '''{
                "expiration": "2015-06-16T11:11:11Z", 
                "conditions": [
                  ["starts-with", "$key", "test"],
                  {"acl" : "public-read"}
                ]
              }'''

  GEN_FORM = '''
    <form action="%s" method="post" enctype="multipart/form-data">
      <input type="hidden" name="acl" value="public-read">
      <input type="hidden" name="bucket" value="YOUR_BUCKET">
      <input type="hidden" name="key" value="YOUR_OBJECT_NAME">
      <input type="hidden" name="GoogleAccessId" value="YOUR_ACCESS_ID">
      <input type="hidden" name="policy" value="%s">
      <input type="hidden" name="signature" value="%s">
      <input name="file" type="file">
      <input type="submit" value="Upload">
    </form>
  '''

  encoded_policy = base64.b64encode(POLICY).strip()
  h = hmac.new(YOUR_SECRET_KEY, digestmod=sha.sha)
  h.update(encoded_policy)
  signature = base64.b64encode(h.digest())
  gen_html = GEN_FORM % (url, encoded_policy, signature)
于 2012-04-06T03:34:09.160 回答