date -u +%s
curl -sI https://api.example.com/ping | grep -i '^date'

防重放上线当天安卓端大面积报 请求已过期,同一批用户换网页端完全正常,服务端日志里两边的差值稳定在三百到四百秒之间。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:校验窗口只给了两分钟,客户端设备没跟网络对时,误差直接落到窗口外面,服务端只比较差值不看来源,正常请求就被当成重放拦掉。

「时间戳防重放误伤」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:窗口放宽到五分钟,再按接口敏感程度做分级处理;响应头里带上服务端时间,客户端据此校正自己的偏移;超出窗口的请求返回专门的错误码,不要统一按 401 处理。

确认没问题再收工,偏差六分钟的设备也能通过,超窗十分钟的请求仍然被拒绝。

作者 9823189