refresh-replay

20260916-201504 轮 · 看它的历史
靶子 http://localhost:20098 · 容器 wt_h8_tp8 · 宽限 30s · 账号 e2e_bot(uid 990863)

A 并发宽限回放
  PASS A0 登录拿到双 token
  PASS A1 首次 refresh 成功
  PASS A2 refresh_token 确实被轮换了(新 ≠ 旧)
  PASS A3 宽限期内用同一枚旧 token 再来一次 —— 没被判成重放
  PASS A4 refresh_token 与首次逐字相同(= 回放,不是再轮换一次)
  PASS A5 access_token 与首次逐字相同
  PASS A6 DB 里 ss_prev_refresh_token_hash == sha256(被换掉的那枚)

B 守卫(设备绑定 / 当前会话活着)
  PASS B1 换一台设备用**当前** refresh token → 被拒
  PASS B2 拒绝码是 AUTH_REFRESH_INVALID
  PASS B3 吊销前:当前 access token 能换出 web ticket(证明这条链路本来是通的)

C 出宽限期后重放(等待 33s)
  PASS C1 出宽限期后再用那枚旧 token → 被拒
  PASS C2 拒绝码是 AUTH_REFRESH_INVALID
  PASS C3 该用户的会话行已被吊销(ss_revoked_at 非空)
  PASS C4 access / refresh / prev 三个 hash 全部清空
  PASS C5 jnc_sys_log 恰好 1 条 security_token_replay(alert)审计
  PASS C6 **当前那枚**(没被盗的)refresh token 也一并失效
  PASS C7 当前 access token 也失效(吊销确实生效到访问面)

D 守卫(账号没被锁死)
  PASS D1 重放吊销之后仍能重新登录,拿到全新一对 token
  PASS D2 新会话的 refresh 正常可用

E 守卫(未知 token 不误伤)
  PASS E1 一串没见过的 token → 被拒
  PASS E2 刚建立的会话**没有**被这串垃圾连累吊销

✅ PASS=21 FAIL=0