可信代码库-生产环境token覆盖问题解决

This commit is contained in:
付民康
2025-07-17 11:02:19 +08:00
parent b8743716b5
commit 3a9fbbf5cc
24 changed files with 9493 additions and 82 deletions

9408
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -56,7 +56,7 @@ onMounted(() => {
/** pc端刷新窗口 */
toNotice();
addEventListener('logout', (options) => {
const token = localStorage.getItem('access_token');
const token = localStorage.getItem('op_access_token');
if (!status.value) {
status.value = true;
if (isMounted()) {
@@ -134,7 +134,7 @@ onMounted(() => {
});
watchEffect(async() => {
if (route?.query?.isLogin && !localStorage.getItem('access_token')) {
if (route?.query?.isLogin && !localStorage.getItem('op_access_token')) {
if (!isMountedModal()) {
const cache_timeStamp = localStorage.getItem('cache_timeStamp');
const currentTimestamp = Date.now();

View File

@@ -201,8 +201,8 @@ export interface userInfoType {
mobile?: string
nickname?: string
username?: string
access_token?: string
refresh_token?: string
op_access_token?: string
op_refresh_token?: string
xauth_token?: string
[x: string]: any
}

View File

@@ -279,7 +279,7 @@ export function getVulSuggestion(data) {
// method: 'POST',
// data,
// headers: {
// Authorization: 'Bearer ' + localStorage.getItem('access_token'),
// Authorization: 'Bearer ' + localStorage.getItem('op_access_token'),
// },
// });
}
@@ -351,7 +351,7 @@ export function uploadImage(file: File) {
data: formData,
headers: {
'Content-Type': 'multipart/form-data',
Authorization: 'Bearer ' + localStorage.getItem('access_token')
Authorization: 'Bearer ' + localStorage.getItem('op_access_token')
}
});
@@ -361,7 +361,7 @@ export function uploadImage(file: File) {
// data: formData,
// headers: {
// 'Content-Type': 'multipart/form-data',
// Authorization: 'Bearer ' + localStorage.getItem('access_token')
// Authorization: 'Bearer ' + localStorage.getItem('op_access_token')
// }
// });
}
@@ -464,7 +464,7 @@ export function qualityTaskOverview(data) {
url: `/gateway/quality/task-overview/software` + `/${softwareId}`,
method: 'GET',
// headers: {
// Authorization: 'Bearer ' + localStorage.getItem('access_token'),
// Authorization: 'Bearer ' + localStorage.getItem('op_access_token'),
// }
});
}
@@ -475,7 +475,7 @@ export function qualityDefectPage(data) {
url: `/gateway/quality/defect/page` + `?pageNum=${pageNum}&pageSize=${pageSize}&softwareId=${softwareId}`,
method: 'GET',
// headers: {
// Authorization: 'Bearer ' + localStorage.getItem('access_token'),
// Authorization: 'Bearer ' + localStorage.getItem('op_access_token'),
// }
});
}
@@ -486,7 +486,7 @@ export function loginAccess() {
method: 'POST',
data: {},
headers: {
Authorization: 'Bearer ' + localStorage.getItem('access_token'),
Authorization: 'Bearer ' + localStorage.getItem('op_access_token'),
}
});
}

View File

@@ -38,8 +38,8 @@ export interface LoginResType {
mobile?: string
nickname?: string
username?: string
access_token?: string
refresh_token?: string
op_access_token?: string
op_refresh_token?: string
xauth_token?: string
}

View File

@@ -708,7 +708,7 @@ watch(
// 移除参数
localStorage.removeItem('loginReturnUrl');
const handleAuthLogin = (type: 'csdn' | 'gitee' | 'github') => {
if (localStorage.getItem('access_token')) {
if (localStorage.getItem('op_access_token')) {
emits('close', true);
} else {
if (!status.value) {

View File

@@ -45,10 +45,10 @@ export const injectRouter = (router) => {
const account = useAccountStore();
router.beforeEach(async (to, from) => {
let access_token = localStorage.getItem('access_token') || '';
let refresh_token = localStorage.getItem('refresh_token') || '';
let op_access_token = localStorage.getItem('op_access_token') || '';
let op_refresh_token = localStorage.getItem('op_refresh_token') || '';
// 如果是从blog跳转过来的判断是否登陆如果登陆则写入storage
await account.checkIsLogin(access_token,refresh_token);
await account.checkIsLogin(op_access_token,op_refresh_token);
// 判断命名空间类型
const globalStore = useGlobalInfoStore();
globalStore.setNamespaceType(-1); // 重置namespaceType防止非组织路由请求组织信息

View File

@@ -11,8 +11,8 @@ export interface AccountInfo {
avatar?: string;
nickname?: string;
username?: string;
access_token?: string;
refresh_token?: string;
op_access_token?: string;
op_refresh_token?: string;
xauth_token?: string;
isFollow?: boolean;
atomgit_username?: string;
@@ -20,26 +20,26 @@ export interface AccountInfo {
}
export const useAccountStore = defineStore('accountInfo', () => {
const cacheInfo = localStorage.getItem('userInfo');
const isLogin = ref(Boolean(localStorage.getItem('access_token')));
const cacheInfo = localStorage.getItem('opUserInfo');
const isLogin = ref(Boolean(localStorage.getItem('op_access_token')));
const userInfo = cacheInfo ? JSON.parse(cacheInfo).data : {};
const accountInfo = reactive<AccountInfo>({
access_token: localStorage.getItem('access_token') || '',
refresh_token: localStorage.getItem('refresh_token') || '',
op_access_token: localStorage.getItem('op_access_token') || '',
op_refresh_token: localStorage.getItem('op_refresh_token') || '',
xauth_token: localStorage.getItem('xauth_token') || '',
...userInfo
});
const refresh = () => {
/** 重定向跳转时强刷使用 */
const info = localStorage.getItem('userInfo');
isLogin.value = Boolean(localStorage.getItem('access_token'));
const info = localStorage.getItem('opUserInfo');
isLogin.value = Boolean(localStorage.getItem('op_access_token'));
const userData = info ? JSON.parse(info) : {};
for (const key in userData) {
accountInfo[key] = userData[key];
}
accountInfo.access_token = localStorage.getItem('access_token') || '';
accountInfo.refresh_token = localStorage.getItem('refresh_token') || '';
accountInfo.op_access_token = localStorage.getItem('op_access_token') || '';
accountInfo.op_refresh_token = localStorage.getItem('op_refresh_token') || '';
accountInfo.xauth_token = localStorage.getItem('xauth_token') || '';
};
@@ -59,38 +59,39 @@ export const useAccountStore = defineStore('accountInfo', () => {
}
};
// 可能有从博客跳转过来的,通过接口判断是否登陆
const checkIsLogin = async (access_token: string, refresh_token: string) => {
const checkIsLogin = async (op_access_token: string, op_refresh_token: string) => {
// const { data, error } = await getUserToken();
// if (data?.data) {
// const { access_token, refresh_token } = data.data;
// const { op_access_token, op_refresh_token } = data.data;
if(!access_token|| !refresh_token) {
if(!op_access_token|| !op_refresh_token) {
return
}
localStorage.setItem('access_token', access_token);
localStorage.setItem('refresh_token', refresh_token);
localStorage.setItem('op_access_token', op_access_token);
localStorage.setItem('op_refresh_token', op_refresh_token);
saveStatus(true);
saveAccountInfo({
access_token: localStorage.getItem('access_token') || '',
refresh_token: localStorage.getItem('refresh_token') || ''
op_access_token: localStorage.getItem('op_access_token') || '',
op_refresh_token: localStorage.getItem('op_refresh_token') || ''
});
debugger
const userRes = await getUserInfo();
if (userRes.data?.data && userRes.data?.data?.code===200) {
localStorage.setItem('userInfo', JSON.stringify(userRes.data?.data));
localStorage.setItem('opUserInfo', JSON.stringify(userRes.data?.data));
saveAccountInfo({
...userRes.data?.data
});
// }
return true;
} else {
localStorage.removeItem('access_token');
localStorage.removeItem('refresh_token');
localStorage.removeItem('userInfo');
localStorage.removeItem('op_access_token');
localStorage.removeItem('op_refresh_token');
localStorage.removeItem('opUserInfo');
saveAccountInfo({});
return false;
}
// localStorage.removeItem('access_token');
// localStorage.removeItem('refresh_token');
// localStorage.removeItem('op_access_token');
// localStorage.removeItem('op_refresh_token');
// localStorage.removeItem('userInfo');
// saveAccountInfo({});
// return false;
@@ -111,7 +112,7 @@ export const useAccountStore = defineStore('accountInfo', () => {
});
export const otherAccountStore = defineStore('otherInfo', () => {
const isLogin = ref(Boolean(localStorage.getItem('access_token')));
const isLogin = ref(Boolean(localStorage.getItem('op_access_token')));
const userInfo = {};
const accountInfo = reactive<AccountInfo>({
...userInfo

View File

@@ -9,11 +9,11 @@ export function useAccount() {
if (!source) {
return;
}
const { access_token, refresh_token, xauth_token, ...userInfo } = source;
localStorage.setItem('access_token', access_token);
localStorage.setItem('refresh_token', refresh_token);
const { op_access_token, op_refresh_token, xauth_token, ...userInfo } = source;
localStorage.setItem('op_access_token', op_access_token);
localStorage.setItem('op_refresh_token', op_refresh_token);
localStorage.setItem('xauth_token', xauth_token);
localStorage.setItem('userInfo', JSON.stringify(userInfo));
localStorage.setItem('opUserInfo', JSON.stringify(userInfo));
if (cached) {
saveStatus(true);
saveAccountInfo(userInfo);
@@ -21,10 +21,10 @@ export function useAccount() {
};
const RemoveInfo = () => {
localStorage.removeItem('access_token');
localStorage.removeItem('refresh_token');
localStorage.removeItem('op_access_token');
localStorage.removeItem('op_refresh_token');
localStorage.removeItem('xauth_token');
localStorage.removeItem('userInfo');
localStorage.removeItem('opUserInfo');
localStorage.removeItem('validator_email');
localStorage.removeItem('visited_repo_list');
localStorage.removeItem('invite_link');

View File

@@ -129,7 +129,7 @@ export function useFormInteraction(currentForm: Ref<FormListProps[]>, flag: bool
};
/** 第三方登录 */
const handleAuthLogin = (type: 'csdn' | 'gitee' | 'github' | 'mobile', callback?: Function, returnUrl? :string) => {
if (localStorage.getItem('access_token')) {
if (localStorage.getItem('op_access_token')) {
callback?.();
} else {
if (type === 'mobile') {

View File

@@ -8,8 +8,8 @@ type UserInfo = {
}
export const useUserInfo = (): { userInfo: UserInfo; } => {
const userInfoStr = localStorage.getItem('userInfo');
const userInfoStr2 = sessionStorage.getItem('userInfo');
const userInfoStr = localStorage.getItem('opUserInfo');
const userInfoStr2 = sessionStorage.getItem('opUserInfo');
const userInfo: UserInfo = userInfoStr ? JSON.parse(userInfoStr) : userInfoStr2 ? JSON.parse(userInfoStr2) : {};
return {
userInfo

View File

@@ -118,7 +118,7 @@ export function getFilePath(hash: string, filetype: string): string {
export function getImageUrl(iam_id?: string, fileType: string = 'png', isAvatar: boolean = true) {
if (!iam_id) {
const accountInfo = JSON.parse(localStorage.getItem('userInfo') || '{}');
const accountInfo = JSON.parse(localStorage.getItem('opUserInfo') || '{}');
iam_id = accountInfo.iam_id;
}
if (isAvatar) {

View File

@@ -122,10 +122,10 @@ const refreshToken = async () => axios.request({
url: baseURL + `${(import.meta as any).env.VITE_PASSPORT_PREFIX || ''}` + '/api/v1/user/token/refresh',
method: 'post',
data: {
refresh_token: localStorage.getItem('refresh_token')
op_refresh_token: localStorage.getItem('op_refresh_token')
},
headers: {
Authorization: 'Bearer ' + localStorage.getItem('access_token'),
Authorization: 'Bearer ' + localStorage.getItem('op_access_token'),
'content-type': 'application/x-www-form-urlencoded'
},
withCredentials: true
@@ -135,10 +135,10 @@ const proxyService = (params: any, customConfigs?: CustomConfigs) => {
const account = useAccountStore();
const service = axios.create({
baseURL: params.apiType === 'devApi' ? baseDevURL : baseURL,
timeout: 60000,
timeout: 30000,
headers: {
'DP_TOKEN': account.accountInfo.access_token,
'DP_REFRESH_TOKEN': account.accountInfo.refresh_token,
'DP_TOKEN': account.accountInfo.op_access_token,
'DP_REFRESH_TOKEN': account.accountInfo.op_refresh_token,
},
withCredentials: true
});
@@ -181,10 +181,10 @@ const proxyService = (params: any, customConfigs?: CustomConfigs) => {
config.headers['gitcode-utm-source'] = encodeURIComponent(getSignUtmSource());
}
const access_token = window.localStorage.getItem('access_token');
const op_access_token = window.localStorage.getItem('op_access_token');
const { url } = config;
if (access_token && !notAuthorization(url)) {
config.headers.Authorization = `Bearer ${access_token}`;
if (op_access_token && !notAuthorization(url)) {
config.headers.Authorization = `Bearer ${op_access_token}`;
}
/** 修改用户模块前缀名称 */
config.url = setPassportPrefix(config.url as string, config.method as string);
@@ -213,23 +213,23 @@ const proxyService = (params: any, customConfigs?: CustomConfigs) => {
});
});
}
if (response?.status === 401 && localStorage.getItem('access_token') && !config?.url.includes('/token/refresh')) {
if (response?.status === 401 && localStorage.getItem('op_access_token') && !config?.url.includes('/token/refresh')) {
refreshing = true;
try {
const res = await refreshToken();
refreshing = false;
if (res.status === 200) {
const { access_token, refresh_token } = res.data;
localStorage.setItem('access_token', access_token);
localStorage.setItem('refresh_token', refresh_token);
const { op_access_token, op_refresh_token } = res.data;
localStorage.setItem('op_access_token', op_access_token);
localStorage.setItem('op_refresh_token', op_refresh_token);
queue.forEach(({ config, resolve }) => {
if (config.headers) {
config.headers.Authorization = `Bearer ${access_token}`;
config.headers.Authorization = `Bearer ${op_access_token}`;
}
resolve(axios(config));
});
queue.splice(0);
config.headers.Authorization = `Bearer ${access_token}`;
config.headers.Authorization = `Bearer ${op_access_token}`;
return axios(config);
} else {
handleError({}, true);

View File

@@ -36,10 +36,10 @@ export function showMessage(res: Record<string, any>, logout: boolean = false) :
// if (!failCode.includes(res.data.error_code.toString())) {
// message = res.data.error_message;
// }
emitEvent('logout', Boolean(localStorage.getItem('access_token')));
emitEvent('logout', Boolean(localStorage.getItem('op_access_token')));
break;
case 403:
if (localStorage.getItem('access_token')) {
if (localStorage.getItem('op_access_token')) {
emitEvent('forbiddenRefresh');
} else {
message = res.data.error_message;

View File

@@ -68,7 +68,7 @@
<span>预警公告</span>
</div>
<!-- <a v-if="accountInfo.access_token" class="devui-link" @click="checkMore"
<!-- <a v-if="accountInfo.op_access_token" class="devui-link" @click="checkMore"
>更多 <i class="icon icon-chevron-right-2"></i>
</a>
<span v-else class="text-blue-500">查看更多请先登录</span> -->

View File

@@ -83,10 +83,10 @@ const handleDelete = async (row) => {
type: 'success',
message: '成功删除'
});
let access_token = localStorage.getItem('access_token') || '';
let refresh_token = localStorage.getItem('refresh_token') || '';
let op_access_token = localStorage.getItem('op_access_token') || '';
let op_refresh_token = localStorage.getItem('op_refresh_token') || '';
// 如果是从blog跳转过来的判断是否登陆如果登陆则写入storage
await account.checkIsLogin(access_token,refresh_token);
await account.checkIsLogin(op_access_token,op_refresh_token);
queryInviteListData();
} else {
Message({

View File

@@ -77,10 +77,10 @@ const handleAccept = async (row, type) => {
groupId: row.groupId,
status: type
});
let access_token = localStorage.getItem('access_token') || '';
let refresh_token = localStorage.getItem('refresh_token') || '';
let op_access_token = localStorage.getItem('op_access_token') || '';
let op_refresh_token = localStorage.getItem('op_refresh_token') || '';
// 如果是从blog跳转过来的判断是否登陆如果登陆则写入storage
await account.checkIsLogin(access_token,refresh_token);
await account.checkIsLogin(op_access_token,op_refresh_token);
if (data?.data?.data?.data) {
if(type===1) {
Message({

View File

@@ -84,7 +84,7 @@ const getInfo = async () => {
forms.userExt.emailAlertSwitch = user.userExt?.emailAlertSwitch || false;
if (userRes.data?.data) {
localStorage.setItem('userInfo', JSON.stringify(userRes.data?.data));
localStorage.setItem('opUserInfo', JSON.stringify(userRes.data?.data));
useAccountStore().saveAccountInfo({
...userRes.data?.data
});

View File

@@ -76,7 +76,9 @@ const goToGovernCenter = async () => {
const res = await fetchCheckAuthenticate({});
if(res.data.code!==200) return
if (res.data.data) {
window.location.href = VITE_GOVERNANCE_HOST;
// 直接使用 window.open
window.open(VITE_GOVERNANCE_HOST, '_blank');
// window.location.href = VITE_GOVERNANCE_HOST;
} else {
Message.warning('请联系平台管理员,开通账号权限');
}

View File

@@ -50,7 +50,7 @@ onMounted(async() => {
const signup_type = localStorage.getItem('cache_timeStamp') && localStorage.getItem('utm_source') ? '博客加速' : (sessionStorage.getItem('loginType') || '');
const res = await getBindUserInfo(bindType as unknown as any, code as string, bindState as string, signup_type as string) as any;
if (!res.error) {
if (localStorage.getItem('access_token') && fromAtomGit) {
if (localStorage.getItem('op_access_token') && fromAtomGit) {
emitEvents('success', '', automgitPath);
return;
}

View File

@@ -18,7 +18,7 @@ const login = () => {
redirectUrl = route?.query?.redirect.charAt(0) === '/' ? `${decodeURIComponent(route?.query?.redirect)}` : `/${decodeURIComponent(route?.query?.redirect)}`;
}
if (localStorage.getItem('access_token')) {
if (localStorage.getItem('op_access_token')) {
router.replace(redirectUrl || '/');
return;
} else {

View File

@@ -181,7 +181,7 @@ const followLoading = ref(false);
const followList = ref([]);
const userList = ref<MemberItemData[]>([]);
const getUserInfo = (source: RepoGroupUser, content: RepoGroupUser[]) => {
const userInfo = JSON.parse(localStorage.getItem('userInfo') as string);
const userInfo = JSON.parse(localStorage.getItem('opUserInfo') as string);
const adminList = content?.filter(item => item.access_level.toString() === '50') || [];
return {
imageSrc: source.avatar || source.avatar_url,

View File

@@ -216,7 +216,7 @@ export const getOrgInfo = () => {
// 获取用户是否可以创建组织 checkUserCreateOrg
const getUserCreateOrg = async(user?: any) => {
const token = localStorage.getItem('access_token');
const token = localStorage.getItem('op_access_token');
if (!token) {
return null;
}

View File

@@ -13,8 +13,8 @@ export const useUserInfo = (): { isSelf: boolean; userInfo: UserInfo; namespace:
const route = useRoute();
const params = route?.params || {};
const namespace = Array.isArray(params.namespace) ? params.namespace.join('/') : params.namespace;
const userInfoStr = localStorage.getItem('userInfo');
const userInfoStr2 = sessionStorage.getItem('userInfo');
const userInfoStr = localStorage.getItem('opUserInfo');
const userInfoStr2 = sessionStorage.getItem('opUserInfo');
const userInfo: UserInfo = userInfoStr ? JSON.parse(userInfoStr) : userInfoStr2 ? JSON.parse(userInfoStr2) : {};
const isSelf = userInfo.username?.toLowerCase() === namespace?.toLowerCase();
return {