import { ElMessage } from 'element-plus'; import { useUserStore } from '@/store/modules/user'; import { getCBrainRedirectUrl } from '@/utils/getRedirectUrl'; import { handleTokenFromUrl } from '@/utils/handleTokenFromUrl'; import { checkOAuthCode } from '@/api/system/user'; import { PageEnum } from '@/enums/pageEnum'; import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'; /** * C大脑 OAuth2.0 单点登录路由前置守卫 * - 无 code:重定向到 C大脑授权服务器 * - 有 code:用 code 换 token,写存储,拉用户信息,再跳转首页 */ export async function checkCBrainOAuthToken( to: RouteLocationNormalized, _from: RouteLocationNormalized, next: NavigationGuardNext, ) { const userStore = useUserStore(); const codeFromUrl = to.query.code as string | undefined; if (!codeFromUrl) { window.location.href = getCBrainRedirectUrl(); return; } // 有code:换取token try { // 单点登录OAuth2.0 通过code请求接口,获取token const { satoken } = await checkOAuthCode(codeFromUrl); userStore.setToken(satoken); handleTokenFromUrl(satoken); try { await userStore.GetInfo(); } catch (err: any) { console.log('catch getInfo error', err); // c大脑登录失败的时候不需要跳转到登录页面 ElMessage.error(err.message); return; } next(PageEnum.BASE_HOME); } catch { ElMessage.error('获取token失败'); } }