Skip to content

[Bug]: AuthFiles 页面因不稳定 OAuth loader 回调陷入无限请求循环 #412

Description

@Zker67

问题类型

前端显示或交互异常

部署方式

完整 Docker 方案

CPA 版本

v7.2.92(API commit: 53c1e7e2

CPA Manager Plus 版本

当前 main,commit 1a622d86(PR #410

问题描述

打开 /dashboard#/auth-files 后,认证文件列表会与“加载中…”状态持续交替闪烁,OAuth 模型禁用和 OAuth 模型别名区域也会反复进入 loading。

Network 面板显示以下三个接口持续循环请求:

  • GET /v0/management/auth-files
  • GET /v0/management/oauth-excluded-models
  • GET /v0/management/oauth-model-alias

一次复现中,约 5.956 秒产生 391 个 GET 请求(约 65.6 req/s)

Endpoint Requests
oauth-model-alias 131
auth-files 130
oauth-excluded-models 130

所有接口均返回 200,Console 没有 exception,所以页面不会自行退出循环。

预期行为:进入 AuthFiles 页面时三个初始化接口各请求一次;请求完成后页面保持稳定,除非用户手动刷新或正常轮询触发。

根因定位

回归由提交 f5996d4c 引入。

useAuthFilesOauth.tsx 原先直接返回稳定的 useCallback

loadExcluded,
loadModelAlias,

该提交改成了每次 render 都会创建新引用的包装函数:

loadExcluded: () => loadExcluded(),
loadModelAlias: () => loadModelAlias(),

AuthFilesPage.tsx 的初始化 effect 将它们作为依赖:

useEffect(() => {
  if (!isCurrentLayer) return;
  loadFiles();
  loadExcluded();
  loadModelAlias();
}, [isCurrentLayer, loadFiles, loadExcluded, loadModelAlias]);

形成 loader 请求完成 → setState → render → loader 引用变化 → effect 再执行 的循环。由于请求异步完成,不会触发同步的 React “Maximum update depth exceeded”。

本地集成中的两个相关源码 blob 已与上游 1a622d86 做对象级比较,结果均为 diff exit=0;根级构建兼容补丁也不修改这些 hook 或 endpoint。

建议直接恢复稳定 callback:

return {
  // ...
  loadExcluded,
  loadModelAlias,
  // ...
};

并增加回归测试:挂载页面并完成首次 loader 后,三个初始化接口仍应各调用一次,两个 loader 引用在普通 rerender 后保持稳定。

复现步骤

  1. 使用 CPA Manager Plus 1a622d86 构建管理页面。
  2. 通过 Dashboard 登录 CPA。
  3. 打开 #/auth-files
  4. 观察认证文件列表、“OAuth 模型禁用”和“OAuth 模型别名”区域。
  5. 在 Network 面板过滤 auth-filesoauth-excluded-modelsoauth-model-alias
  6. 可以看到三个接口持续重复请求,页面反复切换 loading 状态。

关键配置

deployment: full-docker
management_ui: bundled-cpa-manager-plus
management_ui_commit: 1a622d86
cpa_version: v7.2.92
cpa_api_commit: 53c1e7e2
cpa_image: ghcr.io/indieark/cli-proxy-api:latest
reverse_proxy: nginx
manager_server_involved: false
affected_route: /dashboard#/auth-files

Management Key、认证文件、账号和 token 均已脱敏且与复现无关。

/status 返回内容

{
  "applicable": false,
  "reason": "This is a bundled frontend React effect loop. Manager Server, request monitoring collector, and Docker networking are not involved."
}

日志

GET /v0/management/auth-files status=200
GET /v0/management/oauth-excluded-models status=200
GET /v0/management/oauth-model-alias status=200

Observed window: 5.956 seconds
Total GET requests: 391
Request rate: 65.6 req/s
Console exceptions: 0
Failed requests: 0
Observed write requests (PATCH/PUT/DELETE): 0

没有发现数据损坏证据;当前主要影响是页面不可用、服务端请求负载和日志快速增长。

截图

页面在以下两种状态之间持续切换,难以截取稳定画面:

  1. 正常认证文件卡片短暂出现。
  2. 卡片消失,列表及两个 OAuth 配置区域显示“加载中…”。

Network 请求统计和根因代码已在上文提供,可稳定复现。

检查清单

  • 我已经搜索过现有 Issues,没有找到重复问题
  • 我已经确认敏感信息已经脱敏,例如 token、key、账号信息

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions