浏览代码

登录30天修复

guarantee-lsq 1 周之前
父节点
当前提交
c641b4bf82
共有 2 个文件被更改,包括 35 次插入19 次删除
  1. 10 13
      .cool/store/user.ts
  2. 25 6
      services/user.ts

+ 10 - 13
.cool/store/user.ts

@@ -167,6 +167,7 @@ export class User {
 	 * @returns Promise<string> 新的token
 	 */
 	async refreshToken(): Promise<string> {
+		console.log('[refreshToken] stored token:', storage.get("refreshToken"))
 		// 防止并发刷新
 		if (this.refreshing != null) {
 			return this.refreshing;
@@ -177,20 +178,16 @@ export class User {
 			return Promise.reject(new Error("No refresh token available"));
 		}
 
-		this.refreshing = (async () => {
-			try {
-				const res = await refreshTokenApi(storedRefreshToken);
-				if (res != null && res.data != null) {
-					const respData = res.data as UTSJSONObject;
-					const loginData: LoginData = {
-						access_token: respData["access_token"] as string,
-						refresh_token: respData["refresh_token"] as string,
-					};
-					this.setToken(loginData);
+			this.refreshing = (async () => {
+				try {
+					const res = await refreshTokenApi(storedRefreshToken);
+					if (res == null) {
+						throw new Error("Refresh token response null");
+					}
+					// refreshTokenApi 直接 resolve LoginData,无需再解包 .data
+					this.setToken(res);
 					return this.token;
-				}
-				throw new Error("Refresh token response invalid");
-			} finally {
+				} finally {
 				this.refreshing = null;
 			}
 		})();

+ 25 - 6
services/user.ts

@@ -1,4 +1,5 @@
 import { usePost, stringify, useGet, usePut } from "@/.cool";
+import { config } from "@/config";
 export type LoginData = {
   access_token: string;
   refresh_token: string;
@@ -43,12 +44,30 @@ export interface DICT_DATA {
 export function loginApi(params) {
   return usePost(`/oauth/token?${stringify(params)}`) as Promise<LoginData>
 }
-export function refreshTokenApi(refreshToken: string) {
-  return usePost(
-    `/oauth/token?grant_type=refresh_token&refresh_token=${refreshToken}`,
-    null,
-    { header: { Authorization: 'Basic ZW5kOmVuZA==' } }
-  ) as Promise<LoginData>
+export function refreshTokenApi(refreshToken: string): Promise<LoginData> {
+  // 绕过 request() 避免 header spread 导致 Authorization 被 user.token 污染
+  return new Promise((resolve, reject) => {
+    uni.request({
+      url: config.baseUrl + `/oauth/token?grant_type=refresh_token&refresh_token=${refreshToken}`,
+      method: 'POST',
+      header: { Authorization: 'Basic ZW5kOmVuZA==' },
+      success(res: any) {
+        // 小程序 uni.request 的 res.data 已是对象,无需 JSON.parse
+        console.log('[refreshTokenApi] statusCode:', res.statusCode)
+        console.log('[refreshTokenApi] data:', res.data)
+        const d = res.data as UTSJSONObject
+        if (d['code'] == 200 || d['code'] == 0) {
+          resolve(d['data'] as LoginData)
+        } else {
+          reject({ message: (d['message'] as string) ?? 'refresh failed' })
+        }
+      },
+      fail(err: any) {
+        console.log('[refreshTokenApi] fail:', err)
+        reject({ message: err.errMsg ?? 'refresh network error' })
+      }
+    })
+  })
 }
 export function sendSmsCode(params) {
   return usePost(`/verify/sms/code/send`, params) as Promise<string>