Files
MrleeAdmin/frontend/web/app/plugins/auth-init.ts
T

65 lines
2.4 KiB
TypeScript

import { useMemberStore } from '~/stores/member'
import { getMemberProfile } from '~/api/member'
import { refreshToken } from '~/api/auth'
export default defineNuxtPlugin(async () => {
// 仅在客户端执行
if (!import.meta.client) return
// 等待一下让 pinia 持久化插件完成初始化
await new Promise(resolve => setTimeout(resolve, 100))
const memberStore = useMemberStore()
// 如果没有 token 但有 refreshToken,尝试刷新
if (memberStore.refreshToken && !memberStore.token) {
try {
const response: any = await refreshToken(memberStore.refreshToken)
if (response.code === 0 && response.data) {
memberStore.token = response.data.access_token
memberStore.refreshToken = response.data.refresh_token
} else {
memberStore.logout()
}
} catch (error) {
memberStore.logout()
}
} else if (memberStore.token && memberStore.refreshToken) {
// 如果有 token 和 refreshToken,尝试获取用户信息
try {
const data: any = await getMemberProfile()
if (data && data.id) {
memberStore.info = data
} else {
memberStore.info = null
}
} catch (error: any) {
// 如果是 401 错误,尝试刷新 token
if (error?.message?.includes('401') || error?.response?.status === 401) {
try {
const refreshResponse: any = await refreshToken(memberStore.refreshToken)
if (refreshResponse.code === 0 && refreshResponse.data) {
memberStore.token = refreshResponse.data.access_token
memberStore.refreshToken = refreshResponse.data.refresh_token
// 刷新成功后重新获取用户信息
const userInfo: any = await getMemberProfile()
if (userInfo && userInfo.id) {
memberStore.info = userInfo
}
} else {
memberStore.logout()
}
} catch (refreshError) {
memberStore.logout()
}
} else {
memberStore.info = null
}
}
}
})