已簽署的網址

本頁提供已簽署網址的總覽,這種網址是值區和物件查詢字串的驗證機制。已簽署的網址可讓任何擁有該網址的人,無論有無 Google 帳戶,都能在期限內透過網址取得讀取或寫入存取權。要進一步瞭解如何建立已簽署的網址,請參閱使用 gsutil 建立已簽署的網址使用程式建立已簽署的網址相關頁面。如要瞭解控制值區和物件存取權的其他方式,請參閱存取權控制總覽

何時應使用已簽署的網址?

某些情況下,您可能不想要求使用者擁有 Google 帳戶才能存取 Cloud Storage,不過仍希望使用應用程式專屬邏輯來控制存取權。一般的因應方法是,將已簽署的網址提供給使用者,讓使用者能在期限內讀取、寫入或刪除該資源。任何人只要知道網址,就可以存取該資源,直到網址過期。您可在要簽署的查詢字串中指定到期時間。

使用已簽署的網址搭配支援續傳的上傳作業

如果使用者只需上傳資源 (寫入) 至設有存取權控制的值區,您可使用 Cloud Storage 的支援續傳的上傳功能,這樣只需使用一個已簽署的網址,這個已簽署的網址是初始 POST 要求的一部分,在這段期間內實際上不會上傳任何資料。從初始 POST 要求會傳回工作階段 URI,接著可將其用於後續的 PUT 要求來上傳資料。由於工作階段 URI 其實是驗證憑證,所以無需簽署 PUT 要求。伺服器可以發出 POST 要求,這樣用戶端就不必使用簽署網址或 Google 帳戶。

支援續傳的上傳作業最好在啟動此作業的地區進行。舉例來說,如果您在美國建立支援續傳的上傳網址,並將其提供給亞洲的用戶端,則上傳作業仍會透過美國進行。在不是啟動上傳的地區執行支援續傳的上傳作業,可能導致上傳速度緩慢。為避免這種情況,您可以讓伺服器建構並簽署初始 POST 要求,但接著將已簽署的網址提供給用戶端,這樣上傳作業即會從用戶端的位置啟動。啟動後,用戶端就可以正常使用產生的工作階段 URI,來發出無需簽署的 PUT 要求。

如要將 Compute Engine 執行個體搭配向 Cloud Storage 發出 POST 的程序,以啟動支援續傳的上傳作業,則應該在 Cloud Storage 值區所在的相同位置中使用 Compute Engine 執行個體。接著可以使用地理 IP 服務,選擇 Compute Engine 地區來接收轉送的客戶要求,這樣有助於將流量保持在本地的地理區域。

字串中需要簽署的部分

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

StringToSign = HTTP_Verb + "\n" +
               Content_MD5 + "\n" +
               Content_Type + "\n" +
               Expiration + "\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 標頭必須設為相同值。
Expiration 1388534400 (必要) 這是簽章到期的時間戳記 (以秒為單位),自 Unix 紀元 (世界標準時間 1970 年 1 月 1 日 0 時 0 分 0 秒) 開始算起。超過這個時間戳記後,伺服器就會拒絕任何收到的要求。
Canonicalized_Extension_Headers x-goog-acl:public-read\nx-goog-meta-foo:bar,baz\n (視需要) 伺服器檢查確認用戶端是否使用已簽署的網址,在要求中提供吻合的值。要瞭解如何建立標準標頭以進行簽署,請參閱標準擴充標頭一節。
Canonicalized_Resource /bucket/objectname (必要) 正在網址中處理的資源。如需詳細資訊,請參閱標準資源一節。

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

在您使用程式建立已簽署的網址時,可從程式內簽署,或從 Google 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

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Storage
需要協助嗎?請前往我們的支援網頁