V2 簽署程序

本頁提供搭配 V2 簽署程序的已簽署網址總覽,這種網址是值區和物件查詢字串的驗證機制。已簽署的網址可讓任何擁有該網址的人,無論有無使用者帳戶,都能在期限內透過網址取得讀取或寫入存取權。

字串中需要簽署的部分

使用程式建立已簽署的網址時,程式會建構一個即將簽署的字串。在程式中,這個字串應定義如下:

StringToSign = HTTP_Verb + "\n" +
               Content_MD5 + "\n" +
               Content_Type + "\n" +
               Expires + "\n" +
               Canonicalized_Extension_Headers +
               Canonicalized_Resource

下表說明組成這個結構的各個部分:

字串組成部分 範例 說明
HTTP_Verb GET (必要) 要搭配已簽署的網址使用的 HTTP 動詞

附註:除非另有說明,否則已簽署的網址字串不支援 HTTP 動詞 POST。您可以使用 POST 定義簽署的政策文件,指定可上傳至值區的物件特性。詳情請參閱 POST 物件說明文件。

Content_MD5 rmYdCNHKFXam78uCt7xQLw== (選用) 使用 Base64 的 MD5 摘要值。如果您在字串中提供這個部分,則用戶端 (通常為瀏覽器) 提供的這個 HTTP 標頭必須在要求中含有相同值。
Content_Type text/plain (視需要) 如果您提供 content-type,則用戶端 (瀏覽器) 提供的這個 HTTP 標頭必須設為相同值。
Expires 1388534400 (必要) 這是簽章到期的時間戳記 (以秒為單位),自 Unix 紀元 (世界標準時間 1970 年 1 月 1 日 0 時 0 分 0 秒) 開始算起。超過這個時間戳記後,伺服器就會拒絕任何收到的要求,以及在用於產生已簽署網址的金鑰輪替後收到的要求。為確保安全及與 V4 簽署程序相容,您應將 Expires 設為最多 1 週 (604800 秒) 後的時間。
Canonicalized_Extension_Headers x-goog-acl:public-read\nx-goog-meta-foo:bar,baz\n (視需要) 伺服器檢查確認用戶端是否使用已簽署的網址,在要求中提供吻合的值。要瞭解如何建立標準標頭以進行簽署,請參閱標準擴充標頭
Canonicalized_Resource /bucket/objectname (必要) 正在網址中處理的資源。進一步詳情請參閱標準資源

使用 App Engine App Identity 服務簽署字串

使用程式建立已簽署的網址時,可從程式內簽署,或從 App Engine 應用程式中使用 App Engine Identity 服務簽署字串,這項服務會使用 App Engine 服務帳戶憑證。例如,您可以使用 Python App Identity API 來執行以下作業:

  • 使用 google.appengine.api.app_identity.sign_blob() 從建構的字串簽署位元組,以提供組合已簽署網址時所需的 Signature

  • 使用 google.appengine.api.app_identity.get_service_account_name() 擷取服務帳戶名稱,這是組合已簽署網址時所需的 GoogleAccessId

如需其他語言的支援,請參閱 Java 適用的 App Identity API 總覽PHP 適用的 App Identity API 總覽App Identity Go 函式一文。

App Identity 服務在簽署 blob 時會輪替私密金鑰。從 App Identity 服務產生的已簽署的網址,有效期限至少一小時,最適合需要短期資源存取權的情況。

標準擴充標頭

在您使用程式建立已簽署的網址時,可串連所有開頭為 x-goog- 的擴充 (自訂) 標頭,藉此建立訊息的標準擴充標頭部分。不過,您無法執行簡單的串連作業。請在建立標頭時遵循以下演算法:

  1. 將所有自訂標頭名稱設為小寫。

  2. 依碼點值,按標頭名稱的字母順序排序所有自訂標頭。

  3. 移除 x-goog-encryption-keyx-goog-encryption-key-sha256 標頭 (如有)。這些標頭所含的機密資訊不能放入要簽署的字串中;不過,對於任何使用產生的已簽署網址的要求,還是需要使用這些標頭。

  4. 使用以半形逗號分隔的值清單來建立一個標頭名稱,藉此消除重複的標頭名稱。請確認值之間沒有空白字元,且逗號分隔的清單順序與要求中的標頭排列順序相同。如需詳細資訊,請參閱 RFC 7230 的 3.2 節

  5. 以單一空格取代所有所有折疊的空白字元或新行字元 (CRLF 或 LF)。如要進一步瞭解折疊的空白字元,請參閱 RFC 7230 的 3.2.4 節

  6. 移除位於標頭名稱後方的冒號前後的任何空白字元。

  7. 為每個自訂標頭附加一個新行字元「\n」(U+000A)。

  8. 串連所有自訂標頭。

標準資源

在您使用程式建立已簽署的網址時,可串連用於執行要求的資源路徑 (值區和物件及子資源),藉此建立訊息的標準資源部分。建立資源時請注意下列幾點:

  • 標準資源是接在主機名稱之後的部分。舉例來說,如果 Cloud Storage 網址為 https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg,則標準資源為 /example-bucket/cat-pics/tabby.jpeg

  • 如果要求範圍僅限子資源 (例如 ?cors),請在字串的最後加上這個子資源 (包括問號)。

  • 請務必完整複製 HTTP 要求路徑,也就是說,您應該在建立的字串中加入所有網址編碼 (百分比符號)。此外,也請確認您僅加入指定子資源 (例如 cors) 的查詢字串參數。您不應加入 ?prefix?max-keys?marker?delimiter 等查詢字串參數。