Files
wmailhub/docs/02_CLOUDFLARE_OAUTH.md
T
bigcode 3be6e483b4 feat: v2.3.0 设置内配置 Cloudflare OAuth 客户端 + 全列表批量删除
- 设置新增「Cloudflare 接入」tab:Client ID / Client Secret(Secret AES-GCM 加密入库,
  只回显末 4 位),并展示可复制的授权回调地址;settings 优先、env 变量兜底,
  保存后立即生效无需重新部署;DELETE /api/settings/cf-oauth 清除
- 四个资源列表(账号/域名/邮箱/收件箱)加复选框批量选择与批量删除
- 新增 POST /api/{accounts,domains,mailboxes,emails}/batch-delete:
  账号软删+撤销凭据;域名/邮箱级联删除其下邮件;邮件连 R2 原文与附件一并清理
- 抽出 deleteEmailById / deleteEmailsByMailbox / revokeAccount 供单条与批量共用
- 点击复选框不再触发行点击(避免误开详情抽屉)
- 新增 tests/batch.test.ts(6 例)与 settings OAuth 凭据用例(2 例);ui-smoke 扩到 17 步
2026-09-30 15:53:18 +08:00

2.1 KiB

Cloudflare OAuth 与自动接入(docs/11 §14)

旧「Add Node」概念已删除,改为 Connect Cloudflare Account。

流程

Console
   |
   v
Cloudflare OAuth
   |
   v
用户授权 Account
   |
   v
Console
   +-- 保存 Account
   +-- Account / Zone 发现
   +-- 配置 Domain(同步账号下全部域名,pending)
   +-- 创建 catch-all Mailbox
   +-- 部署账号级 Email Worker
   +-- 签发 WorkerCredential(secret 注入 Worker 脚本)

用户不需要执行安装命令,也不手工创建 API Token。

安全

  • Cloudflare credential(OAuth access token)AES-GCM 加密存储,不进入前端和日志。
  • OAuth state 一次性(用后即删)、5 分钟过期、绑定账号(CSRF 防护)。
  • 授权回调不校验会话:浏览器从 dash.cloudflare.com 跳回 Console 属于跨站顶级导航,SameSite=Strict 的会话 cookie 不会携带;该端点由一次性 state 承担 CSRF 防护,其余 /api/oauth/* 仍要求登录。
  • Account ownership 以 token 实际可访问的 accounts 为准。
  • 安装过程幂等,重复执行不产生重复资源。
  • Worker credential 与 Cloudflare credential 分离;轮换 credential 后已配置域名自动重新部署。

前置条件:OAuth 客户端凭据

授权所需的 Client ID / Secret 有两个来源,settings 表优先、env 兜底:

来源 配置位置 说明
settings(优先) Console「设置 → Cloudflare 接入」 Secret 以 AES-GCM 密文存 settings.cf_oauth_client_secret_enc,只回显末 4 位;保存后立即生效,无需重新部署。清除走 DELETE /api/settings/cf-oauth
env(兜底) CF_OAUTH_CLIENT_ID / CF_OAUTH_CLIENT_SECRET 部署时注入;settings 未配置或密文损坏时使用

两个来源都没有时,/api/oauth/cloudflare/start 与 /api/oauth/cloudflare/callback 一律返回 503 —— 系统不提供任何模拟/降级通道,不会出现"看起来接入成功"的假账号与假资源。 GET /api/settings 会返回 cf_oauth.source(settings / env / none)与 redirect_uri(需在 Cloudflare Dashboard 登记的回调地址),GET /api/oauth/mode 返回 source 供账号页判断。