ddm-refresh-replay
靶子 http://localhost:20098 · 宽限 30s · 账号 e2e_ddm(uid 990864, client_type 20)
A 并发宽限回放
PASS A0 DDM 登录拿到双 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 能过 DDM 鉴权闸(链路本来是通的)
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(actor_type=ddm, alert)
PASS C6 **当前那枚**(没被盗的)refresh token 也一并失效
PASS C7 当前 access token 也失效(吊销生效到访问面)
D 守卫(账号没被锁死)
PASS D1 重放吊销之后仍能重新登录,拿到全新一对 token
PASS D2 新会话的 refresh 正常可用
E 守卫(未知 token 不误伤)
PASS E1 一串 uid 前缀正确、内容瞎编的 token → 被拒
PASS E2 刚建立的会话**没有**被这串垃圾连累吊销
F 异设备宽限重放(SEC-0047)
PASS F0 重新登录建立干净会话
PASS F1 DEV1 首次 refresh 成功(宽限记录落在 DEV1 名下)
PASS F2 🔴 宽限期内换台设备拿旧 token → **拿不到**令牌对
PASS F3 响应里没有 access_token
PASS F4 响应里没有 refresh_token
PASS F5 落进重放检测:会话已被吊销(证明它没有走宽限那条 return)
PASS F6 本组新产生 1 条 security_token_replay 告警(只认本组开始后的新行)
PASS F7 被盗后连**没被盗的那枚**也一并失效(吊销是账号级)
PASS F8 收尾:重新登录,不把 e2e_ddm 留在吊销态
✅ PASS=30 FAIL=0