问题
AuthMiddleware.dispatch 在解码 token 时调用 decode_token,而 decode_token 对过期 token 抛出 BizException("token 已过期", code=BizCode.UNAUTHORIZED),dispatch 没有捕获它。
issue #146 的安全修复表已经记录过这一类问题:middleware 层抛出的 BizException 会跳过 ExceptionMiddleware,最终返回 500 而不是业务码。中间件里为此准备了 _biz_error 辅助函数,但它目前只用在「未登录」与「token 类型错误」两个分支上,decode_token 抛出的异常没有走这条路。
access token 有效期是 15 分钟,过期是正常使用中最高频的一条路径。前端依赖 code=401 判断登录失效并触发静默续期,如果收到的是 500,续期不会发生,用户每 15 分钟被登出一次。
这一条是阅读代码得出的结论,没有实际运行验证,请在修复时一并确认。
目标
token 过期与 token 无效两种情况,都返回 HTTP 200 加 code=401 的业务响应,与「未登录」分支保持一致。
范围
只涉及 web/middleware/auth.py 的异常处理。不改 token 有效期,不改刷新流程,不改白名单。
验收标准
- 携带已过期 access token 请求任一需鉴权端点,响应为 HTTP 200,
code 为 401,message 能区分「已过期」与「无效」。
- 补充对应测试用例,覆盖过期与签名无效两种 token。
问题
AuthMiddleware.dispatch在解码 token 时调用decode_token,而decode_token对过期 token 抛出BizException("token 已过期", code=BizCode.UNAUTHORIZED),dispatch没有捕获它。issue #146 的安全修复表已经记录过这一类问题:middleware 层抛出的
BizException会跳过ExceptionMiddleware,最终返回 500 而不是业务码。中间件里为此准备了_biz_error辅助函数,但它目前只用在「未登录」与「token 类型错误」两个分支上,decode_token抛出的异常没有走这条路。access token 有效期是 15 分钟,过期是正常使用中最高频的一条路径。前端依赖
code=401判断登录失效并触发静默续期,如果收到的是 500,续期不会发生,用户每 15 分钟被登出一次。这一条是阅读代码得出的结论,没有实际运行验证,请在修复时一并确认。
目标
token 过期与 token 无效两种情况,都返回 HTTP 200 加
code=401的业务响应,与「未登录」分支保持一致。范围
只涉及
web/middleware/auth.py的异常处理。不改 token 有效期,不改刷新流程,不改白名单。验收标准
code为 401,message能区分「已过期」与「无效」。