|
|
@@ -0,0 +1,47 @@
|
|
|
+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失败');
|
|
|
+ }
|
|
|
+}
|