token刷新bug修复

This commit is contained in:
FengHui
2026-05-21 17:15:47 +08:00
parent 18990ff873
commit 36432eb070
3 changed files with 95 additions and 57 deletions

33
decrypt-test.js Normal file
View File

@@ -0,0 +1,33 @@
// 简单的解密脚本
const { sm4 } = require('sm-crypto');
function sm4Decrypt(key, value, mode = "hex") {
try {
const decrypted = sm4.decrypt(value, key, {
mode: 'ecb',
cipherType: mode === 'hex' ? 'hex' : 'base64',
padding: 'pkcs#5'
});
return decrypted;
} catch (e) {
console.error('sm4 decrypt error:', e);
return value;
}
}
const key = '86C63180C1306ABC4D8F989E0A0BC9F3';
const encryptedData = '6e38a482a83c7a9ff7c1787cd06a473c5f479b15028ccd4d64925596ea3c6b652f3c05bd5e8fd9f60c72cc1e7141c3717b86c8368cd20816cb8b121c23a3e80d7b57ea5bb6354e0935de2d195b0a8acb';
console.log('密钥:', key);
console.log('加密数据:', encryptedData);
const decrypted = sm4Decrypt(key, encryptedData, 'hex');
console.log('\n解密结果:', decrypted);
try {
const jsonObj = JSON.parse(decrypted);
console.log('\nJSON解析结果:', JSON.stringify(jsonObj, null, 2));
} catch (e) {
console.log('\n不是有效的JSON格式');
}

View File

@@ -5,7 +5,10 @@ import {
ref
} from 'vue'
import {
createRequest
createRequest,
isEncryptNeeded,
encryptRequestData,
handleResponseData
} from '@/utils/request';
import similarityJobs from '@/utils/similarity_Job.js';
import {
@@ -14,6 +17,8 @@ import {
import {
useReadMsg
} from '@/stores/useReadMsg';
import { sm4Decrypt } from '@/utils/crypto';
import config from "@/config.js";
// 简历完成度计算
function getResumeCompletionPercentage(resume) {
@@ -163,15 +168,19 @@ const useUserStore = defineStore("user", () => {
}
return new Promise((resolve, reject) => {
// console.log('[refreshToken] 开始刷新 token, refreshToken:', storedRefreshToken)
const requestUrl = config.baseUrl + '/refreshToken?refreshToken=' + encodeURIComponent(storedRefreshToken)
// console.log('[refreshToken] 请求地址:', requestUrl)
uni.request({
url: 'http://ks.zhaopinzao8dian.com/api/ks/refreshToken',
method: 'POST',
data: {
refreshToken: storedRefreshToken
},
url: requestUrl,
method: 'GET',
success: (resData) => {
console.log('[refreshToken] 原始响应:', JSON.stringify(resData))
if (resData.statusCode === 200) {
const { code, msg, token: newToken } = resData.data
let responseData = handleResponseData(resData.data)
// console.log('[refreshToken] 解密后数据:', JSON.stringify(responseData))
const { code, msg, token: newToken } = responseData
if (code === 200 && newToken) {
token.value = newToken
uni.setStorageSync('token', newToken)
@@ -189,6 +198,7 @@ const useUserStore = defineStore("user", () => {
}
},
fail: (err) => {
console.error('[refreshToken] 网络请求失败:', JSON.stringify(err))
logOut(false)
reject(err)
}

View File

@@ -36,7 +36,6 @@ const encryptPathPrefixes = [
'/app/notice/',
'/app/idCardLogin',
'/app/phoneLogin',
'/refreshToken',
];
const addRefreshSubscriber = (callback) => {
@@ -48,16 +47,11 @@ const notifyRefreshSubscribers = (token) => {
refreshSubscribers = [];
};
const resetRefreshState = () => {
isRefreshing = false;
refreshSubscribers = [];
};
const noEncryptSet = new Set([
'DELETE:/app/job/applyJobCencal',
]);
const isEncryptNeeded = (method, url) => {
export const isEncryptNeeded = (method, url) => {
const pureUrl = url.split('?')[0];
const key = `${method.toUpperCase()}:${pureUrl}`;
if (noEncryptSet.has(key)) return false;
@@ -76,7 +70,7 @@ const isEncryptNeeded = (method, url) => {
return false;
};
const encryptRequestData = (data) => {
export const encryptRequestData = (data) => {
const jsonData = JSON.stringify(data);
// const jsonData = JSON.stringify({a: '1'});
console.log('[请求] 加密前:', jsonData)
@@ -87,7 +81,7 @@ const encryptRequestData = (data) => {
};
};
const handleResponseData = (resData) => {
export const handleResponseData = (resData) => {
try {
if (resData?.encrypted) {
const decrypted = sm4Decrypt(config.sm4Config.key, resData.encryptedData);
@@ -179,18 +173,13 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
mask: true
})
}
let Authorization = ''
if (useUserStore().token) {
Authorization = `Bearer ${useUserStore().token}`
}
const header = headers || {};
if(needHeader){
header["Authorization"] = Authorization;
}
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
const doRequest = () => {
if (needHeader) {
header["Authorization"] = useUserStore().token ? `Bearer ${useUserStore().token}` : '';
}
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
return new Promise((resolve, reject) => {
uni.request({
url: config.baseUrl + url,
@@ -199,13 +188,10 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
header,
success: resData => {
const responseData = handleResponseData(resData.data)
console.log('[请求] 接口地址:', config.baseUrl + url)
console.log('[请求] 解密后数据:', JSON.stringify(responseData))
// 响应拦截
if (resData.statusCode === 200) {
// const responseData = handleResponseData(resData.data)
// console.log('[请求] 接口地址:', config.baseUrl + url)
// console.log('[请求] 解密后数据:', JSON.stringify(responseData))
// 响应拦截
if (resData.statusCode === 200) {
const {
code,
msg
@@ -235,7 +221,7 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
reject(err)
},
complete: () => {
if (loading) {
if (loading && !isRefreshing) {
uni.hideLoading();
}
}
@@ -247,12 +233,15 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
}
const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
return new Promise((innerResolve, innerReject) => {
if (isRefreshing) {
addRefreshSubscriber((token) => {
if (token) {
retryRequest().then(resolve).catch(reject)
retryRequest().then(resolve).catch(reject).finally(innerResolve)
} else {
reject(new Error('刷新token失败'))
const err = new Error('刷新token失败')
reject(err)
innerReject(err)
}
})
return
@@ -262,18 +251,24 @@ const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
useUserStore().refreshAccessToken().then((newToken) => {
notifyRefreshSubscribers(newToken)
retryRequest().then(resolve).catch(reject)
retryRequest().then(resolve).catch(reject).finally(() => {
isRefreshing = false
refreshSubscribers = []
if (loading) {
uni.hideLoading()
}
innerResolve()
})
}).catch((error) => {
resetRefreshState()
isRefreshing = false
refreshSubscribers = []
uni.showToast({
title: '登录过期,请重新登录',
icon: 'none'
})
reject(error)
}).finally(() => {
if (loading) {
uni.hideLoading()
}
innerReject(error)
})
})
}