Files
sionrui/openspec/changes/add-auto-refresh-token/specs/auth/spec.md
2025-12-21 22:24:16 +08:00

3.2 KiB
Raw Blame History

ADDED Requirements

Requirement: 请求前自动检查并刷新 token

系统 MUST 在发送需要认证的 HTTP 请求前,主动检查访问令牌是否即将过期,如果即将过期则自动使用 refreshToken 刷新,避免因 token 过期导致请求失败。

Scenario: Token 即将过期时自动刷新

  • GIVEN 用户已登录且 accessToken 将在 3 分钟后过期
  • WHEN 发起需要认证的 API 请求
  • THEN 系统自动使用 refreshToken 调用刷新接口
  • AND 刷新成功后使用新的 accessToken 发送原请求
  • AND 用户无感知,请求正常完成

Scenario: Token 正常情况下不触发刷新

  • GIVEN 用户已登录且 accessToken 将在 30 分钟后过期
  • WHEN 发起需要认证的 API 请求
  • THEN 系统检查 token 未过期
  • AND 直接使用当前 token 发送请求
  • AND 不调用刷新接口

Scenario: 白名单接口跳过 token 检查

  • GIVEN 用户已登录
  • WHEN 访问以下接口:
    • /auth/login(登录)
    • /auth/refresh-token(刷新 token
    • /auth/register(注册)
    • /auth/send-sms-code(发送短信)
  • THEN 系统跳过 token 过期检查
  • AND 不添加 Authorization 头

Scenario: 防止并发刷新 token

  • GIVEN 用户已登录且 token 即将过期
  • WHEN 同时发起 3 个需要认证的请求
  • THEN 只有一个请求触发 token 刷新
  • AND 其他 2 个请求等待刷新完成后使用新 token
  • AND 刷新接口只被调用一次

Scenario: 刷新失败时清理状态

  • GIVEN 用户已登录且 token 已过期
  • WHEN 发起需要认证的请求
  • AND 调用 refreshToken 接口返回 401refreshToken 也无效)
  • THEN 系统自动清理 localStorage 中的所有 token
  • AND 跳转到登录页要求用户重新登录
  • AND 拒绝所有后续请求直到重新登录

Scenario: 自定义缓冲时间

  • GIVEN 系统配置 token 刷新缓冲时间为 10 分钟
  • WHEN accessToken 将在 12 分钟后过期
  • THEN 系统认为 token 仍然有效
  • WHEN accessToken 将在 8 分钟后过期
  • THEN 系统自动触发 token 刷新

MODIFIED Requirements

Requirement: 请求拦截器增强

现有的请求拦截器 MUST 增强为支持 token 预检查和自动刷新功能。

Scenario: 拦截器新增预检查逻辑

  • GIVEN 用户已登录且系统配置了自动刷新功能
  • WHEN 发起需要认证的 HTTP 请求
  • THEN 拦截器在添加 Authorization 头之前检查 token 过期时间
  • AND 如果 token 即将过期,启动异步刷新流程
  • AND 刷新完成后使用新 token 添加到请求头
  • AND 继续发送原始请求

Modified Behavior:

  • 在添加 Authorization 头之前,先检查 token 是否即将过期
  • 如果即将过期且不在刷新过程中,则启动异步刷新流程
  • 刷新完成后继续添加 Authorization 头并发送请求
  • 使用 Promise 机制确保所有等待刷新的请求按顺序执行

Backward Compatibility:

  • 现有的 401 错误处理机制保持不变
  • 如果预检查失败(如 refreshToken 无效),仍然会触发 401 处理
  • 所有现有接口调用方式保持不变