feat: 双token
This commit is contained in:
@@ -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
|
||||
* 成功后更新 accessToken,Refresh 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
|
||||
}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user