diff --git a/decrypt-test.js b/decrypt-test.js new file mode 100644 index 0000000..243b0d9 --- /dev/null +++ b/decrypt-test.js @@ -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格式'); +} diff --git a/stores/useUserStore.js b/stores/useUserStore.js index 23f0eb8..66a3b64 100644 --- a/stores/useUserStore.js +++ b/stores/useUserStore.js @@ -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) } diff --git a/utils/request.js b/utils/request.js index 994cc32..40012de 100644 --- a/utils/request.js +++ b/utils/request.js @@ -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) + }) }) }