我正在尝试通过POST方法通过HTML表单将文件上传到Google云端存储。 Google在documentation中声明要分配非标准ACL,您需要一个策略和一个签名字段。
阅读他们关于如何生成这些值的描述,看起来很简单。不幸的是,经过多次尝试,我仍然无法生成将通过Google过滤器的值。我不断收到错误,说我的签名与政策文件不符。
有人可以告诉我哪里出错了吗?这是我的过程:
这很容易。我的政策文件是:
{"expiration": "2015-06-16T11:11:11Z",
"conditions": [
["starts-with", "$key", ""],
{"acl": "public-read" },
{"bucket": "publicjs"},
{"success_action_redirect": "http://localhost/gcs.php" }
] }
然后我去了this website并在base64中编码了上面的值。 这就是我正在使用的政策文件。
现在签名。我需要使用我的密钥作为加密密钥加密我的策略文档,所以我去this website进行加密。我将base64编码的策略文档(从步骤2)输入到主文本区域,并将我的互操作性“Secret”键输入到密钥框中。
按Enter键,base64旁边的值应为签名值。
将值放入表单,发送POST请求,收到错误。
我哪里错了?
答案 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)