生成Google云端存储策略文档和签名

时间:2012-04-05 16:41:24

标签: post upload signature google-cloud-storage

我正在尝试通过POST方法通过HTML表单将文件上传到Google云端存储。 Google在documentation中声明要分配非标准ACL,您需要一个策略和一个签名字段。

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

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

  1. 构建我的政策文件
  2. 这很容易。我的政策文件是:

    {"expiration": "2015-06-16T11:11:11Z", 
    "conditions": [ 
        ["starts-with", "$key", ""], 
        {"acl": "public-read" }, 
        {"bucket": "publicjs"}, 
        {"success_action_redirect": "http://localhost/gcs.php" } 
    ] }
    
    1. 然后我去了this website并在base64中编码了上面的值。 这就是我正在使用的政策文件。

    2. 现在签名。我需要使用我的密钥作为加密密钥加密我的策略文档,所以我去this website进行加密。我将base64编码的策略文档(从步骤2)输入到主文本区域,并将我的互操作性“Secret”键输入到密钥框中。

    3. 按Enter键,base64旁边的值应为签名值

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

    5. 我哪里错了?

1 个答案:

答案 0 :(得分: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)