如何在不登入的情況下開放使用者上傳檔案到 Storage

找了好久終於找到 Policy Document 能夠在不登入 Google Account 的情況下,讓使用者能夠直接在網頁中透過 Form 上傳檔案到 Storage。
以下將分成四個部分來說明,先大致敘述一下流程

  1. 準備 Service Account p12 檔,可在 GCP Console 建立
  2. 準備要上傳物件的描述內容,包括
    1. Bucket
    2. Key
    3. ACL
    4. Expiration 等等,其他內容可以參考 Policy Document
  3. 加密
  4. 將資訊填入 Form 後,上傳檔案

第一步:準備p12檔
登入 GCP Console 後可在 API 管理員 -> 憑證 -> 建立憑證 連結裡建立需要的憑證檔案



由於我們只需要用到 Storage 的功能,所以再分配角色權限上只需要分配對應的權限即可,如果需要用到其他服務則可參考能分配的權限進行分配。
建立好建立好服務帳戶後,p12檔會自動下載 到本機端。這個檔案只有一次下載機會,請務必保管好。

第二步:準備上傳物件的描述內容
根據 Policy Document 的說明,我們必須使用 JSON 格式來描述要上傳檔案的內容。其中必填的兩大項為 
  1. expiration:過期時間 (ISO8601 格式),當每次簽署 Policy Document 時,需要指定一個有效期限,當超過有效期限,則簽署會失效
  2. conditions:描述上傳檔案內容
範例:
{"expiration":"2017-04-24T11:11:51+02:00", 
 "conditions":[{"bucket":"upload"}, {"key":"myimg.png"}]}

PHP Sample Code



第三步:加密
這個步驟要小心注意加密的順序,以及確認 p12 所在位置無誤
  1. policy 必須是 utf-8 編碼 => policy_utf
  2. Base64 encode (policy_utf) => policy_base64
  3. SHA256( RSA (Secret Key, policy_base64)) => singed
  4. Base64 encode (signed) => signature
PHP Sample Code


第四步:將資訊填入 Form 中,上傳檔案
經過上面的步驟,我們會得到編碼後的 policy (policy_base64) 和 signature,我們需要把這兩個資訊帶入要上傳的 Form 內,除此之外,我們還需要把 policy conditions 中指定的內容一並填入 Form 中,這個步驟很重要,如果 conditions 有指定但是 Form 沒有指定,上傳一定會失敗
PHP Sample Code



  • action:固定格式,請填入 <bucket>.storage.googleapis.com,其中 <bucket>請換成要上傳的 bucket 名稱,例如 upload.storage.googleapis.com
  • method:POST (固定)
  • enctype:multipart/form-data (固定)
  • GoogleAccessId:請填入步驟一中建立的 Service Account

github 程式連結

留言

這個網誌中的熱門文章

GCP DevOps 實作系列二 設定Jenkins

如何新增使用者並開放 sudo 權限以及取消輸入密碼的要求