Cloudflare AI Gateway 怎麼接 Access?用 cf.user_id 做使用者用量分流
如果 AI Gateway 只用一組 gateway token,所有請求在觀測與成本分析上很容易被歸到同一個匿名使用者。Cloudflare 目前提供另一條路徑:把 gateway 綁到自訂網域,再用 Cloudflare Access 在入口驗證使用者,讓 AI Gateway 把已驗證的 Access subject 寫入 cf.user_id。
這項設定解決的是「誰呼叫 gateway」與「每個人用了多少」的身份邊界,不是把 provider API key 交給前端。直接記法是:Access 保護的是 custom domain;預設的 gateway.ai.cloudflare.com 仍走 gateway token;只有帶有效 Access JWT 且有非空 sub 的請求,才會得到 cf.user_id。
先分清楚三種請求入口
AI Gateway 同時存在預設入口、Access custom domain 與 service token。不要只看到請求成功,就推論三條路徑的身份資訊相同:
| 請求方式 | 是否經過 Access | User Insights 能辨識什麼 |
|---|---|---|
gateway.ai.cloudflare.com + gateway token | 否,除非另有其他入口控制 | 不會自動得到 Access user identity |
| 自訂網域 + 有效 Access JWT | 是 | cf.user_id 取自 Access JWT 的 sub |
| 自訂網域 + Access service token | 不是個人使用者身份 | 不會產生 cf.user_id |
Cloudflare 文件指出,Access JWT 的 sub 不是使用者 email;它是 Access token 的 subject。若你的報表需要顯示 email 或組織內的人員名稱,應另外建立身份對照,不要把 cf.user_id 當成 email 欄位。
設定前先準備 custom domain
Cloudflare 的 Access 整合必須先有 AI Gateway custom domain。設定流程可以依下面順序進行:
- 在要保護的 gateway 上設定 custom domain,例如
ai.example.com。 - 確認 DNS 與 domain control validation 已完成,不要在
pending_dcv時就把正式 client 全部切過去。 - 到 Cloudflare dashboard 的 AI → AI Gateway,選擇該 gateway 的 Access 設定。
- 建立 Access application 與 policies,限制哪些身份可以呼叫 gateway。
- 讓 client 透過 Access 的瀏覽器登入、service token 或其他已核准的 Access 流程取得 token。
- 先用一個測試 identity 呼叫 custom domain,再到 logs、analytics 或 User Insights 確認分流結果。
設定 Access tab 會替 gateway 建立對應的 Access application;非瀏覽器 client 仍要依 Access 的 token header 或 cookie 規則送出認證。不要把 Access token、provider key 或 gateway 管理 token 放進前端 bundle。
Custom domain 的請求路徑會變短
使用 custom domain 後,Cloudflare 文件的 OpenAI-compatible 範例會把 account ID 與 gateway ID 從路徑拿掉:
cloudflared access curl \ --header 'Content-Type: application/json' \ 'https://ai.example.com/openai/v1/chat/completions' \ --data '{ "model": "gpt-4.1-mini", "messages": [{"role": "user", "content": "Hello"}] }'這個範例的重點不是固定使用 cloudflared access curl;如果你的 client 使用 Access bearer token 或 cookie,也可以按照 Access 的非瀏覽器流程傳遞。重點是請求要打到受 Access 保護的 custom domain,而不是仍然打到預設 gateway endpoint,卻期待它自動出現 cf.user_id。
Cloudflare 也說明,當 custom domain 受 Access 保護後,每個請求都必須通過 Access policy。只送 gateway token、沒有有效 Access token 的請求,會在到達 AI Gateway 前被 Access 擋下;原本使用 gateway.ai.cloudflare.com 的整合則不會自動繼承這個 policy。
cf.user_id 從哪裡來?
當 AI Gateway 收到有效且有非空 subject 的 Access JWT,它會在 request metadata 加入 cf.user_id。這個值由 Cloudflare 產生並保留,不能由 client 自行在 metadata 裡偽造:
cf.user_id的來源是 Access JWTsub,不是 email。- service token 不代表個別使用者,因此不會有
cf.user_id。 cf.開頭的 metadata key 是 Cloudflare 保留欄位,不能由你自行提供。- 如果 JWT 沒有非空 user subject,Access 仍可能完成驗證,但不會產生可用的
cf.user_id。
這個邊界很重要:如果前端傳來 user_id: "alice",那只是 client metadata,不等於 Cloudflare 已驗證的使用者。需要可信身份時,應使用 Access policy 與 cf.user_id,不要把前端欄位直接當成計費或權限依據。
User Insights 與 spend controls 要放在哪一層?
AI Gateway 的 User Insights 可以用 gateway 流量觀察組織的 AI 使用量。沒有身份或 custom metadata 時,流量會被歸到匿名識別;若使用 Access,經過驗證的 identity 可以用來篩選 spend 與 analytics。
但 Access 本身不是 spend limit。建議分成三層:
- Access policy:誰能進入 custom domain。
- AI Gateway User Insights:哪個已驗證 identity 產生多少請求與支出。
- AI Gateway spend controls:在 gateway 或組織層設定用量與成本界線。
如果你同時使用 Workers AI 與第三方模型的 Unified Billing,請把帳單入口和身份入口分開檢查,可參考 Cloudflare Workers AI 統一計費與 AI Gateway 的分工。Access 會改善「誰在用」的可見度,不會自動改變 provider、credits 或 billing 路徑。
切換前用三個測試請求驗證
不要只用一個登入帳號測試。至少準備下面三種請求,並比較 logs/analytics/User Insights:
| 測試 | 預期檢查 |
|---|---|
| 使用者 A 的有效 Access JWT | 出現 A 對應的 cf.user_id,請求通過 policy |
| 使用者 B 的有效 Access JWT | 產生不同的 cf.user_id,可分開看用量 |
| 無 Access token 或只有 gateway token | custom domain 應被 Access 擋下,不應當成匿名成功請求 |
若要支援 automation 或 coding agent,另外測試 service token。它適合代表一個服務,不應被當成某位人員的 cf.user_id;需要逐人歸因時,應讓使用者以個人 Access identity 呼叫,或在產品層建立明確且可審核的代理流程。
結論:把身份驗證留在入口
AI Gateway + Access 的正確使用方式,是讓 custom domain 負責「誰可以呼叫」,讓 cf.user_id 負責「這個已驗證身份產生了哪些流量」,再由 User Insights 和 spend controls 負責觀測與成本治理。不要把 gateway token、Access token 和前端自訂 user ID 混成一個欄位,也不要因為預設 endpoint 能回應,就以為它已經受到 Access policy 保護。
常見問題
Q: 只建立 Cloudflare Access application,就會保護預設 AI Gateway URL 嗎?
A: 不會。Cloudflare 文件的 Access 整合建立在 gateway custom domain 上;gateway.ai.cloudflare.com 是另一個預設入口,原本的 gateway-token 流量不會自動改走 Access。要套用 policy,client 必須改打受保護的 custom domain。
Q: 可以自己傳 cf.user_id 來標記使用者嗎?
A: 不可以把它當成可信做法。cf. 開頭的 metadata key 是 Cloudflare 保留欄位;cf.user_id 只有在有效 Access JWT 有非空 sub 時才會由 AI Gateway 加入。自行傳送普通的 user_id 欄位,不會取得相同的驗證意義。
Q: service token 為什麼沒有 cf.user_id?
A: service token 代表一個服務或自動化流程,不代表個別 Access 使用者。Cloudflare 文件明確列出 service-token requests 不會包含 cf.user_id;要逐人歸因,需改用有 user subject 的 Access identity。
參考資料:
Cloudflare Docs:AI Gateway — Cloudflare Access
回報錯字、失效連結,或告訴我你想看的延伸主題。