Skip to content

054. 刷新 Token、当前用户与认证测试

学习目标

这一节补齐认证流程里的刷新 token、当前用户接口和测试。

学完后,你应该能理解:

  • access token 过期后如何刷新;
  • refresh token 过期后为什么要重新登录;
  • 当前用户接口为什么既可以支持 GET 也可以支持 POST;
  • Swagger 文档如何识别认证接口;
  • 如何封装当前用户注入函数;
  • 注册接口测试要覆盖哪些失败场景。

刷新 token 流程

access token 有效期较短。

前端发现它快过期时,会用 refresh token 调刷新接口。

刷新成功后,后端返回新的 access token。

如果 refresh token 也过期,前端就不能继续自动续期,需要回到登录页。

这个流程可以避免用户频繁登录,同时保留安全边界。

前端刷新节奏

前端不会等 token 真正过期才刷新。

它会根据后端返回的前端过期时间,提前发起刷新请求。

测试时可以把过期时间设置得很短,观察前端是否会自动请求刷新接口。

当 refresh token 最终过期后,页面应该回到登录页。

当前用户接口

当前用户接口用于获取登录用户信息。

它会从请求头里拿 token,解码后查询用户,再返回公开用户结构。

前端进入页面后,可以调用这个接口恢复登录用户状态。

如果 token 无效,就返回 401。

同时支持 GET 和 POST

有些前端调用习惯用 GET 获取当前用户。

也可能已有代码用 POST。

后端可以给同一个函数同时加 GET 和 POST 装饰器。

这样两个请求方式都能走同一套逻辑。

Swagger 里的认证按钮

FastAPI 文档会根据代码里的安全依赖生成认证按钮。

如果接口使用了 OAuth2 或类似安全依赖,文档页面里会出现授权入口。

未授权时调用带锁接口,会返回 401。

授权后,Swagger 会自动在请求里带上 token。

这对调试需要登录的接口很有用。

token 接口与 login 接口

Swagger 的 OAuth2 授权习惯访问 /token

但业务项目里登录接口常叫 /login

为了让文档授权更顺畅,可以兼容它需要的 token 路径,或者按项目实际情况配置。

重点是理解:文档里的授权流程也是在拿 JWT。

封装当前用户注入

如果每个接口都手写 token 解码、查用户、判断状态,会非常重复。

可以封装一个 auth_user 之类的依赖函数。

接口只要声明这个依赖,就能拿到当前用户。

这种方式适合接口数量较少的项目。

接口很多时,更适合放到中间件里统一处理。

为什么后面还要用中间件

有些接口本身不需要当前用户信息,但仍然必须要求登录。

如果只靠每个接口手动注入用户,容易漏掉。

中间件可以在请求进入业务接口前统一检查 token。

同时,它还可以结合白名单:登录、注册、激活等接口不拦截,其他接口默认要求认证。

用户信息返回格式

当前用户接口不应该把数据库模型直接返回。

原因是数据库模型里可能有哈希密码等敏感字段。

应该先转换成公开用户结构,再返回给前端。

返回结构也最好放到统一的 result 包装里,避免所有字段平铺在最外层,后续不好加错误码、消息和元信息。

注册接口测试

注册接口测试可以覆盖:

  • 正常注册;
  • 用户名重复;
  • 邮箱重复;
  • 密码太短;
  • 缺少大写字母;
  • 缺少小写字母;
  • 缺少数字;
  • 忘记提交事务导致数据库没有新用户。

测试正常注册时,不只看接口返回 200。

还要查询数据库,确认用户真的写入成功。

覆盖率意识

企业项目正式发版前通常会跑测试。

测试覆盖率越高,越能提前发现问题。

对学习项目来说,不必一开始追求很高覆盖率。

先把注册、登录、刷新、当前用户这些核心接口测起来,就已经很有价值。

这一节的重点

这一节把认证流程继续补齐。

你需要记住:

  • access token 过期后用 refresh token 续期;
  • refresh token 过期后回到登录页;
  • Swagger 可以辅助调试带认证的接口;
  • 当前用户逻辑可以先用依赖函数封装;
  • 接口测试要验证数据库状态,而不只是接口状态码。

AI Agent 课程学习文档。