From 5b887908e23333a80475c2d3cc5487177d13d6f7 Mon Sep 17 00:00:00 2001 From: bigcode Date: Wed, 30 Sep 2026 17:03:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(oauth):=20=E8=B4=A6=E5=8F=B7=E5=90=8D?= =?UTF-8?q?=E6=94=B9=E4=BB=8E=20zone.account=20=E5=8F=96,=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=20account-settings.read=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实测确认 GET /zones 每个 zone 自带 account {id,name},该接口只需 zone.read, 因此账号 id 与账号名都不必再调 GET /accounts(account-settings.read)。 顺带修掉 account_id 旧字段在当前响应里已为 null 导致的降级路径取不到账号 id。 - RealCFApi.discover 只列 /zones,移除 listAccounts 与 accountSource - scope 候选集去掉 account-settings.read;设置页移除「含账号名权限」按钮 - 设置页 Scope 说明与 docs/02、README 同步(补 User Details Read 的区别说明) - 85/85 测试通过(新增 zone 带 account / 不带 account 两种断言) --- README.md | 2 +- console/frontend/src/api.ts | 4 -- .../frontend/src/components/SettingsModal.tsx | 13 +---- console/src/services/cfapi.ts | 42 ++++++--------- docs/02_CLOUDFLARE_OAUTH.md | 29 +++++++---- package.json | 2 +- tests/cf-mock.ts | 27 +++------- tests/oauth.test.ts | 51 ++++++++++++++----- 8 files changed, 82 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 2e75b0d..e1a0565 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ WmailHub/ - **Redirect URL**:`https://wmailhub.adx9.com/api/oauth/cloudflare/callback` - **Client URI**:`https://wmailhub.adx9.com`(必须是 Console 站点域名),并按提示加 TXT 记录完成域名校验 - **Promote to public**:私有 App 无法被授权 - - **Scopes**(`zone.read` / `workers-scripts.write` / `email-routing-rule.write` / `account-settings.read`):**点号分隔**,冒号写法(`account:read`)是 wrangler 的第一方简写,第三方 client 会被拒;缺 `account-settings.read` 也能接入(自动从域名反推账号) + - **Scopes**(`zone.read` / `workers-scripts.write` / `email-routing-rule.write`):**点号分隔**,冒号写法(`account:read`)是 wrangler 的第一方简写,第三方 client 会被拒;这三项就够,账号 id 与账号名随 `GET /zones` 的每个 zone 一起返回,不需要账号级权限 配好后到设置页点「检测授权配置」确认,再点账号页「添加账号」。Client ID / Secret 有两个配置位置,任一即可: - **推荐**:部署后登录 Console → 设置 →「Cloudflare 接入」填写,Secret 加密入库,改完立即生效,以后换 client 也不用重新部署; diff --git a/console/frontend/src/api.ts b/console/frontend/src/api.ts index cc03c51..f845357 100644 --- a/console/frontend/src/api.ts +++ b/console/frontend/src/api.ts @@ -337,10 +337,6 @@ export interface OAuthPreflightResult { /** 本应用默认需要的 scope(点号分隔)——与后端 CF_OAUTH_SCOPES_DEFAULT 保持一致 */ export const CF_OAUTH_SCOPES_DEFAULT = "zone.read workers-scripts.write email-routing-rule.write"; -/** 可选:勾了 Account Settings Read 才能显示真实账号名,否则用第一个域名代替 */ -export const CF_OAUTH_SCOPES_WITH_ACCOUNT_NAME = - "account-settings.read zone.read workers-scripts.write email-routing-rule.write"; - /** 授权配置自检:探测 Cloudflare 授权端点是否接受当前配置(不产生授权) */ export const oauthPreflight = () => api("/api/oauth/cloudflare/preflight"); diff --git a/console/frontend/src/components/SettingsModal.tsx b/console/frontend/src/components/SettingsModal.tsx index bfac1e9..216a703 100644 --- a/console/frontend/src/components/SettingsModal.tsx +++ b/console/frontend/src/components/SettingsModal.tsx @@ -38,7 +38,6 @@ import { oauthPreflight, putSettings, CF_OAUTH_SCOPES_DEFAULT, - CF_OAUTH_SCOPES_WITH_ACCOUNT_NAME, type OAuthPreflightResult, type SettingsInfo, } from "../api.ts"; @@ -391,8 +390,7 @@ function CloudflareTab({ info, onSaved }: { info: SettingsInfo; onSaved: () => v <> Cloudflare 的 OAuth scope 是点号分隔(zone.read),冒号写法(zone:read)是 wrangler 的 第一方简写,第三方客户端会被判 invalid_scope。必须与 OAuth App 里勾选的权限一致;检测按钮会 - 直接告诉你哪些已授权、哪些还要补勾。account-settings.read 是可选的:勾了才显示真实账号名, - 不勾则用第一个域名代替,不影响接入。 + 直接告诉你哪些已授权、哪些还要补勾。三项就够:账号名随 zone 一起返回,不需要账号级权限。 } > @@ -449,15 +447,6 @@ function CloudflareTab({ info, onSaved }: { info: SettingsInfo; onSaved: () => v > 填入最小 scope - {check.scopes.allowed.length > 0 && (