Skip to content

v1.8.1 — 一个过期的登录状态,不再拖着整个池子陪跑

Choose a tag to compare

@XDTrees XDTrees released this 08 Oct 02:20
· 16 commits to main since this release

有人的卡片上,好几个账号下面顶着一大段红色英文,大意是「上游不认这个登录了,去桌面端重新登录」。话说得没错,可问题是:它只说了结论,没解决过程——那几个账号明明已经废了,每次请求还是要挨个撞一遍,撞得头破血流,旁边几个好端端的账号一次都轮不上。

事情是怎么变成这样的

上游吊销一个登录状态时,不会顺手把凭据文件里的过期时间改掉。于是本机留着一份「看起来还有效」的凭据:过期时间写着 11 月 4 日,今天才 10 月,一切正常。

插件就信了。它把这三个账号当成健康账号,按顺序一个一个试:

  1. 拿账号 A 去请求,上游回 401;
  2. 插件想「可能是 token 过期了」,于是刷新 token;
  3. 上游回答「这个 refresh token 早就没了」(invalid_grant: Offline user session not found);
  4. 插件刷新失败,但没有记仇,转头又拿 A 去试;
  5. 八次重试名额(maxAttempts)就这么全喂给了同一个死账号,健康账号一次都没被碰过。

所以现象是「明明还有能用的账号,请求却一直失败」,外加卡片上一片红。

现在怎么处理

给账号加了第三种状态:判死(前两种是「正常」和「限流冷却」)。

  • 只有上游亲口说死才算死。 判据是 invalid_grant / Offline user session not found 这类明确答复。网络超时、DNS 抽风、5xx 一律不算——否则一次网络抖动就会把好账号关进小黑屋半小时,那比原来的 bug 还难查。
  • 判死的账号立刻退出轮换,不再参与 acquire 的选择,请求当场换健康账号继续,不用等到八次重试耗尽。
  • 想复活有两条路:在 WorkBuddy 桌面端重新登录该账号(插件发现 refresh token 变了,自动放行),或者点卡片上的「清除所有冷却」手动再给它一次机会。
  • 全池都死了的时候,返回的不再是含含糊糊的「你还没登录」,而是 401 session_dead:N/M WorkBuddy account(s) for this gateway were rejected by the upstream (their sign-in was revoked); sign in again in the WorkBuddy desktop app to restore them。「等待」和「重新登录」是两种完全不同的处置方式,不能混着报。

卡片上的红字也收拾了一下

  • 原来那段整段英文报错直接铺在「积分包」面板里,把面板撑得老长,右边的「合计」都被挤出屏幕。现在折叠成一个红色小标「登录已被拒绝」,鼠标悬停才显示原文。
  • 账号行上加了红色的「登录已被拒绝」标签,下面补一句「请在 WorkBuddy 桌面端重新登录该账号以恢复」——红色是故意的,用琥珀色会让人以为「等一会儿就好」,而这个状态等多久都不会好。
  • 判死的账号不再参与卡片刷新时的积分 / 签到探测。以前每刷新一次卡片,就对每个死账号白打两个必定 401 的请求,刷新越勤越热闹。

已知边界

  • 判死状态记在内存里,重启后重新判定。也就是说重启后的第一次请求还会再试一次那个账号,然后才把它请出去——这一次的代价是必要的,否则「重启一下就好了」的临时故障会被误判成永久失效。
  • 国际版每日签到活动(checkin-activity-status)实测当前是 active: false,所以「多账号自动领 30 积分」目前没有可领的东西;国内版的活动是正常的,逐账号领取的链路本来就有。