fix: v2.3.1 Cloudflare OAuth scope 点号格式 + 授权失败可读提示 + 配置自检
- 根因:Cloudflare OAuth 的 scope 是点号分隔(account.read),冒号写法不被接受, 授权端点直接返回 error=invalid_scope。默认 scope 改为 account.read zone.read email_routing.write workers_scripts.write - scope 可在设置页自定义(settings.cf_oauth_scopes),需与 App 登记值逐字一致 - 新增 GET /api/oauth/cloudflare/preflight + 设置页「检测授权配置」按钮: 只读探测授权端点(不跟随跳转),区分 登录同意页 / 弹回回调 / Cloudflare /oauth/error, 并把 invalid_scope、invalid_request 翻译成可执行的处置建议 - 回调端点处理 error 参数:不再拿空 code 去兑换 token,改为跳回账号页并弹窗说明原因 (此前会落到 SPA 404 空壳页) - 账号页读取 ?oauth_error= 弹窗展示 Cloudflare 的原始描述 - docs/02 补 Cloudflare OAuth App 配置清单(Redirect URL / Client URI 域名校验 / Promote to public / 点号 scope);83 个测试全通过
This commit is contained in:
@@ -68,6 +68,25 @@ export function AccountsPage() {
|
||||
|
||||
useEffect(() => {
|
||||
void load();
|
||||
// 授权被 Cloudflare 拒绝时回调会带 ?oauth_error=...,把原因直接显示出来
|
||||
const oauthError = params.get("oauth_error");
|
||||
if (oauthError) {
|
||||
const detailText = params.get("oauth_error_description") ?? "";
|
||||
modal.info({
|
||||
title: `Cloudflare 授权未完成(${oauthError})`,
|
||||
content: (
|
||||
<div>
|
||||
<p style={{ marginBottom: 8 }}>{detailText || "Cloudflare 拒绝了本次授权请求。"}</p>
|
||||
<p className="muted" style={{ marginBottom: 0 }}>
|
||||
常见原因:OAuth App 未 promote to public、Client URI 域名未校验、
|
||||
或 App 中登记的 scope 与本应用请求的不一致(需点号分隔)。
|
||||
到「设置 → Cloudflare 接入」点「检测授权配置」可看到具体原因。
|
||||
</p>
|
||||
</div>
|
||||
),
|
||||
});
|
||||
return;
|
||||
}
|
||||
// OAuth 回调携带 ?provision=<id> 时自动打开详情
|
||||
const provisionId = params.get("provision");
|
||||
if (provisionId) {
|
||||
|
||||
Reference in New Issue
Block a user