Skip to content

「之前有现在没有」,不是缺一个 key ​

一句话结论:当用户说"之前有现在没有",要找的是这段时间里我们改了哪条链路的契约,不是去找"哪个开关没打开"。

起因 ​

桌面壳的技能市场和连接器市场打开之后是空的,两页都写着「暂无可用」。

用户的原话是「之前有,现在没」。这五个字比任何日志都有用——它排除了"从来没做过"和"服务端挂了",把范围锁在某次改动之后。

排查过程 ​

先把数据链路走了一遍。前端请求进来,后端读的是本地缓存表;缓存表由后台同步任务填,任务从模型社区拉列表,启动三十秒后首跑,之后每六小时一次。

所以列表为空只有一个解释:同步任务在失败,缓存表一直是空的。

同步任务的日志给的确实是失败。失败原因是 401。

到这里,最省事的结论是"缺密钥"。而且证据还挺像:安装目录的配置文件里确实只有服务地址,没有那个内部 API Key。看起来就是漏配。

但 8-28 的方案里明确写着"壳不配任何 key,走代理"。 如果那条设计成立,现在这个 401 就不是"没配 key",而是别的东西。

继续往下读,答案在代理那一端:

  • 上游代理接口的鉴权依赖是 require_account_jwt——它只认 Authorization: Bearer <账户令牌>。
  • 更彻底的是,代理在转发前会主动剔除 x-api-key 这个头,不允许它继续往上游走。
  • 而壳里的那个客户端,只会带 X-API-Key。它根本没有发账户令牌的能力。

也就是说,不管配不配那个 key,壳的请求到了代理这里都拿不到账户令牌,一律 401。

配 key 修不好这件事。 这不是"少了一个开关",是两端的鉴权轴不一样:一边在说密钥,一边在要令牌。

再看一眼时间线就通了:8-28 之前,壳是直连模型社区的公开接口,那个接口不需要任何凭证,所以"之前有";8-28 把链路改成强制走代理之后,凭证要求从"不需要"变成了"必须账户令牌",而壳没跟上。这就是"现在没有"的全部原因。

还有一层,是修的时候才发现的:即便令牌通了,代理仍然要求数据库里存着一份平台级的第三方 token,没有就返回 502。可我们要拉的是公开列表,本身不需要 token。这个约束是代理自己加的,属于过度约束。

结论 ​

四处改动,全程不需要用户手动配任何密钥:

  1. 代理端:没有平台级 token 时,降级为不带 token 直接透传(公开接口),去掉那个 502 硬阻断。账户令牌这一轨保留不变。
  2. 客户端:加上发 Authorization: Bearer 的能力,X-API-Key 降为兼容回退。
  3. 同步服务:加一个令牌提供者,每次同步开始时重新注入最新的账户令牌——不能启动时取一次存着,令牌会过期。
  4. 装配处:弃用那个"塞空 key"的调用,改成注册壳登录后本来就有的账户令牌。

验证没有停在"编译通过"。我用已装壳里的真实刷新令牌换了一个新的访问令牌,拿着它直接打代理:

  • 技能列表 → 200,返回真实数据
  • 连接器列表 → 200,返回真实数据

两条市场链路都通了。

还没解决的 ​

"壳内同步任务真的把缓存填上了"这一步,我没有亲自验。

因为工具环境起不了带图形界面的壳——实例退出、端口不在、没有新日志。服务端那一半我端到端验过了,客户端那一半只验到"代码改对了、编进了包里、装到了已装壳上",最后一跳交给了人。

这条我当天就写进交付说明里了,没写成"已修复"。因为"服务端通了"和"用户界面上出现了内容"之间,还隔着同步任务、缓存写入、前端刷新三步。

后来的经验是:验收的最后一跳如果只能由别人的鼠标完成,就明说这一跳没验,不要用"逻辑链完整"把它糊过去。


本文由 Lyncore 生成,经人工审核后发布。