我試圖通過POST方法通過HTML表單將文件上傳到Google Cloud Storage。谷歌在他們的documentation中聲明,要分配一個非標準的ACL,你需要一個策略和一個簽名字段。生成Google雲端存儲策略文檔和簽名
通過閱讀關於如何生成這些值的描述,它看起來很簡單。不幸的是,經過多次嘗試,我仍然無法生成可通過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)輸入到正文區域,並將我的互操作性「祕密」密鑰輸入到密鑰箱中。
點擊輸入,base64旁邊的值應該是簽名值。
將值放在表單中,發送POST請求,接收錯誤。
我在哪裏出錯了?
其實得到這個想通了。我不小心在做一個SHA256(正如Google的文檔中提到的那樣),但是SHA1確實是需要的。另外,如果我使用「key」而不是「$ key」,則會出現無效的策略錯誤。 – jwegner 2012-04-06 12:03:59
使用互操作性密鑰時需要SHA1哈希,但使用RSA密鑰時需要SHA256。我認爲你提到的文檔假定RSA,但是對於這一點可能更加清楚(我已經寫了一個修復這個問題的請求)。你對美元符號是正確的,它們在使用字段名稱時不屬於它們,但是在使用條件時需要它們,這裏使用的是條件。我已更新我的代碼以反映該更正,以免我誤導此線程的任何訪問者。感謝約瑟夫! – 2012-04-06 15:45:40
@MarcCohen我有一個不可能的時間試圖讓簽名工作(注:我試圖使用互操作性鍵和SHA1,就像你的例子)。我所得到的只是「SignatureDoesNotMatch」。看起來,如果我的POLICY字符串在空白方面與Google放在一起時有任何不同,那麼這將完全改變最終簽名,而且它們不會匹配。我如何知道,在編碼/簽名之前,我的策略字符串具有Google提供的確切預期格式? – 2013-12-21 01:46:15