checkCBrainOAuth.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { ElMessage } from 'element-plus';
  2. import { useUserStore } from '@/store/modules/user';
  3. import { getCBrainRedirectUrl } from '@/utils/getRedirectUrl';
  4. import { handleTokenFromUrl } from '@/utils/handleTokenFromUrl';
  5. import { checkOAuthCode } from '@/api/system/user';
  6. import { PageEnum } from '@/enums/pageEnum';
  7. import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router';
  8. /**
  9. * C大脑 OAuth2.0 单点登录路由前置守卫
  10. * - 无 code:重定向到 C大脑授权服务器
  11. * - 有 code:用 code 换 token,写存储,拉用户信息,再跳转首页
  12. */
  13. export async function checkCBrainOAuthToken(
  14. to: RouteLocationNormalized,
  15. _from: RouteLocationNormalized,
  16. next: NavigationGuardNext,
  17. ) {
  18. const userStore = useUserStore();
  19. const codeFromUrl = to.query.code as string | undefined;
  20. if (!codeFromUrl) {
  21. window.location.href = getCBrainRedirectUrl();
  22. return;
  23. }
  24. // 有code:换取token
  25. try {
  26. // 单点登录OAuth2.0 通过code请求接口,获取token
  27. const { satoken } = await checkOAuthCode(codeFromUrl);
  28. userStore.setToken(satoken);
  29. handleTokenFromUrl(satoken);
  30. try {
  31. await userStore.GetInfo();
  32. } catch (err: any) {
  33. console.log('catch getInfo error', err);
  34. // c大脑登录失败的时候不需要跳转到登录页面
  35. ElMessage.error(err.message);
  36. return;
  37. }
  38. next(PageEnum.BASE_HOME);
  39. } catch {
  40. ElMessage.error('获取token失败');
  41. }
  42. }