sso.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import request from '@/utils/request';
  2. import {
  3. getSSOConfig,
  4. setPlatformToken,
  5. setSysMenuConfigID,
  6. refreshTitle
  7. } from '@/utils/auth';
  8. import { defaults, omit } from 'lodash-es';
  9. const baseURL = process.env.VUE_APP_BASE_API;
  10. const APP_PORT = process.env.port || process.env.npm_config_port || 8008; // 端口
  11. const PTS_PORT = 7000;
  12. const locationUrl = location.protocol + '//' + location.hostname;
  13. let isUpdatedSSOConfig = false;
  14. export let ssoConfig = {
  15. appId: process.env.VUE_APP_SYS_ID,
  16. ssoEnabled: process.env.VUE_APP_SSO_ENABLED === 'TRUE',
  17. verifyTokenUrl: '/sso/verifyToken',
  18. ssoLoginUrl: `${locationUrl}:${PTS_PORT}/portal/login?redirect=`,
  19. appRedirectUrl: `${locationUrl}:${APP_PORT}/fms/index`,
  20. appLocalUrl: `/fms/index`,
  21. isRedirect: false
  22. };
  23. const updateSSOConfig = () => {
  24. if (isUpdatedSSOConfig) {
  25. return;
  26. }
  27. try {
  28. let configInfo = getSSOConfig();
  29. if (configInfo) {
  30. configInfo = JSON.parse(configInfo);
  31. }
  32. const { ssoEnabled, appName, ssoLoginUrl } = configInfo || {};
  33. ssoConfig = defaults(
  34. {
  35. appId: appName,
  36. ssoEnabled:
  37. process.env.NODE_ENV === 'development'
  38. ? undefined
  39. : ssoEnabled === '1',
  40. ssoLoginUrl:
  41. process.env.NODE_ENV === 'development' ? undefined : ssoLoginUrl
  42. },
  43. ssoConfig
  44. );
  45. //alert("开关=" + ssoConfig.ssoEnabled);
  46. isUpdatedSSOConfig = true;
  47. } catch (error) {
  48. alert('解析ssoConfig错误=' + error);
  49. console.error(error, '解析configinfo 出错');
  50. }
  51. };
  52. const parseTarget = (target) => {
  53. if (/(http|https):\/\/([\w.]+\/?)\S*/.test(target)) {
  54. return target;
  55. }
  56. return target;
  57. };
  58. const goTarget = function (href) {
  59. window.open(href, '_blank');
  60. };
  61. const goUrl = function (href) {
  62. window.location.href = href;
  63. };
  64. // 获取portal配置
  65. export async function getSsoInfo() {
  66. let res = await axios({ method: 'get', url: baseURL + '/portal/cfg/cfg' });
  67. let cfg =
  68. res.status === 200 &&
  69. res.data &&
  70. res.data.code === '000000' &&
  71. res.data.data;
  72. return cfg;
  73. }
  74. const getQueryData = () => {
  75. let oSearchItem = {};
  76. let searchString = window.location.search;
  77. let reg = /[?&][^?&]+=[^?&]+/g;
  78. let arr = searchString.match(reg);
  79. if (arr) {
  80. arr.forEach((item) => {
  81. let tempArr = item.substring(1).split('=');
  82. let key = decodeURIComponent(tempArr[0]);
  83. let value = decodeURIComponent(tempArr[1]);
  84. oSearchItem[key] = value;
  85. });
  86. }
  87. return oSearchItem;
  88. };
  89. export function authSSoToken(ssoToken) {
  90. //alert( "请求ssoToken=" + ssoToken );
  91. return request({
  92. url: ssoConfig.verifyTokenUrl,
  93. method: 'post',
  94. data: {
  95. ptsToken: ssoToken,
  96. sysName: ssoConfig.appId,
  97. sysId: ssoConfig.appId
  98. }
  99. });
  100. }
  101. export function resdirectApp(redirect, ssoToken) {
  102. if (ssoConfig.appId === 'PTS') {
  103. if (/(http|https):\/\/([\w.]+\/?)\S*/.test(redirect)) {
  104. return redirect + '?token=' + ssoToken;
  105. }
  106. return redirect + '';
  107. } else {
  108. return parseTarget('/');
  109. }
  110. }
  111. export function getResdirectAppUrl(ssoToken) {
  112. updateSSOConfig();
  113. if (!ssoToken) {
  114. const currentUrl = location.href;
  115. const isIndex =
  116. location.pathname === '/index' || location.pathname === '/fms';
  117. let backUrl = '/';
  118. if (ssoConfig.isRedirect) {
  119. backUrl = isIndex ? '/' : currentUrl || ssoConfig.appRedirectUrl;
  120. }
  121. let redirectUrl = ssoConfig.ssoEnabled
  122. ? parseTarget(
  123. ssoConfig.ssoLoginUrl + backUrl + `&appid=${ssoConfig.appId}`
  124. )
  125. : process.env.VUE_APP_SYS_BASE_URL + '/login';
  126. // alert( ssoConfig.ssoEnabled );
  127. // alert(redirectUrl);
  128. // alert(ssoConfig.ssoLoginUrl);
  129. goUrl(redirectUrl);
  130. }
  131. }
  132. export function parseSSoToken(store, next, to, router, subName) {
  133. updateSSOConfig();
  134. const { token, siblingToken, subid } = to.query;
  135. if (subid) {
  136. setSysMenuConfigID(subid);
  137. }
  138. if (subName) {
  139. setSysTitle(subName, subid);
  140. }
  141. refreshTitle();
  142. if (token) {
  143. let ssoToken = token;
  144. // alert('全局ssoToken=' + ssoToken);
  145. if (typeof ssoToken === 'undefined') {
  146. if (ssoConfig.appId !== 'PTS') {
  147. if (ssoConfig.ssoEnabled) {
  148. goUrl(
  149. `${ssoConfig.ssoLoginUrl}${ssoConfig.appRedirectUrl}${to.fullPath}`
  150. ); // 否则全部重定向到登录页
  151. } else {
  152. }
  153. }
  154. } else {
  155. setPlatformToken(ssoToken);
  156. return store.dispatch('SaveBindToken', ssoToken).then(() => {
  157. router.replace({
  158. path: to.path,
  159. query: omit(to.query, ['token', 'siblingToken', 'subid', 'subName'])
  160. });
  161. return true;
  162. });
  163. }
  164. } else if (siblingToken) {
  165. setPlatformToken(siblingToken);
  166. //
  167. return store.dispatch('SaveSiblingToken', siblingToken).then(() => {
  168. router.replace({
  169. path: to.path,
  170. query: omit(to.query, ['token', 'siblingToken', 'subid', 'subName']),
  171. replace: true
  172. });
  173. return true;
  174. });
  175. } else {
  176. return Promise.resolve(false);
  177. }
  178. }
  179. export function refreshTitle() {
  180. // document.title = getSysTitle();
  181. }