2012-04-05 59 views
1

我试图通过POST方法通过HTML表单将文件上传到Google Cloud Storage。谷歌在他们的documentation中声明,要分配一个非标准的ACL,你需要一个策略和一个签名字段。生成Google云端存储策略文档和签名

通过阅读关于如何生成这些值的描述,它看起来很简单。不幸的是,经过多次尝试,我仍然无法生成可通过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. 我后来去this website和编码以base64上述值。 这是我用作我的政策文件。

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

  3. 点击输入,base64旁边的值应该是签名值

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

我在哪里出错了?

回答

4

的编码顺序应该是如下:

  • Base64编码的政策文件(让我们把该编码策略)

  • 生成SHA1哈希值(仅用于互操作键,如果使用SHA256你想使用RSA密钥)编码的策略和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) 
+0

其实得到这个想通了。我不小心在做一个SHA256(正如Google的文档中提到的那样),但是SHA1确实是需要的。另外,如果我使用“key”而不是“$ key”,则会出现无效的策略错误。 – jwegner 2012-04-06 12:03:59

+0

使用互操作性密钥时需要SHA1哈希,但使用RSA密钥时需要SHA256。我认为你提到的文档假定RSA,但是对于这一点可能更加清楚(我已经写了一个修复这个问题的请求)。你对美元符号是正确的,它们在使用字段名称时不属于它们,但是在使用条件时需要它们,这里使用的是条件。我已更新我的代码以反映该更正,以免我误导此线程的任何访问者。感谢约瑟夫! – 2012-04-06 15:45:40

+0

@MarcCohen我有一个不可能的时间试图让签名工作(注:我试图使用互操作性键和SHA1,就像你的例子)。我所得到的只是“SignatureDoesNotMatch”。看起来,如果我的POLICY字符串在空白方面与Google放在一起时有任何不同,那么这将完全改变最终签名,而且它们不会匹配。我如何知道,在编码/签名之前,我的策略字符串具有Google提供的确切预期格式? – 2013-12-21 01:46:15

相关问题