文件 / explanation
安全與隱私
公開與管理介面能做什麼、SSO、代理服務權杖、稽核記錄與 GitHub 存取如何保護它們,以及訪客資料如何處理。
兩種存取方式
Public — 任何人,無需憑證。REST API(/api/v1/*)、公共 MCP 伺服器(/mcp)、CLI 的公開指令與靜態檔案皆為唯讀。它們只曝光已發布的語料庫,依設計即為公開。ask_jenks 與網站聊天會呼叫語言模型,因此會依 IP 位址進行速率限制以防濫用。
Admin — Jenks,以及他授予權杖的 AI 代理。/api/admin/*、/mcp/admin、jenks admin … 與主控台可以驗證、寫入與刪除內容檔案、上傳與刪除媒體檔案,並將 dev 推升為 main。這是實質的高權限,因此採三層防護。
人員登入:SSO
主控台位於 https://admin.jenksguo.xyz/admin(開發站為 https://admin.dev.jenksguo.xyz/admin)。Cloudflare Access 佇立在這些主機之前:在以允許的 Google 帳戶登入前,任何人都無法觸達主控台。其他位址上的 /admin 會重新導向至該處。
Worker 不會僅僅信任 Cloudflare 的標頭。每次管理請求都會自行驗證簽署的 Access 權杖——將簽章對照 Access 團隊的公鑰、應用程式的 audience 標籤、簽發者與到期時間——而且該電子郵件必須在管理員名單中。
代理的服務權杖
AI 代理不會使用 Jenks 的登入。Jenks 會在主控台為每個代理建立服務權杖(Access → New agent token):
- 已命名 — 「Claude Code on MacBook」,因此稽核記錄能指出哪個代理做了什麼。
- 具範圍 —
content(內容、翻譯與網站文字)、media(媒體庫)、publish(直接寫入正式環境並將dev→main)。每個權杖皆可讀取。沒有publish時,代理會存到dev,由 Jenks 來推升變更。 - 會到期 — 30 到 365 天(預設為 90)。
- 可撤銷 — 一鍵撤銷,下一次請求即生效。
- 綁定 SSO — 只有透過 Access 登入的人員才能建立、列出或撤銷權杖;代理權杖不能建立另一個權杖。若建立權杖的人不再是管理員,該權杖也會失效。
- 以雜湊形式儲存 — 權杖只在建立時顯示一次;資料庫只保留其 SHA-256 雜湊。
代理將權杖以 Authorization: Bearer jgx_agt_… 送往 https://jenksguo.pages.dev 上的 /api/admin/* 或 /mcp/admin(在管理主機上 Access 會阻擋程式)。瀏覽器不會自行送出此標頭,因此惡意頁面無法借用它。
稽核記錄
每一次管理寫入——以及每一次被拒絕的嘗試——都會被記錄:是誰(電子郵件或 agent:<name>)、哪個工具、哪些檔案、分支、主機,以及結果或錯誤。權杖的建立與撤銷也會被記錄。檔案內容永不記錄。Jenks 透過主控台(Access)閱讀記錄;代理僅能讀取自己的項目(admin_audit_log)。Git 歷史仍是內容本身變更的紀錄。
緊急用管理權杖
原始的管理權杖仍可於緊急時使用,但無法建立代理權杖。它存放在 macOS 鑰匙圈中作為 agent-env:JENKSGUO_ADMIN_TOKEN,同時也作為加密的 Worker 密鑰,並以常數時間比較。若可能外洩請立即輪替:在鑰匙圈與 Worker 密鑰中存入新值,舊權杖便會立刻失效。僅供本機開發(localhost 上的 wrangler dev)時,主控台可用它登入:該權杖會一次性交換為 HttpOnly 的工作階段 Cookie。
管理 API 的可及範圍
寫入僅限於內容路徑的允許清單——語料條目、lenses、skills、核心文件、翻譯詞彙表與本說明文件。它不能更動程式碼、工作流程、密鑰或 content/ 之外的任何項目。每次寫入都會先依內容綱要進行驗證。
媒體檔案
透過管理介面上傳的影像、影片與 PDF 會儲存在 Cloudflare R2 儲存貯體,並自 /media/… 提供。它們自上傳起即能以位址公開存取,因此只應放置預期所有訪客都能看的素材。
- 檔案類型以位元組判定,而非名稱,且只接受網頁影像、影片與 PDF 格式(每個 25 MB)。
- 若 SVG 影像含有腳本或事件處理器則會被拒絕,且所有 SVG 都會在內容安全沙箱中提供,即使直接開啟的精心製作 SVG 也無法在本網站執行程式碼。
- 與內容不同,媒體不在 git 中:刪除為永久動作。若已發布內容仍使用該檔案,則會拒絕刪除。
GitHub 存取
管理寫入會透過 GitHub API 轉為提交,使用僅限單一版本庫且權限細緻的個人存取權杖,且只給予發布所需的權限。它以加密的 Worker 密鑰儲存。由於每次變更都是一次提交:
- git 歷史記錄每次變更——變更了什麼、何時、為何(提交訊息;提交尾註會標示代理名稱),
- 永遠可復原——任何檔案的任一舊版都能被還原。
具風險的變更可先在 dev 分支暫存,並於 https://dev.jenksguo.xyz 檢查,之後才進入正式站。
訪客隱私
- 無廣告追蹤器,無行銷 Cookie。
- 聊天記錄僅保存在訪客瀏覽器(
sessionStorage)中,分頁關閉即清除。網站不儲存聊天記錄。 - 聊天訊息會透過 Cloudflare Worker 傳送至 OpenRouter,由其轉送給第三方語言模型。會提醒訪客不要分享敏感個人資訊。
- 在訪客點擊麥克風前語音功能為關閉狀態,並會在十輪互動後或偵測無實際對話時自動關閉。語音輸入在可用時使用瀏覽器內建的語音辨識;否則會將音訊送至 OpenRouter 進行轉寫。語音回覆由 Cloudflare Workers AI(Deepgram Aura-2,英文)或 OpenRouter(其他語言)產生,若不行則退回裝置的語音合成。網站不儲存任何錄音或產生的音訊。
- Cloudflare 會保留標準的請求記錄,用於安全與速率限制。
內容隱私
content/ 底下的一切皆為公開。Jenks 的履歷曾包含電話、住址與推薦人聯絡資訊;這些都不在語料庫中,且永遠不得加入。關於他人的事實僅限於描述 Jenks 角色所必須者。
回報問題
請寄電子郵件至 jenksguo@gmail.com 並附上細節。未經許可請勿測試管理介面。
.md本頁內容在 AI 協助下翻譯;官方職稱保留英文。