u
This commit is contained in:
1 parent
6849579652
commit
d60be4a75b
24 files changed
+463
-179
No files matched your search
@@ -1,21 +1,110 @@
|
||||
import type { Method } from 'alova'
|
||||
import type { AxiosError } from 'axios'
|
||||
import { axiosRequestAdapter } from '@alova/adapter-axios'
|
||||
import { createAlova } from 'alova'
|
||||
import { createServerTokenAuthentication } from 'alova/client'
|
||||
import adapterFetch from 'alova/fetch'
|
||||
import { useToast } from '@/utils/toast'
|
||||
import { router } from 'expo-router'
|
||||
import { userStore } from '@/store/user'
|
||||
import { toast } from '@/utils/toast'
|
||||
|
||||
const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication({
|
||||
// ...
|
||||
})
|
||||
enum HttpCode {
|
||||
Success = 200,
|
||||
Unauthorized = 401,
|
||||
RefreshToken = 402,
|
||||
Fail = 500,
|
||||
}
|
||||
|
||||
const WhiteList = [
|
||||
'/auth/login/**',
|
||||
'/auth/register/**',
|
||||
'/auth/refresh/token',
|
||||
]
|
||||
|
||||
function isWhiteListed(url: string) {
|
||||
return WhiteList.some((pattern) => {
|
||||
if (pattern.endsWith('/**')) {
|
||||
const base = pattern.slice(0, -3)
|
||||
return url.startsWith(base)
|
||||
}
|
||||
return url === pattern
|
||||
})
|
||||
}
|
||||
|
||||
const alovaInstance = createAlova({
|
||||
// baseURL: 'http://192.168.1.136:8085/app',
|
||||
baseURL: 'http://192.168.5.6:8085/app',
|
||||
baseURL: 'http://192.168.1.136:8085/app',
|
||||
requestAdapter: axiosRequestAdapter(),
|
||||
responded(response) {
|
||||
// response自动被推断为AxiosResponse类型
|
||||
|
||||
return response.data
|
||||
responded: {
|
||||
onSuccess: async (response, method: Method) => {
|
||||
const resData = response.data as ResponseData<any>
|
||||
|
||||
if (resData.code === HttpCode.Success) {
|
||||
return resData.data
|
||||
}
|
||||
|
||||
// Access Token 失效 → 重新登录
|
||||
if (resData.code === HttpCode.Unauthorized) {
|
||||
console.log('===到这一步了===')
|
||||
router.replace('/auth/login')
|
||||
return
|
||||
}
|
||||
|
||||
// Access Token 过期但 Refresh Token 有效 → 刷新 token 并重试
|
||||
if (resData.code === HttpCode.RefreshToken) {
|
||||
try {
|
||||
const refreshToken = userStore.getState().userInfo?.refreshToken
|
||||
if (!refreshToken) {
|
||||
router.replace('/auth/login')
|
||||
return
|
||||
}
|
||||
|
||||
// 调用刷新接口
|
||||
const res = await alovaInstance.Get<ResponseData<string>>('/auth/refresh/token', {
|
||||
headers: {
|
||||
refreshToken,
|
||||
},
|
||||
})
|
||||
const newToken = res.data
|
||||
|
||||
// 更新 store
|
||||
userStore.getState().setUserInfo({
|
||||
...userStore.getState().userInfo!,
|
||||
token: newToken,
|
||||
})
|
||||
|
||||
// 重试原请求
|
||||
method.config.headers.token = newToken
|
||||
await method.send()
|
||||
|
||||
return
|
||||
}
|
||||
catch (err) {
|
||||
console.log('===到这一步了===')
|
||||
router.replace('/auth/login')
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
|
||||
// 其他错误
|
||||
return Promise.reject(resData.message || '请求失败')
|
||||
},
|
||||
|
||||
onError: (error: AxiosError, method) => {
|
||||
console.log(error.status)
|
||||
return Promise.reject(error)
|
||||
},
|
||||
},
|
||||
beforeRequest(method) {
|
||||
if (isWhiteListed(method.url))
|
||||
return
|
||||
|
||||
if (!userStore.getState().isLoggedIn()) {
|
||||
toast.show({
|
||||
title: '尚未登录',
|
||||
})
|
||||
router.replace('/auth/login')
|
||||
return
|
||||
}
|
||||
|
||||
method.config.headers.token = userStore.getState().userInfo?.token ?? ''
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
Reference in new issue
Block a user