瀏覽文件

維護方

透過 SaaS Proxy 呼叫供應商 API

需要呼叫尚未封裝為 Connector 操作的供應商介面時,可以使用 SaaS Proxy。後端指定介面位址、方法與參數,Connector 選擇終端使用者已連接的帳號並注入供應商憑證。供應商必須支援 proxy,呼叫仍受帳號既有權限限制。

準備已連接的帳號

先完成 Connector for SaaS 接入指南,將 Project API key 儲存在後端,並保存經過驗證的使用者與帳號綁定關係。使用 oo_proj_… 形式的 Project key,不要使用 OOMOL 個人 key 或供應商 token。根據產品已登入使用者決定 userId 與帳號,不要直接信任瀏覽器提交的任意帳號 ID。

透過 HTTP 呼叫

POST https://connector.oomol.com/v1/saas/proxy/{service}
Authorization: Bearer <project-api-key>
Content-Type: application/json

以下 Gmail 唯讀範例取得已連接帳號的個人資料。將服務設定與連接帳號 ID 替換為後端保存的值,帳號需已授權讀取資料。外層 HTTP 方法一律為 POST,供應商請求的方法寫在 request 內。

export PROJECT_API_KEY='oo_proj_...'
export PROVIDER_CONFIG_ID='<gmail-provider-config-id>'
export CONNECTED_ACCOUNT_ID='<connected-account-id>'

curl --silent --show-error \
  'https://connector.oomol.com/v1/saas/proxy/gmail' \
  -H "Authorization: Bearer $PROJECT_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'x-request-id: req-saas-proxy-1' \
  --data @- <<JSON
{
  "providerConfigId": "$PROVIDER_CONFIG_ID",
  "userId": "customer-1",
  "connectedAccountId": "$CONNECTED_ACCOUNT_ID",
  "request": {
    "endpoint": "/users/me/profile",
    "method": "GET"
  }
}
JSON

請求欄位

欄位用法
userId必填:產品內的終端使用者 ID,必須與連接帳號對應。
providerConfigId選填,建議明確填入服務設定 ID,其服務必須與 URL 一致。省略時,專案中該服務必須只有一個有效設定。
connectedAccountId / alias選填,最多填入一個。都省略時,選擇該使用者在此服務設定下最新的 active 帳號。
request.endpoint必填:以 / 開頭、附加至供應商 Base URL 的路徑,或位於允許來源的完整 HTTPS URL。Gmail 的 Base URL 為 https://gmail.googleapis.com/gmail/v1。
request.method必填:GET、POST、PUT、PATCH 或 DELETE。
request.query選填:值為字串、數字、布林值或 null 的物件。null 項目會被略過,不接受陣列或巢狀物件。
request.headers選填:非驗證用途的標頭。Connector 會注入憑證,不要填入 Authorization、Cookie、Host 或 X-API-Key。
request.body選填:傳送至供應商寫入介面的 JSON 或文字。GET 不傳送請求本文。

透過 ProjectConnector 呼叫

使用包含 ProjectConnector.proxy 的 @oomol-lab/connector 版本。如果已安裝版本沒有此方法,可先使用 HTTP 範例。SDK 使用 externalUserId 與 connectionName,傳送時轉換為 userId 與 alias;connectedAccountId 優先於 connectionName。泛型用於描述預期回應型別,不會在執行階段驗證供應商資料。

npm install @oomol-lab/connector
import { ProjectConnector } from "@oomol-lab/connector";

const project = new ProjectConnector({
  apiKey: process.env.PROJECT_API_KEY!,
});

const result = await project.proxy<{ emailAddress: string }>(
  "customer-1",
  "gmail",
  { endpoint: "/users/me/profile", method: "GET" },
  {
    providerConfigId: process.env.PROVIDER_CONFIG_ID!,
    connectedAccountId: process.env.CONNECTED_ACCOUNT_ID!,
    retries: 0,
  },
);

if (result.status < 200 || result.status >= 300) {
  throw new Error(`Provider returned HTTP ${result.status}`);
}
console.log(result.data.emailAddress);

同一使用者需要多次呼叫時,可以先綁定使用者:

const user = project.forUser("customer-1");
const profile = await user.proxy<{ emailAddress: string }>(
  "gmail",
  { endpoint: "/users/me/profile", method: "GET" },
  {
    providerConfigId: process.env.PROVIDER_CONFIG_ID!,
    connectionName: "work",
    retries: 0,
  },
);
if (profile.status < 200 || profile.status >= 300) {
  throw new Error(`Provider returned HTTP ${profile.status}`);
}
console.log(profile.data.emailAddress);

讀取回應與處理錯誤

以下為 HTTP 回應結構範例。SDK 直接回傳其中的 data 物件,即 status、headers 與 data。透過 HTTP 呼叫時,可保存 meta.executionId 供排查使用。

{
  "success": true,
  "message": "OK",
  "data": {
    "status": 200,
    "headers": { "content-type": "application/json" },
    "data": {
      "emailAddress": "user@example.com",
      "messagesTotal": 120,
      "threadsTotal": 80,
      "historyId": "12345"
    }
  },
  "meta": {
    "executionId": "exec-example",
    "service": "gmail",
    "appId": "app-example"
  }
}

需要檢查兩層結果。Connector 成功回傳時,data.status 仍可能是供應商的非 2xx 狀態碼;SDK 對應檢查 result.status,同時檢查供應商回應本文。Connector 本身的失敗會在 SDK 中擲出 ConnectorError。Project API key 無效時,HTTP 可能回傳 401 與純文字 Unauthorized,因此不要假定所有錯誤回應都是 JSON。

限制與疑難排解

  • Proxy 回傳解析後的 JSON 或文字,不是串流或二進位傳輸介面。預設上游逾時為 30 秒,回應大小限制為 4 MiB;個別供應商可以覆寫這些限制。

  • Proxy 不會增加 OAuth 權限。供應商因 scope 不足拒絕請求時,檢查服務設定,並讓使用者重新授權所需權限。僅接受供應商允許的來源,不能代理任意 URL。

  • provider_config_not_found 與 multiple_provider_configs_found 用於排查設定選擇;proxy_not_supported 表示供應商不支援 proxy。遇到 proxy_upstream_timeout 或 proxy_response_too_large 時,盡可能縮小請求或回應範圍。

  • 逾時不代表供應商寫入失敗。可能產生重複效果的操作應關閉自動重試,SDK 範例已將 retries 設為零。記錄請求 ID 與 HTTP 回應中存在的 meta.executionId,並到 OOMOL Console 的專案執行記錄中排查。

繼續閱讀 ProjectConnector 帳號接入。

開始使用

開始使用