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
|
ref
|
||||||
} from 'vue'
|
} from 'vue'
|
||||||
import {
|
import {
|
||||||
createRequest
|
createRequest,
|
||||||
|
isEncryptNeeded,
|
||||||
|
encryptRequestData,
|
||||||
|
handleResponseData
|
||||||
} from '@/utils/request';
|
} from '@/utils/request';
|
||||||
import similarityJobs from '@/utils/similarity_Job.js';
|
import similarityJobs from '@/utils/similarity_Job.js';
|
||||||
import {
|
import {
|
||||||
@@ -14,6 +17,8 @@ import {
|
|||||||
import {
|
import {
|
||||||
useReadMsg
|
useReadMsg
|
||||||
} from '@/stores/useReadMsg';
|
} from '@/stores/useReadMsg';
|
||||||
|
import { sm4Decrypt } from '@/utils/crypto';
|
||||||
|
import config from "@/config.js";
|
||||||
|
|
||||||
// 简历完成度计算
|
// 简历完成度计算
|
||||||
function getResumeCompletionPercentage(resume) {
|
function getResumeCompletionPercentage(resume) {
|
||||||
@@ -163,15 +168,19 @@ const useUserStore = defineStore("user", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
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({
|
uni.request({
|
||||||
url: 'http://ks.zhaopinzao8dian.com/api/ks/refreshToken',
|
url: requestUrl,
|
||||||
method: 'POST',
|
method: 'GET',
|
||||||
data: {
|
|
||||||
refreshToken: storedRefreshToken
|
|
||||||
},
|
|
||||||
success: (resData) => {
|
success: (resData) => {
|
||||||
|
console.log('[refreshToken] 原始响应:', JSON.stringify(resData))
|
||||||
if (resData.statusCode === 200) {
|
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) {
|
if (code === 200 && newToken) {
|
||||||
token.value = newToken
|
token.value = newToken
|
||||||
uni.setStorageSync('token', newToken)
|
uni.setStorageSync('token', newToken)
|
||||||
@@ -189,6 +198,7 @@ const useUserStore = defineStore("user", () => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
|
console.error('[refreshToken] 网络请求失败:', JSON.stringify(err))
|
||||||
logOut(false)
|
logOut(false)
|
||||||
reject(err)
|
reject(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ const encryptPathPrefixes = [
|
|||||||
'/app/notice/',
|
'/app/notice/',
|
||||||
'/app/idCardLogin',
|
'/app/idCardLogin',
|
||||||
'/app/phoneLogin',
|
'/app/phoneLogin',
|
||||||
'/refreshToken',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const addRefreshSubscriber = (callback) => {
|
const addRefreshSubscriber = (callback) => {
|
||||||
@@ -48,16 +47,11 @@ const notifyRefreshSubscribers = (token) => {
|
|||||||
refreshSubscribers = [];
|
refreshSubscribers = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetRefreshState = () => {
|
|
||||||
isRefreshing = false;
|
|
||||||
refreshSubscribers = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
const noEncryptSet = new Set([
|
const noEncryptSet = new Set([
|
||||||
'DELETE:/app/job/applyJobCencal',
|
'DELETE:/app/job/applyJobCencal',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const isEncryptNeeded = (method, url) => {
|
export const isEncryptNeeded = (method, url) => {
|
||||||
const pureUrl = url.split('?')[0];
|
const pureUrl = url.split('?')[0];
|
||||||
const key = `${method.toUpperCase()}:${pureUrl}`;
|
const key = `${method.toUpperCase()}:${pureUrl}`;
|
||||||
if (noEncryptSet.has(key)) return false;
|
if (noEncryptSet.has(key)) return false;
|
||||||
@@ -76,7 +70,7 @@ const isEncryptNeeded = (method, url) => {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const encryptRequestData = (data) => {
|
export const encryptRequestData = (data) => {
|
||||||
const jsonData = JSON.stringify(data);
|
const jsonData = JSON.stringify(data);
|
||||||
// const jsonData = JSON.stringify({a: '1'});
|
// const jsonData = JSON.stringify({a: '1'});
|
||||||
console.log('[请求] 加密前:', jsonData)
|
console.log('[请求] 加密前:', jsonData)
|
||||||
@@ -87,7 +81,7 @@ const encryptRequestData = (data) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleResponseData = (resData) => {
|
export const handleResponseData = (resData) => {
|
||||||
try {
|
try {
|
||||||
if (resData?.encrypted) {
|
if (resData?.encrypted) {
|
||||||
const decrypted = sm4Decrypt(config.sm4Config.key, resData.encryptedData);
|
const decrypted = sm4Decrypt(config.sm4Config.key, resData.encryptedData);
|
||||||
@@ -179,18 +173,13 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
|
|||||||
mask: true
|
mask: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
let Authorization = ''
|
|
||||||
if (useUserStore().token) {
|
|
||||||
Authorization = `Bearer ${useUserStore().token}`
|
|
||||||
}
|
|
||||||
|
|
||||||
const header = headers || {};
|
const header = headers || {};
|
||||||
if(needHeader){
|
|
||||||
header["Authorization"] = Authorization;
|
|
||||||
}
|
|
||||||
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
|
|
||||||
|
|
||||||
const doRequest = () => {
|
const doRequest = () => {
|
||||||
|
if (needHeader) {
|
||||||
|
header["Authorization"] = useUserStore().token ? `Bearer ${useUserStore().token}` : '';
|
||||||
|
}
|
||||||
|
const requestData = isEncryptNeeded(method, url) ? encryptRequestData(data) : data;
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
uni.request({
|
uni.request({
|
||||||
url: config.baseUrl + url,
|
url: config.baseUrl + url,
|
||||||
@@ -199,13 +188,10 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
|
|||||||
header,
|
header,
|
||||||
success: resData => {
|
success: resData => {
|
||||||
const responseData = handleResponseData(resData.data)
|
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('[请求] 接口地址:', config.baseUrl + url)
|
||||||
// console.log('[请求] 解密后数据:', JSON.stringify(responseData))
|
// console.log('[请求] 解密后数据:', JSON.stringify(responseData))
|
||||||
|
// 响应拦截
|
||||||
|
if (resData.statusCode === 200) {
|
||||||
const {
|
const {
|
||||||
code,
|
code,
|
||||||
msg
|
msg
|
||||||
@@ -235,7 +221,7 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
|
|||||||
reject(err)
|
reject(err)
|
||||||
},
|
},
|
||||||
complete: () => {
|
complete: () => {
|
||||||
if (loading) {
|
if (loading && !isRefreshing) {
|
||||||
uni.hideLoading();
|
uni.hideLoading();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,12 +233,15 @@ export function createRequest(url, data = {}, method = 'GET', loading = false, h
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
|
const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
|
||||||
|
return new Promise((innerResolve, innerReject) => {
|
||||||
if (isRefreshing) {
|
if (isRefreshing) {
|
||||||
addRefreshSubscriber((token) => {
|
addRefreshSubscriber((token) => {
|
||||||
if (token) {
|
if (token) {
|
||||||
retryRequest().then(resolve).catch(reject)
|
retryRequest().then(resolve).catch(reject).finally(innerResolve)
|
||||||
} else {
|
} else {
|
||||||
reject(new Error('刷新token失败'))
|
const err = new Error('刷新token失败')
|
||||||
|
reject(err)
|
||||||
|
innerReject(err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
@@ -262,18 +251,24 @@ const handleTokenExpired = (resolve, reject, retryRequest, loading) => {
|
|||||||
|
|
||||||
useUserStore().refreshAccessToken().then((newToken) => {
|
useUserStore().refreshAccessToken().then((newToken) => {
|
||||||
notifyRefreshSubscribers(newToken)
|
notifyRefreshSubscribers(newToken)
|
||||||
retryRequest().then(resolve).catch(reject)
|
retryRequest().then(resolve).catch(reject).finally(() => {
|
||||||
|
isRefreshing = false
|
||||||
|
refreshSubscribers = []
|
||||||
|
if (loading) {
|
||||||
|
uni.hideLoading()
|
||||||
|
}
|
||||||
|
innerResolve()
|
||||||
|
})
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
resetRefreshState()
|
isRefreshing = false
|
||||||
|
refreshSubscribers = []
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '登录过期,请重新登录',
|
title: '登录过期,请重新登录',
|
||||||
icon: 'none'
|
icon: 'none'
|
||||||
})
|
})
|
||||||
reject(error)
|
reject(error)
|
||||||
}).finally(() => {
|
innerReject(error)
|
||||||
if (loading) {
|
})
|
||||||
uni.hideLoading()
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user