Skip to content

fix: access token 过期时鉴权中间件返回 500 而非业务码 401 #153

Description

@huyanxius

问题

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。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions