fix: 应用 xhigh 代码评审的跨端修复
ci / server (push) Failing after 13s
ci / design-tokens (push) Failing after 11s

来自 xhigh code review 的正确性/健壮性修复,覆盖全部五端:
- server:鉴权 fail-closed、计量交叉校验与配额扣穿处理、WS 网关并发与关闭顺序、
  billing 行锁、redis Lua 过期与设备槽刷新、config 解析
- desktop:会话 epoch 防串话、WS 重连与 401 处理、api 客户端复用、统一 usePoll 轮询
- android:握手时序、请求头封装、账户状态派生、按需重组
- ios:finalize 宽限、串行采集、错误文案服务端优先、删除死代码 CommitController

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-13 11:50:08 +08:00
parent 50b49f3cbe
commit b5ab92a57e
42 changed files with 2125 additions and 469 deletions
+9 -1
View File
@@ -131,8 +131,16 @@ func (h *Handlers) MobileLogin(c *gin.Context) {
}
// Logout POST /v1/auth/logout(需登录)
// 拉黑到 token 真实自然过期时间(中间件解析后存于 CtxExpires),确保即便
// JWT_TTL_HOURS 配得很大,注销 token 也不会在固定窗口后复活(17B)。
func (h *Handlers) Logout(c *gin.Context) {
jti := c.GetString(CtxJTI)
_ = h.JWT.Revoke(c, jti, time.Now().Add(8*24*time.Hour)) // 覆盖最长 TTL
exp, _ := c.Get(CtxExpires)
expiresAt, _ := exp.(time.Time)
if expiresAt.IsZero() {
// 兜底:claims 未带 exp(理论上不会发生),按当前配置 TTL 估一个上界。
expiresAt = time.Now().Add(time.Duration(h.JWT.ttl))
}
_ = h.JWT.Revoke(c, jti, expiresAt)
c.Status(http.StatusNoContent)
}