Procházet zdrojové kódy

fix(app): 实现token刷新逻辑以更新用户会话

EvilDragon před 5 měsíci
rodič
revize
8ba72bb1ea

+ 2 - 0
packages/app/src/core/libs/requests.ts

@@ -194,5 +194,7 @@ export const createCircle = (
     bannerUrls: string[]
   }>,
 ) => httpPost<any>('/app-api/member/circle/create', data)
+export const refreshToken = (refreshToken: string) =>
+  httpPost<any>('/app-api/member/auth/refresh-token', {}, { refreshToken })
 export const httpGetMock = <T>(data: T) =>
   new Promise<IResData<T>>((resolve) => resolve({ code: 1, msg: '', data } as IResData<T>))

+ 21 - 1
packages/app/src/utils/http.ts

@@ -1,5 +1,7 @@
+import { refreshToken } from '@/core/libs/requests'
 import { CustomRequestOptions } from '@/interceptors/request'
 import { useUserStore } from '@/store'
+import dayjs from 'dayjs'
 
 const userStore = useUserStore()
 const Authorization = userStore.userInfo.token
@@ -8,7 +10,25 @@ const header = {
   'tenant-id': 1,
   Authorization,
 }
-export const http = <T>(options: CustomRequestOptions) => {
+export const http = async <T>(options: CustomRequestOptions) => {
+  const userStore = useUserStore()
+  // console.log(dayjs(userStore.userInfo.expiresTime).format('YYYY-MM-DD HH:mm:ss'))
+  const diff = dayjs(userStore.userInfo.expiresTime).diff(dayjs(), 'minutes')
+  // console.log(diff)
+  if (diff < 10 && options.url !== '/app-api/member/auth/refresh-token') {
+    const { data } = await refreshToken(userStore.userInfo.refreshToken)
+
+    userStore.setUserInfo({
+      ...userStore.userInfo,
+      token: data.accessToken,
+      userId: data.userId,
+      accessToken: data.accessToken,
+      refreshToken: data.refreshToken,
+      expiresTime: data.expiresTime,
+      // openid: data.openid,
+    })
+  }
+
   // 1. 返回 Promise 对象
   return new Promise<IResData<T>>((resolve, reject) => {
     uni.request({