切换日光/暗黑模式
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 可以辅助调试带认证的接口;
- 当前用户逻辑可以先用依赖函数封装;
- 接口测试要验证数据库状态,而不只是接口状态码。