refresh-replay
靶子 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