Skip to content

Runbook:401、403 与 OAuth 失效

401/403 可能发生在 Sub2API 入口,也可能来自上游。两者处理方式完全不同,必须先看错误的 phase、owner、source 和 account_id。

如果是管理员网页登录失败,先确认数据库中的管理员记录。部署变量 ADMIN_PASSWORD 只参与首次初始化,容器重启后不会覆盖 users.password_hash,详见启动、配置与事实来源

入口 401/403

表现:请求通常还没有 account_id 或 upstream endpoint。

检查:

  • 客户端是否传入 Sub2API Key,而不是上游 Key。
  • Authorization 格式和 Base URL 是否指向正确实例。
  • Key 是否禁用、过期、删除或 IP 受限。
  • 用户是否 active,是否还有余额/订阅/平台 quota。
  • Key 绑定 Group 和用户授权是否一致。
  • 多实例 API Key L1/L2 缓存是否已失效。

处理:修正客户端或用户/Key 配置。不要刷新上游 OAuth,因为请求尚未到达上游。

上游 401/403:API Key 账号

表现:错误详情有 account_id、upstream endpoint 和 provider/upstream 归因。

检查:

  • Key 是否在供应商后台被撤销、过期或限制项目。
  • Base URL 是否属于该 Key 的服务。
  • 账号级 Header override 是否覆盖了 Authorization/x-api-key。
  • URL allowlist、Proxy 或 WAF 是否返回伪装的 403。
  • 模型是否需要额外项目权限。

处理流程:关闭调度 → 在供应商侧验证/新建 Key → 新账号测试 → 灰度加入生产 → 撤销旧 Key。

OAuth 401/403

检查:

  • access token 过期时间。
  • refresh token 是否存在、是否 rotation 失效。
  • account/project ID 和 plan 是否变化。
  • 多实例 Redis 锁是否工作。
  • Proxy 地区、设备或上游风控是否变化。
  • 最近刷新日志和 job heartbeat。

推荐动作:

  1. schedulable=false,防止持续失败。
  2. 保存第一次失败的错误和 token 元数据,禁止复制明文 token 到工单。
  3. 尝试后台 Refresh;失败时走 Re-Auth/OAuth。
  4. 账号测试通过后使用 Recover State,使旧 token 缓存失效。
  5. 恢复调度并观察一个刷新周期。

403 不一定是凭证错误

还可能是:

  • 模型/区域无权限。
  • 上游内容策略或账户风控。
  • Cloudflare/WAF/Proxy 拒绝。
  • privacy/训练退出要求不满足。
  • 客户端类型或最低版本策略。
  • URL allowlist 拒绝自定义上游。

看上游响应 body、request ID 和 error owner 后再决定是否换 Key。

批量 401 的处理

如果多个账号同时 401:

  • 先查共同 Base URL、Proxy、上游项目和最近批量变更。
  • 不要逐个清错制造请求风暴。
  • 保留一两个账号做隔离测试,其余先摘流。
  • 若是共享 OAuth client/secret 变化,先修复全局配置。
  • 若疑似泄漏,按安全事件轮换并审计访问。

验收

  • 新 token/Key 完成真实请求。
  • 旧凭证已撤销或明确保留到切换结束。
  • token refresh heartbeat 正常。
  • 账号没有立即再次进入 error/temp unscheduled。
  • 错误日志中不再出现同一 account 的上游 401/403。

本文档用于帮助你理解、部署和运维 Sub2API。使用前请确认上游服务条款与当地法律要求。