2012-04-05 82 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

相關問題