2012-12-15 44 views
9

我想創建一個用於將特定對象(PUT)上傳到Amazon S3存儲桶的所謂「預簽名」URL。預簽名URL和x-amz-acl

到目前爲止這麼好。我正在使用Python庫boto來創建一個包含所有必要內容(過期,簽名等)的URL。該URL看起來是這樣的:

https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read

注意最後一個參數。

至少,據我瞭解,這限制了使用此URL將對象上傳到特定存儲桶中的特定密鑰並限制將在對象上設置爲「公開讀取」的預設ACL的人員。

儘管我最後的陳述很不正確。

事實證明,如果你使用這個網址,你可以與X-AMZ-ACL (而不是在查詢字符串參數具有相同的名稱,你必須將下列設置爲簽名檢查成功):

  1. 將其設置爲「public-read」。該對象的權限將由兩個條目組成:「讀」爲「每個人」和「完全控制」爲存儲桶擁有者。這是相當期待的。
  2. 忽略x-amz-acl標題。對象的權限將與每個桶默認值相同(桶擁有者具有完全控制權)。爲什麼?
  3. 將其設置爲「公開讀寫」。結果與(1)中完全相同。
  4. 將其設置爲「已認證讀取」。 「認證用戶」獲得「讀取」權限,存儲桶擁有者完全控制。
  5. 將其設置爲「bucket-owner-read」。結果與(2)完全相同。桶擁有者完全控制,沒有其他權限被定義。
  6. 將其設置爲「bucket-owner-full-control」。不出所料,水桶擁有者將完全控制。
  7. 將其設置爲不存在的ACL ACL名稱並出現錯誤。

如此看來,這

  1. 的X-AMZ-ACL 不參加簽名檢查部件,因爲你可以隨意改變它,並請求成功。但是,在簽名檢查期間,查詢字符串參數肯定是
  2. x-amz-acl 查詢字符串參數不會影響對象的權限直接,因爲它不會自行處理。
  3. 如果發送的是X-AMZ-acl標頭,得到的權限永遠
    • 剷鬥業主更嚴格的,比他們在默認情況下。
    • 對非桶擁有者的限制較少。
  4. 但是,它們可以是更具限制性的對於非桶擁有者。也就是說,如果在查詢字符串中指定了x-amz-acl=public-read,則可以將x-amz-acl標題設置爲authenticated-read,而不是公開可讀的對象獲取只能由經過身份驗證的用戶讀取的對象。

什麼是X-AMZ-ACL QS參數和頭之間的真正關係,即去同名?有沒有辦法限制對象的權限,即通過PUT請求上傳到所謂的「預先簽名」URL?

回答

4

據我所知(我在這裏可能是錯的),標題x-amz-acl優先於querystring參數 - 它們確實起到相同的作用。在簽名檢查期間只考慮查詢字符串參數的原因很簡單,因爲頭文件不是簽名檢查的一部分。

This page可能會幫助你;它在創建表單直接上傳到S3時幫助了我很多。

+0

既然你是唯一一個在這個問題上花費了一些努力的人,那麼只要你得到賞金,即使答案不幸,根本沒有幫助我。 – shylent

+0

對不起,答案不會更有幫助;只是試圖傳遞我對這個主題的任何知識。 – jdotjdot

-1

看來您使用的是acl參數的錯誤名稱。根據他們的簽名請求指導,嘗試使用ACL:

Signing and Authenticating REST Requests

如果請求解決子資源,如版本,位置,ACL,種子,生命週期,或?????? versionid追加子資源,它的值(如果有的話)和問號。請注意,如果存在多個子資源,則子資源必須按照子資源名稱按字典順序排序,並用「&」分隔。例如?acl & versionId = value。

構建CanonicalizedResource元素時必須包含的子資源列表包括:acl,生命週期,位置,日誌記錄,通知,partNumber,策略,requestPayment,torrent,uploadId,uploads,versionId,版本控制,版本和網站。

+0

不,你引用的是關於對子資源請求的討論,比如cors,acl,生命週期等。如果我試圖創建一個請求,讓我們修改acl,那麼這將是相關的被設置在特定的桶上。我的問題是將對象上傳到存儲桶並在正在上傳的對象上指定acl。這完全不同。 – shylent