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 應用程式內簽署字串,這項服務會使用 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-key 和 x-goog-encryption-key-sha256 標頭 (如有)。這些標頭包含機密資訊,不得納入待簽署字串;不過,在使用產生的經簽署的網址時,仍須在要求中使用這些標頭。

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

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

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

  7. 在每個自訂標頭後方附加換行符號「\n」(U+000A)。

  8. 串連所有自訂標頭。

標準資源

使用程式建立經簽署的網址時,您需要串連要求作用的資源路徑 (bucket、物件和子資源),建構訊息的標準化資源部分。建立資源時請注意下列幾點:

  • 標準資源是接在主機名稱之後的部分。舉例來說,如果 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 等查詢字串參數。