xydata-tools 1.1.3 → 1.1.4
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.
|
@@ -6,53 +6,239 @@ import React, { useEffect } from 'react';
|
|
|
6
6
|
import { getSessionStorage, setSessionStorage, removeSessionStorage } from "../../utils/token.js";
|
|
7
7
|
import { message, Spin } from 'antd';
|
|
8
8
|
import { queryAaaCurrent, queryCurrent, accountLogout, accountAAALogout } from "../../services/service.js";
|
|
9
|
+
|
|
10
|
+
// ========== 公共辅助函数 ==========
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 安全解析环境数据
|
|
14
|
+
* 从 sessionStorage 中读取并解析环境配置数据
|
|
15
|
+
* @returns {Object} 环境数据对象,解析失败时返回空对象
|
|
16
|
+
*/
|
|
17
|
+
var getEnvData = function getEnvData() {
|
|
18
|
+
var envDataStr = getSessionStorage('env_data');
|
|
19
|
+
if (!envDataStr) return {};
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(envDataStr);
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.error('解析 env_data 失败:', e);
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 获取通用请求头
|
|
30
|
+
* @returns {Object} 包含 SID 和 service 的请求头对象
|
|
31
|
+
*/
|
|
32
|
+
var getCommonHeaders = function getCommonHeaders() {
|
|
33
|
+
var service = getSessionStorage('service');
|
|
34
|
+
return {
|
|
35
|
+
SID: SID,
|
|
36
|
+
service: service
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 保存 Token 并跳转到重定向地址
|
|
42
|
+
* @param {string} token - 用户认证令牌
|
|
43
|
+
*/
|
|
44
|
+
var saveTokenAndRedirect = function saveTokenAndRedirect(token) {
|
|
45
|
+
setSessionStorage('Token', token);
|
|
46
|
+
var redirectUrl = getSessionStorage('sso_redirect_url');
|
|
47
|
+
if (redirectUrl) {
|
|
48
|
+
window.location.href = redirectUrl;
|
|
49
|
+
} else {
|
|
50
|
+
message.error('统一登陆跳转异常');
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* SSO 新版登录处理
|
|
56
|
+
* 调用新版 SSO 登录接口获取 token
|
|
57
|
+
* @async
|
|
58
|
+
*/
|
|
59
|
+
var ssoTypeByNew = /*#__PURE__*/function () {
|
|
60
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
61
|
+
var commonHeaders, response, result, href;
|
|
62
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
63
|
+
while (1) switch (_context.prev = _context.next) {
|
|
64
|
+
case 0:
|
|
65
|
+
commonHeaders = getCommonHeaders();
|
|
66
|
+
_context.prev = 1;
|
|
67
|
+
_context.next = 4;
|
|
68
|
+
return fetch('/auth/login', {
|
|
69
|
+
headers: commonHeaders,
|
|
70
|
+
method: 'POST'
|
|
71
|
+
});
|
|
72
|
+
case 4:
|
|
73
|
+
response = _context.sent;
|
|
74
|
+
_context.next = 7;
|
|
75
|
+
return response.json();
|
|
76
|
+
case 7:
|
|
77
|
+
result = _context.sent;
|
|
78
|
+
if (result.rspCode === '000000') {
|
|
79
|
+
saveTokenAndRedirect(result.data);
|
|
80
|
+
} else {
|
|
81
|
+
message.error(result.rspMsg);
|
|
82
|
+
if (result.data) {
|
|
83
|
+
href = result.data + '?callback=' + encodeURIComponent(window.location.href);
|
|
84
|
+
setTimeout(function () {
|
|
85
|
+
window.location.href = href;
|
|
86
|
+
}, 1000);
|
|
87
|
+
} else if (result.rspCode === '999000') {
|
|
88
|
+
location.reload();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
_context.next = 15;
|
|
92
|
+
break;
|
|
93
|
+
case 11:
|
|
94
|
+
_context.prev = 11;
|
|
95
|
+
_context.t0 = _context["catch"](1);
|
|
96
|
+
console.error('/auth/login 错误:', _context.t0);
|
|
97
|
+
message.error('网络请求失败,请稍后重试');
|
|
98
|
+
case 15:
|
|
99
|
+
case "end":
|
|
100
|
+
return _context.stop();
|
|
101
|
+
}
|
|
102
|
+
}, _callee, null, [[1, 11]]);
|
|
103
|
+
}));
|
|
104
|
+
return function ssoTypeByNew() {
|
|
105
|
+
return _ref.apply(this, arguments);
|
|
106
|
+
};
|
|
107
|
+
}();
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 获取 SSO 跳转地址
|
|
111
|
+
* 从服务器获取 SSO 登录页面地址并跳转
|
|
112
|
+
* @async
|
|
113
|
+
*/
|
|
114
|
+
var fetchSSO = /*#__PURE__*/function () {
|
|
115
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
116
|
+
var commonHeaders, response, data;
|
|
117
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
118
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
119
|
+
case 0:
|
|
120
|
+
commonHeaders = getCommonHeaders();
|
|
121
|
+
_context2.prev = 1;
|
|
122
|
+
_context2.next = 4;
|
|
123
|
+
return fetch('/auth/sso', {
|
|
124
|
+
headers: commonHeaders
|
|
125
|
+
});
|
|
126
|
+
case 4:
|
|
127
|
+
response = _context2.sent;
|
|
128
|
+
if (!(response.status === 200)) {
|
|
129
|
+
_context2.next = 12;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
_context2.next = 8;
|
|
133
|
+
return response.text();
|
|
134
|
+
case 8:
|
|
135
|
+
data = _context2.sent;
|
|
136
|
+
window.location.href = data;
|
|
137
|
+
_context2.next = 13;
|
|
138
|
+
break;
|
|
139
|
+
case 12:
|
|
140
|
+
message.error('接口异常,请联系管理员');
|
|
141
|
+
case 13:
|
|
142
|
+
_context2.next = 19;
|
|
143
|
+
break;
|
|
144
|
+
case 15:
|
|
145
|
+
_context2.prev = 15;
|
|
146
|
+
_context2.t0 = _context2["catch"](1);
|
|
147
|
+
console.error('/auth/sso 错误:', _context2.t0);
|
|
148
|
+
message.error('网络请求失败,请稍后重试');
|
|
149
|
+
case 19:
|
|
150
|
+
case "end":
|
|
151
|
+
return _context2.stop();
|
|
152
|
+
}
|
|
153
|
+
}, _callee2, null, [[1, 15]]);
|
|
154
|
+
}));
|
|
155
|
+
return function fetchSSO() {
|
|
156
|
+
return _ref2.apply(this, arguments);
|
|
157
|
+
};
|
|
158
|
+
}();
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* SSO 旧版登录处理
|
|
162
|
+
* 处理 URL 中的 code 参数,获取 token 或跳转到 SSO 登录页
|
|
163
|
+
* @async
|
|
164
|
+
*/
|
|
165
|
+
var ssoTypeByOld = /*#__PURE__*/function () {
|
|
166
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
|
167
|
+
var urlParams, code, commonHeaders, response, data, token;
|
|
168
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
169
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
170
|
+
case 0:
|
|
171
|
+
urlParams = new URLSearchParams(window.location.search);
|
|
172
|
+
code = urlParams.get('code');
|
|
173
|
+
if (!code) {
|
|
174
|
+
_context3.next = 21;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
commonHeaders = getCommonHeaders();
|
|
178
|
+
_context3.prev = 4;
|
|
179
|
+
_context3.next = 7;
|
|
180
|
+
return fetch('/auth/token?code=' + encodeURIComponent(code), {
|
|
181
|
+
headers: commonHeaders
|
|
182
|
+
});
|
|
183
|
+
case 7:
|
|
184
|
+
response = _context3.sent;
|
|
185
|
+
_context3.next = 10;
|
|
186
|
+
return response.json();
|
|
187
|
+
case 10:
|
|
188
|
+
data = _context3.sent;
|
|
189
|
+
token = data.access_token || (data.rspCode === '000000' ? data.data : null);
|
|
190
|
+
if (token) {
|
|
191
|
+
saveTokenAndRedirect(token);
|
|
192
|
+
} else {
|
|
193
|
+
message.error(data.rspMsg);
|
|
194
|
+
}
|
|
195
|
+
_context3.next = 19;
|
|
196
|
+
break;
|
|
197
|
+
case 15:
|
|
198
|
+
_context3.prev = 15;
|
|
199
|
+
_context3.t0 = _context3["catch"](4);
|
|
200
|
+
console.error('/auth/token 错误:', _context3.t0);
|
|
201
|
+
message.error('网络请求失败,请稍后重试');
|
|
202
|
+
case 19:
|
|
203
|
+
_context3.next = 22;
|
|
204
|
+
break;
|
|
205
|
+
case 21:
|
|
206
|
+
fetchSSO();
|
|
207
|
+
case 22:
|
|
208
|
+
case "end":
|
|
209
|
+
return _context3.stop();
|
|
210
|
+
}
|
|
211
|
+
}, _callee3, null, [[4, 15]]);
|
|
212
|
+
}));
|
|
213
|
+
return function ssoTypeByOld() {
|
|
214
|
+
return _ref3.apply(this, arguments);
|
|
215
|
+
};
|
|
216
|
+
}();
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* 清理会话数据
|
|
220
|
+
* 清除 Token 和 SSO 重定向地址
|
|
221
|
+
*/
|
|
222
|
+
var removeSessionData = function removeSessionData() {
|
|
223
|
+
removeSessionStorage('Token');
|
|
224
|
+
removeSessionStorage('sso_redirect_url');
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// ========== 组件定义 ==========
|
|
228
|
+
|
|
9
229
|
var XyAuthLayout = function XyAuthLayout(props) {
|
|
10
230
|
var children = props.children,
|
|
11
231
|
propsEnvData = props.envData,
|
|
12
232
|
propsService = props.service,
|
|
13
233
|
getUserOk = props.getUserOk,
|
|
14
234
|
getUserError = props.getUserError;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
var envDataStr = getSessionStorage('env_data');
|
|
19
|
-
if (!envDataStr) return {};
|
|
20
|
-
try {
|
|
21
|
-
return JSON.parse(envDataStr);
|
|
22
|
-
} catch (e) {
|
|
23
|
-
console.error('解析 env_data 失败:', e);
|
|
24
|
-
return {};
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
var envData = getEnvData();
|
|
235
|
+
|
|
236
|
+
// 获取环境数据,优先使用 props 传入的
|
|
237
|
+
var envData = propsEnvData || getEnvData();
|
|
28
238
|
var service = propsService || getSessionStorage('service');
|
|
29
239
|
var token = getSessionStorage('Token');
|
|
30
240
|
var loginType = envData.login_type || 'BOTH';
|
|
31
241
|
var pathName = window.location.pathname;
|
|
32
|
-
|
|
33
|
-
// 通用请求头参数
|
|
34
|
-
var commonHeaders = {
|
|
35
|
-
SID: SID,
|
|
36
|
-
service: service
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// 统一的错误处理
|
|
40
|
-
var handleError = function handleError(error) {
|
|
41
|
-
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
42
|
-
console.error(context ? "".concat(context, ":") : '错误:', error);
|
|
43
|
-
message.error('网络请求失败,请稍后重试');
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// 保存 Token 并跳转
|
|
47
|
-
var saveTokenAndRedirect = function saveTokenAndRedirect(token) {
|
|
48
|
-
setSessionStorage('Token', token);
|
|
49
|
-
var redirectUrl = getSessionStorage('sso_redirect_url');
|
|
50
|
-
if (redirectUrl) {
|
|
51
|
-
window.location.href = redirectUrl;
|
|
52
|
-
} else {
|
|
53
|
-
message.error('统一登陆跳转异常');
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
242
|
useEffect(function () {
|
|
57
243
|
if (!token) {
|
|
58
244
|
// 当登录方式设为两端登录时,可在路径加上sso进行统一登陆,当登录方式固定为SSO时,直接跳转到SSO登录
|
|
@@ -67,228 +253,64 @@ var XyAuthLayout = function XyAuthLayout(props) {
|
|
|
67
253
|
getUserinfo();
|
|
68
254
|
}
|
|
69
255
|
}, []);
|
|
70
|
-
|
|
71
|
-
// 处理 401 未授权错误(登录过期)
|
|
72
|
-
var handleUnauthorized = function handleUnauthorized() {
|
|
73
|
-
var actualLoginType = loginType;
|
|
74
|
-
if (loginType === 'BOTH') {
|
|
75
|
-
var redirectUrl = getSessionStorage('sso_redirect_url');
|
|
76
|
-
actualLoginType = redirectUrl ? 'SSO' : 'AAA';
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// 清理本地存储
|
|
80
|
-
removeSessionStorage('Token');
|
|
81
|
-
removeSessionStorage('sso_redirect_url');
|
|
82
|
-
|
|
83
|
-
// 根据实际登录类型重定向到对应的登录页面
|
|
84
|
-
if (actualLoginType === 'SSO') {
|
|
85
|
-
// SSO 登录过期,重新进行 SSO 登录流程
|
|
86
|
-
setSessionStorage('sso_redirect_url', window.location.href);
|
|
87
|
-
envData.sso_type === 'new' ? ssoTypeByNew() : ssoTypeByOld();
|
|
88
|
-
} else {
|
|
89
|
-
// AAA 登录过期,跳转到 AAA 登录页面
|
|
90
|
-
window.location.href = "".concat(window.publicPath, "user/login");
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
256
|
var getUserinfo = /*#__PURE__*/function () {
|
|
94
|
-
var
|
|
257
|
+
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
|
|
95
258
|
var response;
|
|
96
|
-
return _regeneratorRuntime().wrap(function
|
|
97
|
-
while (1) switch (
|
|
259
|
+
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
260
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
98
261
|
case 0:
|
|
99
|
-
|
|
262
|
+
_context4.prev = 0;
|
|
100
263
|
if (!(loginType === 'SSO')) {
|
|
101
|
-
|
|
264
|
+
_context4.next = 7;
|
|
102
265
|
break;
|
|
103
266
|
}
|
|
104
|
-
|
|
267
|
+
_context4.next = 4;
|
|
105
268
|
return queryCurrent({});
|
|
106
269
|
case 4:
|
|
107
|
-
|
|
108
|
-
|
|
270
|
+
_context4.t0 = _context4.sent;
|
|
271
|
+
_context4.next = 10;
|
|
109
272
|
break;
|
|
110
273
|
case 7:
|
|
111
|
-
|
|
274
|
+
_context4.next = 9;
|
|
112
275
|
return queryAaaCurrent({});
|
|
113
276
|
case 9:
|
|
114
|
-
|
|
277
|
+
_context4.t0 = _context4.sent;
|
|
115
278
|
case 10:
|
|
116
|
-
response =
|
|
279
|
+
response = _context4.t0;
|
|
117
280
|
if (!((response === null || response === void 0 ? void 0 : response.status) === 401 || (response === null || response === void 0 ? void 0 : response.rspCode) === '401')) {
|
|
118
|
-
|
|
281
|
+
_context4.next = 17;
|
|
119
282
|
break;
|
|
120
283
|
}
|
|
121
284
|
if (!getUserError) {
|
|
122
|
-
|
|
285
|
+
_context4.next = 15;
|
|
123
286
|
break;
|
|
124
287
|
}
|
|
125
288
|
getUserError(response);
|
|
126
|
-
return
|
|
289
|
+
return _context4.abrupt("return");
|
|
127
290
|
case 15:
|
|
128
291
|
// 否则自动处理登录过期
|
|
129
|
-
handleUnauthorized();
|
|
130
|
-
return
|
|
292
|
+
handleUnauthorized(envData);
|
|
293
|
+
return _context4.abrupt("return");
|
|
131
294
|
case 17:
|
|
132
295
|
if (response.rspCode === '000000') {
|
|
133
296
|
getUserOk && getUserOk(response.data);
|
|
134
297
|
} else {
|
|
135
298
|
getUserError && getUserError(response);
|
|
136
299
|
}
|
|
137
|
-
|
|
300
|
+
_context4.next = 24;
|
|
138
301
|
break;
|
|
139
302
|
case 20:
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
console.error('获取用户信息失败:',
|
|
143
|
-
getUserError && getUserError(
|
|
303
|
+
_context4.prev = 20;
|
|
304
|
+
_context4.t1 = _context4["catch"](0);
|
|
305
|
+
console.error('获取用户信息失败:', _context4.t1);
|
|
306
|
+
getUserError && getUserError(_context4.t1);
|
|
144
307
|
case 24:
|
|
145
|
-
case "end":
|
|
146
|
-
return _context.stop();
|
|
147
|
-
}
|
|
148
|
-
}, _callee, null, [[0, 20]]);
|
|
149
|
-
}));
|
|
150
|
-
return function getUserinfo() {
|
|
151
|
-
return _ref.apply(this, arguments);
|
|
152
|
-
};
|
|
153
|
-
}();
|
|
154
|
-
var ssoTypeByNew = /*#__PURE__*/function () {
|
|
155
|
-
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
156
|
-
var response, result, href;
|
|
157
|
-
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
158
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
159
|
-
case 0:
|
|
160
|
-
_context2.prev = 0;
|
|
161
|
-
_context2.next = 3;
|
|
162
|
-
return fetch('/auth/login', {
|
|
163
|
-
headers: commonHeaders,
|
|
164
|
-
method: 'POST'
|
|
165
|
-
});
|
|
166
|
-
case 3:
|
|
167
|
-
response = _context2.sent;
|
|
168
|
-
_context2.next = 6;
|
|
169
|
-
return response.json();
|
|
170
|
-
case 6:
|
|
171
|
-
result = _context2.sent;
|
|
172
|
-
if (result.rspCode === '000000') {
|
|
173
|
-
saveTokenAndRedirect(result.data);
|
|
174
|
-
} else {
|
|
175
|
-
message.error(result.rspMsg);
|
|
176
|
-
if (result.data) {
|
|
177
|
-
href = result.data + '?callback=' + encodeURIComponent(window.location.href);
|
|
178
|
-
setTimeout(function () {
|
|
179
|
-
window.location.href = href;
|
|
180
|
-
}, 1000);
|
|
181
|
-
} else if (result.rspCode === '999000') {
|
|
182
|
-
// 服务器响应超时
|
|
183
|
-
location.reload();
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
_context2.next = 13;
|
|
187
|
-
break;
|
|
188
|
-
case 10:
|
|
189
|
-
_context2.prev = 10;
|
|
190
|
-
_context2.t0 = _context2["catch"](0);
|
|
191
|
-
handleError(_context2.t0, '/auth/login');
|
|
192
|
-
case 13:
|
|
193
|
-
case "end":
|
|
194
|
-
return _context2.stop();
|
|
195
|
-
}
|
|
196
|
-
}, _callee2, null, [[0, 10]]);
|
|
197
|
-
}));
|
|
198
|
-
return function ssoTypeByNew() {
|
|
199
|
-
return _ref2.apply(this, arguments);
|
|
200
|
-
};
|
|
201
|
-
}();
|
|
202
|
-
var fetchSSO = /*#__PURE__*/function () {
|
|
203
|
-
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
|
204
|
-
var response, data;
|
|
205
|
-
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
206
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
207
|
-
case 0:
|
|
208
|
-
_context3.prev = 0;
|
|
209
|
-
_context3.next = 3;
|
|
210
|
-
return fetch('/auth/sso', {
|
|
211
|
-
headers: commonHeaders
|
|
212
|
-
});
|
|
213
|
-
case 3:
|
|
214
|
-
response = _context3.sent;
|
|
215
|
-
if (!(response.status === 200)) {
|
|
216
|
-
_context3.next = 11;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
_context3.next = 7;
|
|
220
|
-
return response.text();
|
|
221
|
-
case 7:
|
|
222
|
-
data = _context3.sent;
|
|
223
|
-
window.location.href = data;
|
|
224
|
-
_context3.next = 12;
|
|
225
|
-
break;
|
|
226
|
-
case 11:
|
|
227
|
-
message.error('接口异常,请联系管理员');
|
|
228
|
-
case 12:
|
|
229
|
-
_context3.next = 17;
|
|
230
|
-
break;
|
|
231
|
-
case 14:
|
|
232
|
-
_context3.prev = 14;
|
|
233
|
-
_context3.t0 = _context3["catch"](0);
|
|
234
|
-
handleError(_context3.t0, '/auth/sso');
|
|
235
|
-
case 17:
|
|
236
|
-
case "end":
|
|
237
|
-
return _context3.stop();
|
|
238
|
-
}
|
|
239
|
-
}, _callee3, null, [[0, 14]]);
|
|
240
|
-
}));
|
|
241
|
-
return function fetchSSO() {
|
|
242
|
-
return _ref3.apply(this, arguments);
|
|
243
|
-
};
|
|
244
|
-
}();
|
|
245
|
-
var ssoTypeByOld = /*#__PURE__*/function () {
|
|
246
|
-
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
|
|
247
|
-
var urlParams, code, response, data, _token;
|
|
248
|
-
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
249
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
250
|
-
case 0:
|
|
251
|
-
urlParams = new URLSearchParams(window.location.search);
|
|
252
|
-
code = urlParams.get('code');
|
|
253
|
-
if (!code) {
|
|
254
|
-
_context4.next = 19;
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
_context4.prev = 3;
|
|
258
|
-
_context4.next = 6;
|
|
259
|
-
return fetch('/auth/token?code=' + encodeURIComponent(code), {
|
|
260
|
-
headers: commonHeaders
|
|
261
|
-
});
|
|
262
|
-
case 6:
|
|
263
|
-
response = _context4.sent;
|
|
264
|
-
_context4.next = 9;
|
|
265
|
-
return response.json();
|
|
266
|
-
case 9:
|
|
267
|
-
data = _context4.sent;
|
|
268
|
-
_token = data.access_token || (data.rspCode === '000000' ? data.data : null);
|
|
269
|
-
if (_token) {
|
|
270
|
-
saveTokenAndRedirect(_token);
|
|
271
|
-
} else {
|
|
272
|
-
message.error(data.rspMsg);
|
|
273
|
-
}
|
|
274
|
-
_context4.next = 17;
|
|
275
|
-
break;
|
|
276
|
-
case 14:
|
|
277
|
-
_context4.prev = 14;
|
|
278
|
-
_context4.t0 = _context4["catch"](3);
|
|
279
|
-
handleError(_context4.t0, '/auth/token');
|
|
280
|
-
case 17:
|
|
281
|
-
_context4.next = 20;
|
|
282
|
-
break;
|
|
283
|
-
case 19:
|
|
284
|
-
fetchSSO();
|
|
285
|
-
case 20:
|
|
286
308
|
case "end":
|
|
287
309
|
return _context4.stop();
|
|
288
310
|
}
|
|
289
|
-
}, _callee4, null, [[
|
|
311
|
+
}, _callee4, null, [[0, 20]]);
|
|
290
312
|
}));
|
|
291
|
-
return function
|
|
313
|
+
return function getUserinfo() {
|
|
292
314
|
return _ref4.apply(this, arguments);
|
|
293
315
|
};
|
|
294
316
|
}();
|
|
@@ -313,22 +335,33 @@ var XyAuthLayout = function XyAuthLayout(props) {
|
|
|
313
335
|
};
|
|
314
336
|
export default XyAuthLayout;
|
|
315
337
|
|
|
316
|
-
//
|
|
338
|
+
// ========== 导出的工具函数 ==========
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* 退出登录的工具函数
|
|
342
|
+
* 根据登录类型执行相应的退出登录操作并跳转到登录页
|
|
343
|
+
* @async
|
|
344
|
+
* @param {string} [loginType='BOTH'] - 登录类型: 'SSO' | 'AAA' | 'BOTH'
|
|
345
|
+
* @example
|
|
346
|
+
* // AAA 登录退出
|
|
347
|
+
* await logout('AAA');
|
|
348
|
+
*
|
|
349
|
+
* // SSO 登录退出
|
|
350
|
+
* await logout('SSO');
|
|
351
|
+
*
|
|
352
|
+
* // 自动判断登录类型
|
|
353
|
+
* await logout('BOTH');
|
|
354
|
+
*/
|
|
317
355
|
export var logout = /*#__PURE__*/function () {
|
|
318
356
|
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
|
|
319
357
|
var loginType,
|
|
320
358
|
actualLoginType,
|
|
321
359
|
redirectUrl,
|
|
322
360
|
res,
|
|
323
|
-
removeSessionData,
|
|
324
361
|
_args5 = arguments;
|
|
325
362
|
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
326
363
|
while (1) switch (_context5.prev = _context5.next) {
|
|
327
364
|
case 0:
|
|
328
|
-
removeSessionData = function _removeSessionData() {
|
|
329
|
-
removeSessionStorage('Token');
|
|
330
|
-
removeSessionStorage('sso_redirect_url');
|
|
331
|
-
};
|
|
332
365
|
loginType = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : 'BOTH';
|
|
333
366
|
// 当 loginType 为 BOTH 时,根据 sessionStorage 中的 'sso_redirect_url' 判断实际登录方式
|
|
334
367
|
// 有 'sso_redirect_url' 说明使用的是 SSO 登录,否则是 AAA 登录
|
|
@@ -338,47 +371,80 @@ export var logout = /*#__PURE__*/function () {
|
|
|
338
371
|
actualLoginType = redirectUrl ? 'SSO' : 'AAA';
|
|
339
372
|
}
|
|
340
373
|
if (!(actualLoginType === 'AAA')) {
|
|
341
|
-
_context5.next =
|
|
374
|
+
_context5.next = 16;
|
|
342
375
|
break;
|
|
343
376
|
}
|
|
344
|
-
_context5.prev =
|
|
345
|
-
_context5.next =
|
|
377
|
+
_context5.prev = 4;
|
|
378
|
+
_context5.next = 7;
|
|
346
379
|
return accountAAALogout({});
|
|
347
|
-
case
|
|
380
|
+
case 7:
|
|
348
381
|
removeSessionData();
|
|
349
|
-
_context5.next =
|
|
382
|
+
_context5.next = 13;
|
|
350
383
|
break;
|
|
351
|
-
case
|
|
352
|
-
_context5.prev =
|
|
353
|
-
_context5.t0 = _context5["catch"](
|
|
384
|
+
case 10:
|
|
385
|
+
_context5.prev = 10;
|
|
386
|
+
_context5.t0 = _context5["catch"](4);
|
|
354
387
|
console.error('AAA 退出登录失败:', _context5.t0);
|
|
355
|
-
case
|
|
388
|
+
case 13:
|
|
356
389
|
window.location.href = "".concat(window.publicPath || '/', "user/login");
|
|
357
|
-
_context5.next =
|
|
390
|
+
_context5.next = 27;
|
|
358
391
|
break;
|
|
359
|
-
case
|
|
360
|
-
_context5.prev =
|
|
361
|
-
_context5.next =
|
|
392
|
+
case 16:
|
|
393
|
+
_context5.prev = 16;
|
|
394
|
+
_context5.next = 19;
|
|
362
395
|
return accountLogout({});
|
|
363
|
-
case
|
|
396
|
+
case 19:
|
|
364
397
|
res = _context5.sent;
|
|
365
398
|
removeSessionData();
|
|
366
399
|
if (res) {
|
|
367
400
|
window.location.href = res;
|
|
368
401
|
}
|
|
369
|
-
_context5.next =
|
|
402
|
+
_context5.next = 27;
|
|
370
403
|
break;
|
|
371
|
-
case
|
|
372
|
-
_context5.prev =
|
|
373
|
-
_context5.t1 = _context5["catch"](
|
|
404
|
+
case 24:
|
|
405
|
+
_context5.prev = 24;
|
|
406
|
+
_context5.t1 = _context5["catch"](16);
|
|
374
407
|
console.error('SSO 退出登录失败:', _context5.t1);
|
|
375
|
-
case
|
|
408
|
+
case 27:
|
|
376
409
|
case "end":
|
|
377
410
|
return _context5.stop();
|
|
378
411
|
}
|
|
379
|
-
}, _callee5, null, [[
|
|
412
|
+
}, _callee5, null, [[4, 10], [16, 24]]);
|
|
380
413
|
}));
|
|
381
414
|
return function logout() {
|
|
382
415
|
return _ref5.apply(this, arguments);
|
|
383
416
|
};
|
|
384
|
-
}();
|
|
417
|
+
}();
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* 处理 401 未授权错误(登录过期)的工具函数
|
|
421
|
+
* 清理本地存储并根据登录类型重定向到相应的登录页面
|
|
422
|
+
* @param {Object} envData - 环境配置数据
|
|
423
|
+
* @param {string} [envData.login_type] - 登录类型: 'SSO' | 'AAA' | 'BOTH'
|
|
424
|
+
* @param {string} [envData.sso_type] - SSO 类型: 'new' | 'old'
|
|
425
|
+
* @example
|
|
426
|
+
* // 在请求拦截器中使用
|
|
427
|
+
* if (response.status === 401) {
|
|
428
|
+
* handleUnauthorized({ login_type: 'BOTH', sso_type: 'new' });
|
|
429
|
+
* }
|
|
430
|
+
*/
|
|
431
|
+
export var handleUnauthorized = function handleUnauthorized(envData) {
|
|
432
|
+
var actualLoginType = envData.login_type || 'BOTH';
|
|
433
|
+
if (actualLoginType === 'BOTH') {
|
|
434
|
+
var redirectUrl = getSessionStorage('sso_redirect_url');
|
|
435
|
+
actualLoginType = redirectUrl ? 'SSO' : 'AAA';
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// 清理本地存储
|
|
439
|
+
removeSessionData();
|
|
440
|
+
|
|
441
|
+
// 根据实际登录类型重定向到对应的登录页面
|
|
442
|
+
if (actualLoginType === 'SSO') {
|
|
443
|
+
// SSO 登录过期,重新进行 SSO 登录流程
|
|
444
|
+
setSessionStorage('sso_redirect_url', window.location.href);
|
|
445
|
+
envData.sso_type === 'new' ? ssoTypeByNew() : ssoTypeByOld();
|
|
446
|
+
} else {
|
|
447
|
+
// AAA 登录过期,跳转到 AAA 登录页面
|
|
448
|
+
window.location.href = "".concat(window.publicPath, "user/login");
|
|
449
|
+
}
|
|
450
|
+
};
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export default XyAuthLayout;
|
|
2
2
|
export function logout(loginType?: string): Promise<void>;
|
|
3
|
+
export function handleUnauthorized(envData: {
|
|
4
|
+
login_type?: string;
|
|
5
|
+
sso_type?: string;
|
|
6
|
+
}): void;
|
|
3
7
|
declare function XyAuthLayout(props: any): import("react/jsx-runtime").JSX.Element;
|