auth.ts 1.15 KB
import { useStorage } from '@vueuse/core'

/**
 * 登录态缓存
 *
 * 单独抽成模块(而不是放 store 里)的原因:request.ts 需要读取 token,
 * 而 store 又依赖 request.ts,直接互相 import 会形成循环依赖。
 * useStorage 自带 localStorage 持久化与响应式,刷新页面不掉登录态。
 */

export const accessToken = useStorage<string>('ACCESS_TOKEN', '')
export const refreshToken = useStorage<string>('REFRESH_TOKEN', '')
export const expireTime = useStorage<number>('ACCESS_TOKEN_EXPIRE_TIME', 0)

export function getAccessToken(): string {
  return accessToken.value
}

export function setToken(token: string, refresh: string, expires: number) {
  accessToken.value = token || ''
  refreshToken.value = refresh || ''
  expireTime.value = expires || 0
}

export function clearToken() {
  accessToken.value = ''
  refreshToken.value = ''
  expireTime.value = 0
}

/** token 是否已过期(提前 30 秒视为过期,避免边界请求被打回) */
export function isTokenExpired(): boolean {
  if (!accessToken.value) return true
  if (!expireTime.value) return false
  return Date.now() >= expireTime.value - 30 * 1000
}