月饮沙/AI

DINGDONG / 开发记录

登录成功,为什么请求仍返回 JWT 422?

一个通用的 HTTP 状态码,可能掩盖完全不同的失败阶段。先找到请求停在哪里,再决定哪些重试是安全的。

技术复盘 · 时间一致性与重试边界 · 内容更新

01背景与现象

告警诊断需要先登录检查服务,再调用受保护的只读接口。登录正常,但紧接着的请求间歇返回 HTTP 422。原先客户端只有通用错误提示,无法区分参数校验、鉴权还是实际执行失败。

本文从实践记录中提炼排查方法,省略具体环境、事件时间与运行数据,不描述当前系统的修复状态。下面的响应是仅保留错误语义的模拟示例。

HTTP 422
{"msg": "The token is not yet valid (iat)"}

02排查证据

排查沿着“登录 → 鉴权 → 业务提交 → 执行记录”划分阶段,避免仅根据 422 推断参数错误。

  • 区分登录成功与后续请求通过鉴权,保留具体错误语义。
  • 比对 Token 时间字段与各节点时间,检查时间判断是否一致。
  • 结合执行记录判断失败是否发生在业务提交之前。
  • 对比成功与失败请求,逐步缩小排查范围。

代理返回的 HTTP 时间头不能代替后端节点的时钟核查,有限样本也不能用于推断长期可用率。

03根因

JWT 的签发时间、生效时间与校验节点的时钟共同影响鉴权结果。节点时间或校验规则不一致时,同一个 Token 可能被不同节点作出不同判断。

客户端若遗漏错误消息字段,还会把具体鉴权原因隐藏在通用提示之后。时间一致性与错误可观测性需要分别检查。

04处理与临时缓解

先受限地提取错误消息,再判断是否具备安全重试的条件。只有确认属于特定时间校验错误、且请求尚未进入业务处理时,才考虑有上限的延迟重试。

重试次数和等待策略应结合具体系统验证,不能把这套方法扩大成所有 POST 或所有 422 的通用重试。

重试只能提供有限缓解。处理根因仍需检查节点时间同步、JWT 校验规则与组件行为,不能用重试成功代替一致性验证。

05验证

实践记录中的只读样本验证支持精确错误识别与有限重试的缓解效果。该结论仅覆盖已验证的请求,不代表所有节点或业务流程。

验证应分别覆盖错误分类、重试上限和业务请求是否被重复提交;根因处理的效果需要单独核验。

06剩余问题

达到重试上限时,应保留明确失败原因,交由人工排查。涉及业务副作用的请求,还需要独立检查幂等性与重复执行风险。

本文总结排查与验证方法,不据有限样本推断具体系统的当前状态。