token刷新bug修复
This commit is contained in:
33
decrypt-test.js
Normal file
33
decrypt-test.js
Normal 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格式');
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
// 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))
|
||||
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,33 +233,42 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
|
||||
}
|
||||
|
||||
const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
|
||||
if (isRefreshing) {
|
||||
addRefreshSubscriber((token) => {
|
||||
if (token) {
|
||||
retryRequest().then(resolve).catch(reject)
|
||||
} else {
|
||||
reject(new Error('刷新token失败'))
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
isRefreshing = true
|
||||
|
||||
useUserStore().refreshAccessToken().then((newToken) => {
|
||||
notifyRefreshSubscribers(newToken)
|
||||
retryRequest().then(resolve).catch(reject)
|
||||
}).catch((error) => {
|
||||
resetRefreshState()
|
||||
uni.showToast({
|
||||
title: '登录过期,请重新登录',
|
||||
icon: 'none'
|
||||
})
|
||||
reject(error)
|
||||
}).finally(() => {
|
||||
if (loading) {
|
||||
uni.hideLoading()
|
||||
return new Promise((innerResolve, innerReject) => {
|
||||
if (isRefreshing) {
|
||||
addRefreshSubscriber((token) => {
|
||||
if (token) {
|
||||
retryRequest().then(resolve).catch(reject).finally(innerResolve)
|
||||
} else {
|
||||
const err = new Error('刷新token失败')
|
||||
reject(err)
|
||||
innerReject(err)
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
isRefreshing = true
|
||||
|
||||
useUserStore().refreshAccessToken().then((newToken) => {
|
||||
notifyRefreshSubscribers(newToken)
|
||||
retryRequest().then(resolve).catch(reject).finally(() => {
|
||||
isRefreshing = false
|
||||
refreshSubscribers = []
|
||||
if (loading) {
|
||||
uni.hideLoading()
|
||||
}
|
||||
innerResolve()
|
||||
})
|
||||
}).catch((error) => {
|
||||
isRefreshing = false
|
||||
refreshSubscribers = []
|
||||
uni.showToast({
|
||||
title: '登录过期,请重新登录',
|
||||
icon: 'none'
|
||||
})
|
||||
reject(error)
|
||||
innerReject(error)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user