feat(oauth): 账号名改从 zone.account 取,去掉 account-settings.read 依赖

实测确认 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 两种断言)
This commit is contained in:
bigcode
2026-09-30 17:03:59 +08:00
parent 7a1625d575
commit 5b887908e2
8 changed files with 82 additions and 88 deletions
-4
View File
@@ -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<OAuthPreflightResult>("/api/oauth/cloudflare/preflight");
@@ -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 是<b>点号分隔</b>(zone.read),冒号写法(zone:read)是 wrangler 的
第一方简写,第三方客户端会被判 invalid_scope。必须与 OAuth App 里勾选的权限一致;检测按钮会
直接告诉你哪些已授权、哪些还要补勾。<b>account-settings.read 是可选的</b>:勾了才显示真实账号名,
不勾则用第一个域名代替,不影响接入。
直接告诉你哪些已授权、哪些还要补勾。三项就够:账号名随 zone 一起返回,不需要账号级权限。
</>
}
>
@@ -449,15 +447,6 @@ function CloudflareTab({ info, onSaved }: { info: SettingsInfo; onSaved: () => v
>
填入最小 scope
</Button>
<Button
size="small"
onClick={() => {
form.setFieldValue("scope", CF_OAUTH_SCOPES_WITH_ACCOUNT_NAME);
message.success("已填入含账号名权限的 scope(需 App 里也勾了 Account Settings Read)");
}}
>
含账号名权限
</Button>
{check.scopes.allowed.length > 0 && (
<Button
size="small"