useTokenManager
Access / Refresh Token 的持久化、自动刷新与登录态计算(Vue Hook,依赖注入)。
前置依赖
依赖参数
| 参数名 | 类型 | 说明 |
|---|---|---|
env.vue.ref | Vue ref | 响应式状态 |
env.vue.computed | Vue computed | 派生 isAuthenticated |
env.vue.watchEffect | Vue watchEffect | 持久化同步 |
env.vue.onMounted / onUnmounted | 生命周期 | 水合与定时器清理 |
env.host.setTimeout / clearTimeout | 定时器 | 到期前刷新调度 |
env.host.now | () => number | 当前时间戳(毫秒) |
env.storage | useStorage 实例 | Promise 存储 API |
存储须通过 useStorage 与适配器创建,勿直接使用 localStorage。
环境要求
- Vue 3:运行时经
env.vue注入 - 持久化:
useLocalStorage或 IndexedDB 适配器
函数签名
typescript
function useTokenManager(
options: UseTokenManagerOptions,
env: UseTokenManagerEnvironment,
): UseTokenManagerReturn
interface UseTokenManagerOptions {
refreshThresholdMs?: number
storageKeys?: { access?: string; refresh?: string; expiresAt?: string }
refreshFn?: (refreshToken: string) => Promise<{
accessToken: string
refreshToken?: string
expiresAt: number
} | null>
}
interface SetTokensInput {
accessToken: string
refreshToken?: string | null
expiresAt?: number | null
expiresInSeconds?: number | null
}参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
options.refreshThresholdMs | number | 否 | 到期前刷新阈值,默认 60000 |
options.refreshFn | function | 否 | 刷新接口;无则仅本地管理 |
options.storageKeys | object | 否 | 默认 token:access 等 |
env | UseTokenManagerEnvironment | 是 | Vue + host + storage |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
accessToken / refreshToken / expiresAt | Ref | 令牌与绝对过期时间 |
isAuthenticated | Ref<boolean> | 有 access 且未过期 |
isRefreshing / error | Ref | 刷新状态 |
setTokens | function | 登录成功后写入 |
clearTokens | function | 登出清理 |
forceRefresh | function | 手动刷新 |
工作原理
onMounted从 storage 水合三键值,再scheduleRefresh。setTokens写入 Ref 并persist;按expiresAt - now - threshold设定刷新定时器。forceRefresh调用refreshFn,成功则setTokens更新。watchEffect在水合完成后把 Ref 变更写回 storage。clearTokens取消定时器并 remove 存储键。
异常
刷新失败写入 error Ref,不向外抛异常。