星期日, 8月 24, 2025

[GAS] 存取 GCP Secret Manager

[GAS] Properties Service 提到存放機敏資料在 GCP 上,該筆記記錄使用 Google Apps Script 來存取存在放在 GCP Secret Manager 上的 Token

Secret Manager

在 Google Cloud 上開一個 GASLab 新 Project

搜尋 Secret Manager API 並啟用

啟用後進入密鑰管理員內建立密鑰


建立密鑰資訊

IAM 與管理 (身分與存取權限) 因為剛好就是該 GCP 專案擁有者,預設就有存取權限,假如有分享其他帳號存取,要在這邊進行授予專案存取權限
使用雲服務,當然就免不了會有費用支出,請參考 Secret Manager 定價

在 Google Apps Script 設定 oauth 授權範圍

Google Apps Script 會使用 oauth 去連接 GCP Secret Manager,要先設定 oauth 授權範圍。

Google Apps Script Project settings => 啟用 [在編輯器中顯示「appsscript.json」資訊清單檔案]

在編輯器中出現「appsscript.json」資訊清單檔案並加入 oauth 授權範圍。
appsscript.json 完整資訊,oauthScopes 為手動加入
{
  "timeZone": "Asia/Taipei",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
  "https://www.googleapis.com/auth/script.external_request",
  "https://www.googleapis.com/auth/cloud-platform"]
  }
上述授權相關內容,可以參考官方文章 - Authorization Scopes 的 Set explicit scopes 章節

Google Apps Script 存取

確定專案 ID,在 GCP 上專案資訊業上就可以找到,[專案編號] 或 [專案 ID] 都可以

存取流程大方向如下:組 API 網址  → 取得 OAuth Token  → 發出 Request 取回 payload  → 解析及解碼 payload  → 回傳 Toekn
function getLineBotToken() {

  let projectID = '請自行查詢 Project ID';
  let secretName = 'LineBot_ChannelAccessToken';
  let versionNumber = 'latest'; // 也可以填版號如 '1'、'2'
  let endpoint = `https://secretmanager.googleapis.com/v1/projects/${projectID}/secrets/${secretName}/versions/${versionNumber}:access`;
  
  // 取得 Apps Script 的 OAuth Token,身份驗證使用
  let token = ScriptApp.getOAuthToken();

  // API 呼叫
  let response = UrlFetchApp.fetch(endpoint, 
  {
    headers: {
      Authorization: 'Bearer ' + token,
      Accept: 'application/json',
    }
  });

  // payload.data 欄位是 base64 byte[]
  let data = JSON.parse(response.getContentText())['payload']['data'];

  // 將 base64 byte[] 解碼為 UTF-8 byte[]
  let decoded = Utilities.base64Decode(data);

  // 把 UTF-8 byte[] 轉回字串
  return Utilities.newBlob(decoded).getDataAsString();
}

官方文章 - SecretPayload 提到 data 是 base64-encoded 字串,所以上述流程才會有 decode 動作
實際執行

沒有留言:

張貼留言