feat: 双token

This commit is contained in:
2026-06-16 18:19:48 +08:00
parent 172c83ea73
commit cb9687e472
8 changed files with 221 additions and 119 deletions

View File

@@ -53,9 +53,11 @@ export const useAccountStore = defineStore(
*
* - 无 token → 无操作
* - token 有效 → 拉取用户信息,标记已登录
* - token 过期 → 尝试Refresh Token 刷新,刷新失败则清除
* - token 过期 → requestClient 拦截器自动调refreshAccessToken() 刷新后重试
* 若刷新也失败则抛出异常,此处 catch 后清除认证状态
*/
const initAuth = async () => {
console.log('initAuth', isInitialized.value)
// 已验证过,跳过
if (isInitialized.value) return
isInitialized.value = true
@@ -68,18 +70,8 @@ export const useAccountStore = defineStore(
// 成功获取用户信息token 有效
isTokenValid.value = true
} catch {
// Access Token 可能过期,尝试用 Refresh Token 刷新
if (refreshToken.value) {
try {
await doRefresh()
isTokenValid.value = true
} catch {
// 刷新也失败,清除
clearAuth()
}
} else {
clearAuth()
}
// 请求失败(包括自动刷新也失败),清除认证状态
clearAuth()
}
}
@@ -92,7 +84,7 @@ export const useAccountStore = defineStore(
const res = await loginApi(params)
accessToken.value = res.data.accessToken
refreshToken.value = res.data.refreshToken
await fetchUserInfo()
// await fetchUserInfo()
isTokenValid.value = true
}
@@ -105,7 +97,7 @@ export const useAccountStore = defineStore(
const res = await registerApi(params)
accessToken.value = res.data.accessToken
refreshToken.value = res.data.refreshToken
await fetchUserInfo()
// await fetchUserInfo()
isTokenValid.value = true
}
@@ -127,17 +119,26 @@ export const useAccountStore = defineStore(
}
/**
* 使用 Refresh Token 刷新 Access Token
* 成功后更新 accessTokenRefresh Token 不变(由服务端行为决定)
* 刷新 Access Token
*
* 由刷新拦截器的 doRefreshToken 调用。
* 返回新的 Access Token 字符串,方便拦截器直接使用。
*
* @returns 新的 Access Token
*/
const doRefresh = async () => {
const refreshAccessToken = async (): Promise<string> => {
if (!refreshToken.value) {
throw new Error('无 Refresh Token无法刷新')
}
const res = await refreshApi({ refreshToken: refreshToken.value })
accessToken.value = res.data.accessToken
// 如果服务端返回了新的 refreshToken 则更新
if (res.data.refreshToken) {
refreshToken.value = res.data.refreshToken
}
await fetchUserInfo()
isTokenValid.value = true
return accessToken.value
}
/** 清除所有认证状态 */
@@ -158,6 +159,7 @@ export const useAccountStore = defineStore(
login,
register,
logout,
refreshAccessToken,
fetchUserInfo
}
},