@smart100/spu-web-plugin 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- var version = "1.0.6";
1
+ var version = "1.0.8";
2
2
 
3
3
  /** Detect free variable `global` from Node.js. */
4
4
  var freeGlobal$2 = typeof global == 'object' && global && global.Object === Object && global;
@@ -16169,95 +16169,6 @@ function setRefreshToken(value) {
16169
16169
  function removeRefreshToken() {
16170
16170
  removeData('refreshtoken');
16171
16171
  }
16172
- function updateToken() {
16173
- var loginState = getLoginState();
16174
- if (!loginState.islogin && loginState.type <= 1) {
16175
- console.warn('当前未登录/token过期,不支持自动刷新token。');
16176
- return false;
16177
- }
16178
- if (loginState.role === 'center') {
16179
- console.warn('当前登录为产品运营中心用户,不支持自动刷新token。');
16180
- return false;
16181
- }
16182
- var token = getToken();
16183
- var refreshtoken = getRefreshToken();
16184
- var sendToken = checkLoginByToken(token) ? token : refreshtoken;
16185
- return normalAxios$1.get('/api/auth/refreshtoken', {
16186
- params: {
16187
- refreshtoken: sendToken
16188
- },
16189
- isShowLoading: false,
16190
- isShowErrorMessage: false,
16191
- isSendToken: false,
16192
- isSendTecode: true,
16193
- headers: {
16194
- token: sendToken
16195
- }
16196
- }).then(function (res) {
16197
- // console.log(res)
16198
- var data = res === null || res === void 0 ? void 0 : res.data;
16199
- if (data) {
16200
- setToken(data.token);
16201
- setRefreshToken(data.refreshtoken);
16202
- setTokenExpires(data.tokenexpires);
16203
- }
16204
- });
16205
- }
16206
- var refreshtokenTimer = null;
16207
- function startRefreshtoken() {
16208
- var loginState = getLoginState();
16209
- // 如果是产品运营中心 则不走刷新token流程
16210
- if (loginState.role === 'center') {
16211
- console.warn('当前登录为产品运营中心用户,不支持自动刷新token。');
16212
- return false;
16213
- }
16214
- // stopRefreshtoken()
16215
- clearTimeout(refreshtokenTimer);
16216
- refreshtokenTimer = null;
16217
- // 如果有登录 但 refreshtoken 不是完整 token 则10秒后【需要等单点登录走完后才刷新不然会被覆盖】刷新一次取到完整 token
16218
- // 如果有登录 且 refreshtoken 是完整 token 如果剩余时间大于10分钟 则每隔10分钟刷一次 否则过期前15秒更新 token
16219
- // 如果没登录 每隔10秒走token更新逻辑(如果刚开始没登录 后面才登录【不需要再在登陆后写刷新token逻辑】)
16220
- var time = 0;
16221
- if (loginState.islogin) {
16222
- var user = getUserByToken(getRefreshToken());
16223
- if (user !== null && user !== void 0 && user.tokenId) {
16224
- time = Number(getTokenExpires()) - Date.now() - 1000 * 15;
16225
- // 如果剩余时间大于10分钟 则每隔10分钟刷一次
16226
- if (time > 600000) {
16227
- time = 600000;
16228
- } else if (time < 0) {
16229
- time = 0;
16230
- }
16231
- } else {
16232
- time = 10000;
16233
- }
16234
- } else {
16235
- if (loginState.type === 2) {
16236
- time = 0;
16237
- } else {
16238
- time = 10000;
16239
- }
16240
- }
16241
- // time = 5000
16242
- refreshtokenTimer = window.setTimeout( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/_regeneratorRuntime$1().mark(function _callee() {
16243
- return _regeneratorRuntime$1().wrap(function _callee$(_context) {
16244
- while (1) switch (_context.prev = _context.next) {
16245
- case 0:
16246
- if (!(getLoginState().type >= 2)) {
16247
- _context.next = 3;
16248
- break;
16249
- }
16250
- _context.next = 3;
16251
- return updateToken();
16252
- case 3:
16253
- startRefreshtoken();
16254
- case 4:
16255
- case "end":
16256
- return _context.stop();
16257
- }
16258
- }, _callee);
16259
- })), time);
16260
- }
16261
16172
  function getUser(key) {
16262
16173
  var user = getData('user');
16263
16174
  var userObj = user ? JSON.parse(user) : null;
@@ -16620,16 +16531,116 @@ function _requestAndSetTenantSetting() {
16620
16531
  function removeTenantSetting() {
16621
16532
  lsProxy.removeItem('tenantsetting');
16622
16533
  }
16534
+ function updateToken() {
16535
+ var loginState = getLoginState();
16536
+ if (!loginState.islogin && loginState.type <= 1) {
16537
+ console.warn('当前未登录/token过期,不支持自动刷新token。');
16538
+ return false;
16539
+ }
16540
+ if (loginState.role === 'center') {
16541
+ console.warn('当前登录为产品运营中心用户,不支持自动刷新token。');
16542
+ return false;
16543
+ }
16544
+ var token = getToken();
16545
+ var refreshtoken = getRefreshToken();
16546
+ var sendToken = checkLoginByToken(token) ? token : refreshtoken;
16547
+ return normalAxios$1.get('/api/auth/refreshtoken', {
16548
+ params: {
16549
+ refreshtoken: sendToken
16550
+ },
16551
+ isShowLoading: false,
16552
+ isShowErrorMessage: false,
16553
+ isSendToken: false,
16554
+ isSendTecode: true,
16555
+ headers: {
16556
+ token: sendToken
16557
+ }
16558
+ }).then(function (res) {
16559
+ // console.log(res)
16560
+ var data = res === null || res === void 0 ? void 0 : res.data;
16561
+ if (data) {
16562
+ setToken(data.token);
16563
+ setRefreshToken(data.refreshtoken);
16564
+ setTokenExpires(data.tokenexpires);
16565
+ }
16566
+ });
16567
+ }
16568
+ var refreshtokenTimer = null;
16569
+ function startRefreshtoken() {
16570
+ var loginState = getLoginState();
16571
+ // 如果是产品运营中心 则不走刷新token流程
16572
+ if (loginState.role === 'center') {
16573
+ console.warn('当前登录为产品运营中心用户,不支持自动刷新token。');
16574
+ return false;
16575
+ }
16576
+ // stopRefreshtoken()
16577
+ clearTimeout(refreshtokenTimer);
16578
+ refreshtokenTimer = null;
16579
+ // 如果有登录 但 refreshtoken 不是完整 token 则10秒后【需要等单点登录走完后才刷新不然会被覆盖】刷新一次取到完整 token
16580
+ // 如果有登录 且 refreshtoken 是完整 token 如果剩余时间大于10分钟 则每隔10分钟刷一次 否则过期前15秒更新 token
16581
+ // 如果没登录 每隔10秒走token更新逻辑(如果刚开始没登录 后面才登录【不需要再在登陆后写刷新token逻辑】)
16582
+ var time = 0;
16583
+ if (loginState.islogin) {
16584
+ var user = getUserByToken(getRefreshToken());
16585
+ if (user !== null && user !== void 0 && user.tokenId) {
16586
+ time = Number(getTokenExpires()) - Date.now() - 1000 * 15;
16587
+ // 如果剩余时间大于10分钟 则每隔10分钟刷一次
16588
+ if (time > 600000) {
16589
+ time = 600000;
16590
+ } else if (time < 0) {
16591
+ time = 0;
16592
+ }
16593
+ } else {
16594
+ time = 10000;
16595
+ }
16596
+ } else {
16597
+ if (loginState.type === 2) {
16598
+ time = 0;
16599
+ } else {
16600
+ console.error('未登录,10秒后尝试更新token');
16601
+ time = 30000;
16602
+ }
16603
+ }
16604
+ // time = 5000
16605
+ refreshtokenTimer = window.setTimeout( /*#__PURE__*/_asyncToGenerator$1( /*#__PURE__*/_regeneratorRuntime$1().mark(function _callee() {
16606
+ return _regeneratorRuntime$1().wrap(function _callee$(_context) {
16607
+ while (1) switch (_context.prev = _context.next) {
16608
+ case 0:
16609
+ if (!(getLoginState().type >= 2)) {
16610
+ _context.next = 3;
16611
+ break;
16612
+ }
16613
+ _context.next = 3;
16614
+ return updateToken();
16615
+ case 3:
16616
+ startRefreshtoken();
16617
+ case 4:
16618
+ case "end":
16619
+ return _context.stop();
16620
+ }
16621
+ }, _callee);
16622
+ })), time);
16623
+ }
16623
16624
  // 单点登录
16624
16625
  function singleLogin(_x3) {
16625
16626
  return _singleLogin.apply(this, arguments);
16626
16627
  }
16627
16628
  function _singleLogin() {
16628
16629
  _singleLogin = _asyncToGenerator$1( /*#__PURE__*/_regeneratorRuntime$1().mark(function _callee6(query) {
16629
- var flag, token, refreshtoken, tokenexpires, envname, context, isneedlogin, loginRole, refreshTokenUser, tokenUser, nowEnvname, envData;
16630
+ var flag, token, refreshtoken, tokenexpires, envname, context, setBaseInfo, isneedlogin, loginRole, refreshTokenUser, tokenUser, nowEnvname, envData;
16630
16631
  return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
16631
16632
  while (1) switch (_context6.prev = _context6.next) {
16632
16633
  case 0:
16634
+ setBaseInfo = function _setBaseInfo() {
16635
+ setToken(token);
16636
+ setUserByToken(token); // 解析token为用户信息存入
16637
+ refreshtoken ? setRefreshToken(refreshtoken) : removeRefreshToken();
16638
+ tokenexpires ? setTokenExpires(tokenexpires) : removeTokenExpires();
16639
+ envname ? setQueryEnvname(envname) : removeQueryEnvname();
16640
+ // context 上下文字段 产品运营中心安装 卸载 配置 和 产品配置中心业务配置 页面需要用到
16641
+ // web 端有传 app没传 需要做兼容
16642
+ context && lsProxy.setItem('context', decodeURIComponent(context));
16643
+ };
16633
16644
  query = cloneDeep$1(query);
16634
16645
  flag = false; // 是否登录成功
16635
16646
  token = query.token;
@@ -16638,7 +16649,7 @@ function _singleLogin() {
16638
16649
  envname = query.envname;
16639
16650
  context = query.context;
16640
16651
  if (!checkLoginByToken(token)) {
16641
- _context6.next = 52;
16652
+ _context6.next = 60;
16642
16653
  break;
16643
16654
  }
16644
16655
  isneedlogin = true; // 是否需要走单点登录流程
@@ -16660,113 +16671,121 @@ function _singleLogin() {
16660
16671
  // isneedlogin = true
16661
16672
  // debugger
16662
16673
  if (!isneedlogin) {
16663
- _context6.next = 50;
16674
+ _context6.next = 58;
16664
16675
  break;
16665
16676
  }
16666
- setToken(token);
16667
- setUserByToken(token); // 解析token为用户信息存入
16668
- refreshtoken ? setRefreshToken(refreshtoken) : removeRefreshToken();
16669
- tokenexpires ? setTokenExpires(tokenexpires) : removeTokenExpires();
16670
- envname ? setQueryEnvname(envname) : removeQueryEnvname();
16671
- // context 上下文字段 产品运营中心安装 卸载 配置 和 产品配置中心业务配置 页面需要用到
16672
- // web 端有传 app没传 需要做兼容
16673
- context && lsProxy.setItem('context', decodeURIComponent(context));
16674
- // 单点登录写入 token 之后 换取完整的 refreshtoken
16675
- try {
16676
- if (checkLogin()) {
16677
- refreshTokenUser = getUserByToken(getRefreshToken());
16678
- tokenUser = getUserByToken(getToken());
16679
- if (!(refreshTokenUser !== null && refreshTokenUser !== void 0 && refreshTokenUser.tokenId) && tokenUser !== null && tokenUser !== void 0 && tokenUser.tokenId) {
16680
- updateToken();
16681
- }
16682
- }
16683
- } catch (err) {
16684
- console.error(err);
16677
+ setBaseInfo();
16678
+ // 单点登录写入 token 之后
16679
+ // 1、如果 refreshtoken 不完整 则换取完整的 refreshtoken
16680
+ _context6.prev = 14;
16681
+ if (!checkLogin()) {
16682
+ _context6.next = 21;
16683
+ break;
16684
+ }
16685
+ refreshTokenUser = getUserByToken(getRefreshToken());
16686
+ tokenUser = getUserByToken(getToken());
16687
+ if (!(!(refreshTokenUser !== null && refreshTokenUser !== void 0 && refreshTokenUser.tokenId) && tokenUser !== null && tokenUser !== void 0 && tokenUser.tokenId)) {
16688
+ _context6.next = 21;
16689
+ break;
16685
16690
  }
16686
- // 获取环境信息和租户配置信息
16687
16691
  _context6.next = 21;
16688
- return getEnvname();
16692
+ return updateToken();
16689
16693
  case 21:
16694
+ _context6.next = 26;
16695
+ break;
16696
+ case 23:
16697
+ _context6.prev = 23;
16698
+ _context6.t0 = _context6["catch"](14);
16699
+ console.error(_context6.t0);
16700
+ case 26:
16701
+ // 2、重新计算刷新 token 时间 因为刚开始进入就 startRefreshtoken 检测到没有 token 会过10秒才执行刷新 token 操作
16702
+ startRefreshtoken();
16703
+ // 获取环境信息和租户配置信息
16704
+ _context6.next = 29;
16705
+ return getEnvname();
16706
+ case 29:
16690
16707
  nowEnvname = _context6.sent;
16691
16708
  if (!nowEnvname) {
16692
- _context6.next = 42;
16709
+ _context6.next = 50;
16693
16710
  break;
16694
16711
  }
16695
- _context6.next = 25;
16712
+ _context6.next = 33;
16696
16713
  return requestEnvdata(nowEnvname);
16697
- case 25:
16714
+ case 33:
16698
16715
  envData = _context6.sent;
16699
16716
  if (!envData) {
16700
- _context6.next = 38;
16717
+ _context6.next = 46;
16701
16718
  break;
16702
16719
  }
16703
16720
  saveEnvdata(envData);
16704
16721
  if (!envData.tenantcode) {
16705
- _context6.next = 34;
16722
+ _context6.next = 42;
16706
16723
  break;
16707
16724
  }
16708
16725
  setTecode(envData.tenantcode);
16709
16726
  // 租户配置
16710
- _context6.next = 32;
16727
+ _context6.next = 40;
16711
16728
  return requestAndSetTenantSetting(envData.tenantcode);
16712
- case 32:
16713
- _context6.next = 36;
16729
+ case 40:
16730
+ _context6.next = 44;
16714
16731
  break;
16715
- case 34:
16732
+ case 42:
16716
16733
  removeTenantSetting();
16717
16734
  removeTecode();
16718
- case 36:
16719
- _context6.next = 40;
16735
+ case 44:
16736
+ _context6.next = 48;
16720
16737
  break;
16721
- case 38:
16738
+ case 46:
16722
16739
  removeEnvdata();
16723
16740
  removeTecode();
16724
- case 40:
16725
- _context6.next = 44;
16741
+ case 48:
16742
+ _context6.next = 52;
16726
16743
  break;
16727
- case 42:
16744
+ case 50:
16728
16745
  removeEnvdata();
16729
16746
  removeTecode();
16730
- case 44:
16731
- _context6.next = 46;
16747
+ case 52:
16748
+ _context6.next = 54;
16732
16749
  return getAndSetTenant();
16733
- case 46:
16734
- _context6.next = 48;
16750
+ case 54:
16751
+ _context6.next = 56;
16735
16752
  return getAndSetUserInfo();
16736
- case 48:
16753
+ case 56:
16737
16754
  // 单点登录后 获取 web 开发者模式 如果是则设置 isdebugger
16738
16755
  urlquery.dealWebDebugger();
16739
16756
  flag = true;
16740
- case 50:
16741
- _context6.next = 54;
16757
+ case 58:
16758
+ _context6.next = 63;
16742
16759
  break;
16743
- case 52:
16760
+ case 60:
16744
16761
  flag = false;
16745
- console.error('没传 token 或所传 token 已过期,无法单点登录。');
16746
- case 54:
16762
+ setBaseInfo(); // 传递的token过期依然写入 如果不写入的话 有可能之前的token本来没过期 页面依然可用
16763
+ console.error('单点登录失败,请检查链接所传 token/refreshtoken/tokenexpires 是否非法或过期。');
16764
+ case 63:
16747
16765
  if (!flag) {
16748
- _context6.next = 57;
16766
+ _context6.next = 66;
16749
16767
  break;
16750
16768
  }
16751
- _context6.next = 57;
16769
+ _context6.next = 66;
16752
16770
  return core$1.initGetData();
16753
- case 57:
16754
- // 单点登录后 无论是否成功 都需要删除 query 中相关参数
16755
- token && delete query.token;
16756
- refreshtoken && delete query.refreshtoken;
16757
- tokenexpires && delete query.tokenexpires;
16758
- envname && delete query.envname;
16759
- context && delete query.context;
16760
- // debugger
16771
+ case 66:
16772
+ if (flag) {
16773
+ // 单点登录成功 需要删除 query 中相关参数
16774
+ token && delete query.token;
16775
+ refreshtoken && delete query.refreshtoken;
16776
+ tokenexpires && delete query.tokenexpires;
16777
+ envname && delete query.envname;
16778
+ context && delete query.context;
16779
+ }
16761
16780
  return _context6.abrupt("return", {
16762
16781
  flag: flag,
16763
16782
  query: query
16764
16783
  });
16765
- case 63:
16784
+ case 68:
16766
16785
  case "end":
16767
16786
  return _context6.stop();
16768
16787
  }
16769
- }, _callee6);
16788
+ }, _callee6, null, [[14, 23]]);
16770
16789
  }));
16771
16790
  return _singleLogin.apply(this, arguments);
16772
16791
  }
@@ -16780,7 +16799,7 @@ function installAuth(options) {
16780
16799
  while (1) switch (_context2.prev = _context2.next) {
16781
16800
  case 0:
16782
16801
  if (!to.query.token) {
16783
- _context2.next = 7;
16802
+ _context2.next = 8;
16784
16803
  break;
16785
16804
  }
16786
16805
  _context2.next = 3;
@@ -16794,14 +16813,14 @@ function installAuth(options) {
16794
16813
  query: singleLoginRes.query
16795
16814
  });
16796
16815
  } else {
16797
- console.error('单点登录失败,请检查链接所传 token 是否非法或过期。');
16798
16816
  next();
16799
16817
  }
16800
- _context2.next = 8;
16818
+ options.singleLoginCallback && options.singleLoginCallback(singleLoginRes);
16819
+ _context2.next = 9;
16801
16820
  break;
16802
- case 7:
16803
- next();
16804
16821
  case 8:
16822
+ next();
16823
+ case 9:
16805
16824
  case "end":
16806
16825
  return _context2.stop();
16807
16826
  }
@@ -68973,6 +68992,7 @@ var getDefaultGlobalOptions = function getDefaultGlobalOptions() {
68973
68992
  modulekey: arr[1] || '',
68974
68993
  moduleversion: arr[2] || '',
68975
68994
  storageproxyprefix: '',
68995
+ singleLoginCallback: null,
68976
68996
  router: null
68977
68997
  };
68978
68998
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart100/spu-web-plugin",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "dev": "npm run build:types && rollup -c -w",
package/src/index.ts CHANGED
@@ -42,6 +42,7 @@ const getDefaultGlobalOptions = () => {
42
42
  modulekey: arr[1] || '',
43
43
  moduleversion: arr[2] || '',
44
44
  storageproxyprefix: '',
45
+ singleLoginCallback: null,
45
46
  router: null
46
47
  }
47
48
  }
package/src/login.ts CHANGED
@@ -63,93 +63,6 @@ function removeRefreshToken() {
63
63
  removeData('refreshtoken')
64
64
  }
65
65
 
66
- function updateToken() {
67
- const loginState = getLoginState()
68
-
69
- if (!loginState.islogin && loginState.type <= 1) {
70
- console.warn('当前未登录/token过期,不支持自动刷新token。')
71
- return false
72
- }
73
-
74
- if (loginState.role === 'center') {
75
- console.warn('当前登录为产品运营中心用户,不支持自动刷新token。')
76
- return false
77
- }
78
-
79
- const token = getToken()
80
- const refreshtoken = getRefreshToken()
81
- const sendToken = checkLoginByToken(token) ? token : refreshtoken
82
- return axios
83
- .get('/api/auth/refreshtoken', {
84
- params: {
85
- refreshtoken: sendToken
86
- },
87
- isShowLoading: false,
88
- isShowErrorMessage: false,
89
- isSendToken: false,
90
- isSendTecode: true,
91
- headers: {
92
- token: sendToken
93
- }
94
- })
95
- .then((res: any) => {
96
- // console.log(res)
97
- const data = res?.data
98
- if (data) {
99
- setToken(data.token)
100
- setRefreshToken(data.refreshtoken)
101
- setTokenExpires(data.tokenexpires)
102
- }
103
- })
104
- }
105
-
106
- let refreshtokenTimer: number | null = null
107
-
108
- function startRefreshtoken() {
109
- const loginState = getLoginState()
110
- // 如果是产品运营中心 则不走刷新token流程
111
- if (loginState.role === 'center') {
112
- console.warn('当前登录为产品运营中心用户,不支持自动刷新token。')
113
- return false
114
- }
115
-
116
- // stopRefreshtoken()
117
- clearTimeout(refreshtokenTimer as number)
118
- refreshtokenTimer = null
119
-
120
- // 如果有登录 但 refreshtoken 不是完整 token 则10秒后【需要等单点登录走完后才刷新不然会被覆盖】刷新一次取到完整 token
121
- // 如果有登录 且 refreshtoken 是完整 token 如果剩余时间大于10分钟 则每隔10分钟刷一次 否则过期前15秒更新 token
122
- // 如果没登录 每隔10秒走token更新逻辑(如果刚开始没登录 后面才登录【不需要再在登陆后写刷新token逻辑】)
123
- let time = 0
124
- if (loginState.islogin) {
125
- const user = getUserByToken(getRefreshToken())
126
- if (user?.tokenId) {
127
- time = Number(getTokenExpires()) - Date.now() - 1000 * 15
128
- // 如果剩余时间大于10分钟 则每隔10分钟刷一次
129
- if (time > 600000) {
130
- time = 600000
131
- } else if (time < 0) {
132
- time = 0
133
- }
134
- } else {
135
- time = 10000
136
- }
137
- } else {
138
- if (loginState.type === 2) {
139
- time = 0
140
- } else {
141
- time = 10000
142
- }
143
- }
144
- // time = 5000
145
- refreshtokenTimer = window.setTimeout(async () => {
146
- if (getLoginState().type >= 2) {
147
- await updateToken()
148
- }
149
- startRefreshtoken()
150
- }, time)
151
- }
152
-
153
66
  function getUser(key?: string): any {
154
67
  const user = getData('user')
155
68
  const userObj = user ? JSON.parse(user) : null
@@ -479,6 +392,97 @@ function removeTenantSetting() {
479
392
  lsProxy.removeItem('tenantsetting')
480
393
  }
481
394
 
395
+
396
+ function updateToken() {
397
+ const loginState = getLoginState()
398
+
399
+ if (!loginState.islogin && loginState.type <= 1) {
400
+ console.warn('当前未登录/token过期,不支持自动刷新token。')
401
+ return false
402
+ }
403
+
404
+ if (loginState.role === 'center') {
405
+ console.warn('当前登录为产品运营中心用户,不支持自动刷新token。')
406
+ return false
407
+ }
408
+
409
+ const token = getToken()
410
+ const refreshtoken = getRefreshToken()
411
+ const sendToken = checkLoginByToken(token) ? token : refreshtoken
412
+ return axios
413
+ .get('/api/auth/refreshtoken', {
414
+ params: {
415
+ refreshtoken: sendToken
416
+ },
417
+ isShowLoading: false,
418
+ isShowErrorMessage: false,
419
+ isSendToken: false,
420
+ isSendTecode: true,
421
+ headers: {
422
+ token: sendToken
423
+ }
424
+ })
425
+ .then((res: any) => {
426
+ // console.log(res)
427
+ const data = res?.data
428
+ if (data) {
429
+ setToken(data.token)
430
+ setRefreshToken(data.refreshtoken)
431
+ setTokenExpires(data.tokenexpires)
432
+ }
433
+ })
434
+ }
435
+
436
+ let refreshtokenTimer: number | null = null
437
+
438
+ function startRefreshtoken() {
439
+ const loginState = getLoginState()
440
+ // 如果是产品运营中心 则不走刷新token流程
441
+ if (loginState.role === 'center') {
442
+ console.warn('当前登录为产品运营中心用户,不支持自动刷新token。')
443
+ return false
444
+ }
445
+
446
+ // stopRefreshtoken()
447
+ clearTimeout(refreshtokenTimer as number)
448
+ refreshtokenTimer = null
449
+
450
+ // 如果有登录 但 refreshtoken 不是完整 token 则10秒后【需要等单点登录走完后才刷新不然会被覆盖】刷新一次取到完整 token
451
+ // 如果有登录 且 refreshtoken 是完整 token 如果剩余时间大于10分钟 则每隔10分钟刷一次 否则过期前15秒更新 token
452
+ // 如果没登录 每隔10秒走token更新逻辑(如果刚开始没登录 后面才登录【不需要再在登陆后写刷新token逻辑】)
453
+ let time = 0
454
+ if (loginState.islogin) {
455
+ const user = getUserByToken(getRefreshToken())
456
+ if (user?.tokenId) {
457
+ time = Number(getTokenExpires()) - Date.now() - 1000 * 15
458
+ // 如果剩余时间大于10分钟 则每隔10分钟刷一次
459
+ if (time > 600000) {
460
+ time = 600000
461
+ } else if (time < 0) {
462
+ time = 0
463
+ }
464
+ } else {
465
+ time = 10000
466
+ }
467
+ } else {
468
+ if (loginState.type === 2) {
469
+ time = 0
470
+ } else {
471
+ console.error('未登录,10秒后尝试更新token')
472
+ time = 30000
473
+ }
474
+ }
475
+ // time = 5000
476
+ refreshtokenTimer = window.setTimeout(async () => {
477
+ if (getLoginState().type >= 2) {
478
+ await updateToken()
479
+ }
480
+ startRefreshtoken()
481
+ }, time)
482
+ }
483
+
484
+
485
+
482
486
  // 单点登录
483
487
  async function singleLogin(query: IAny) {
484
488
  query = cloneDeep(query)
@@ -490,6 +494,17 @@ async function singleLogin(query: IAny) {
490
494
  const envname = query.envname
491
495
  const context = query.context
492
496
 
497
+ function setBaseInfo() {
498
+ setToken(token)
499
+ setUserByToken(token) // 解析token为用户信息存入
500
+ refreshtoken ? setRefreshToken(refreshtoken) : removeRefreshToken()
501
+ tokenexpires ? setTokenExpires(tokenexpires) : removeTokenExpires()
502
+ envname ? setQueryEnvname(envname) : removeQueryEnvname()
503
+ // context 上下文字段 产品运营中心安装 卸载 配置 和 产品配置中心业务配置 页面需要用到
504
+ // web 端有传 app没传 需要做兼容
505
+ context && lsProxy.setItem('context', decodeURIComponent(context))
506
+ }
507
+
493
508
  if (checkLoginByToken(token)) {
494
509
  let isneedlogin = true // 是否需要走单点登录流程
495
510
  const loginRole = getRoleByToken(token)
@@ -517,29 +532,23 @@ async function singleLogin(query: IAny) {
517
532
  // debugger
518
533
 
519
534
  if (isneedlogin) {
520
- setToken(token)
521
- setUserByToken(token) // 解析token为用户信息存入
535
+ setBaseInfo()
522
536
 
523
- refreshtoken ? setRefreshToken(refreshtoken) : removeRefreshToken()
524
- tokenexpires ? setTokenExpires(tokenexpires) : removeTokenExpires()
525
- envname ? setQueryEnvname(envname) : removeQueryEnvname()
526
-
527
- // context 上下文字段 产品运营中心安装 卸载 配置 和 产品配置中心业务配置 页面需要用到
528
- // web 端有传 app没传 需要做兼容
529
- context && lsProxy.setItem('context', decodeURIComponent(context))
530
-
531
- // 单点登录写入 token 之后 换取完整的 refreshtoken
537
+ // 单点登录写入 token 之后
538
+ // 1、如果 refreshtoken 不完整 则换取完整的 refreshtoken
532
539
  try {
533
540
  if (checkLogin()) {
534
541
  const refreshTokenUser = getUserByToken(getRefreshToken())
535
542
  const tokenUser = getUserByToken(getToken())
536
543
  if (!refreshTokenUser?.tokenId && tokenUser?.tokenId) {
537
- updateToken()
544
+ await updateToken()
538
545
  }
539
546
  }
540
547
  } catch (err) {
541
548
  console.error(err)
542
549
  }
550
+ // 2、重新计算刷新 token 时间 因为刚开始进入就 startRefreshtoken 检测到没有 token 会过10秒才执行刷新 token 操作
551
+ startRefreshtoken()
543
552
 
544
553
  // 获取环境信息和租户配置信息
545
554
  const nowEnvname = await getEnvname()
@@ -575,7 +584,8 @@ async function singleLogin(query: IAny) {
575
584
  }
576
585
  } else {
577
586
  flag = false
578
- console.error('没传 token 或所传 token 已过期,无法单点登录。')
587
+ setBaseInfo() // 传递的token过期依然写入 如果不写入的话 有可能之前的token本来没过期 页面依然可用
588
+ console.error('单点登录失败,请检查链接所传 token/refreshtoken/tokenexpires 是否非法或过期。')
579
589
  }
580
590
 
581
591
  // 登录成功之后 获取spu信息
@@ -583,14 +593,14 @@ async function singleLogin(query: IAny) {
583
593
  await core.initGetData()
584
594
  }
585
595
 
586
- // 单点登录后 无论是否成功 都需要删除 query 中相关参数
587
- token && delete query.token
588
- refreshtoken && delete query.refreshtoken
589
- tokenexpires && delete query.tokenexpires
590
- envname && delete query.envname
591
- context && delete query.context
592
-
593
- // debugger
596
+ if (flag) {
597
+ // 单点登录成功 需要删除 query 中相关参数
598
+ token && delete query.token
599
+ refreshtoken && delete query.refreshtoken
600
+ tokenexpires && delete query.tokenexpires
601
+ envname && delete query.envname
602
+ context && delete query.context
603
+ }
594
604
 
595
605
  return {
596
606
  flag,
@@ -617,9 +627,9 @@ function installAuth(options: any) {
617
627
  query: singleLoginRes.query
618
628
  })
619
629
  } else {
620
- console.error('单点登录失败,请检查链接所传 token 是否非法或过期。')
621
630
  next()
622
631
  }
632
+ options.singleLoginCallback && options.singleLoginCallback(singleLoginRes)
623
633
  } else {
624
634
  next()
625
635
  }