sumor 3.3.2 → 3.3.3
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.
- package/dist/server/controllers/mock/avatarController.d.ts +8 -0
- package/dist/server/controllers/mock/avatarController.d.ts.map +1 -0
- package/dist/server/controllers/mock/avatarController.js +15 -0
- package/dist/server/controllers/mock/avatarController.js.map +1 -0
- package/dist/server/controllers/mock/loginController.d.ts +8 -0
- package/dist/server/controllers/mock/loginController.d.ts.map +1 -0
- package/dist/server/controllers/mock/loginController.js +34 -0
- package/dist/server/controllers/mock/loginController.js.map +1 -0
- package/dist/server/controllers/mock/logoutController.d.ts +8 -0
- package/dist/server/controllers/mock/logoutController.d.ts.map +1 -0
- package/dist/server/controllers/mock/logoutController.js +17 -0
- package/dist/server/controllers/mock/logoutController.js.map +1 -0
- package/dist/server/controllers/mock/navController.d.ts +8 -0
- package/dist/server/controllers/mock/navController.d.ts.map +1 -0
- package/dist/server/controllers/mock/navController.js +93 -0
- package/dist/server/controllers/mock/navController.js.map +1 -0
- package/dist/server/controllers/mock/tokenController.d.ts +8 -0
- package/dist/server/controllers/mock/tokenController.d.ts.map +1 -0
- package/dist/server/controllers/mock/tokenController.js +89 -0
- package/dist/server/controllers/mock/tokenController.js.map +1 -0
- package/dist/server/mock/mockConfig.d.ts +2 -4
- package/dist/server/mock/mockConfig.d.ts.map +1 -1
- package/dist/server/mock/mockConfig.js +11 -20
- package/dist/server/mock/mockConfig.js.map +1 -1
- package/dist/server/mock/mockRoutes.d.ts +13 -3
- package/dist/server/mock/mockRoutes.d.ts.map +1 -1
- package/dist/server/mock/mockRoutes.js +23 -85
- package/dist/server/mock/mockRoutes.js.map +1 -1
- package/dist/server/routes.d.ts +1 -2
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +21 -29
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/dist/server/mock/mockApiRoutes.d.ts +0 -14
- package/dist/server/mock/mockApiRoutes.d.ts.map +0 -1
- package/dist/server/mock/mockApiRoutes.js +0 -149
- package/dist/server/mock/mockApiRoutes.js.map +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/oauth/mock/avatar/:id
|
|
4
|
+
* mock 模式:无头像服务,直接返回 404
|
|
5
|
+
* 非 mock 模式:透传
|
|
6
|
+
*/
|
|
7
|
+
export declare function avatarController(_req: Request, res: Response, next: NextFunction): void;
|
|
8
|
+
//# sourceMappingURL=avatarController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatarController.d.ts","sourceRoot":"","sources":["../../../../server/controllers/mock/avatarController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,QAIhF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.avatarController = avatarController;
|
|
4
|
+
const mockConfig_1 = require("../../mock/mockConfig");
|
|
5
|
+
/**
|
|
6
|
+
* GET /api/oauth/mock/avatar/:id
|
|
7
|
+
* mock 模式:无头像服务,直接返回 404
|
|
8
|
+
* 非 mock 模式:透传
|
|
9
|
+
*/
|
|
10
|
+
function avatarController(_req, res, next) {
|
|
11
|
+
if (!(0, mockConfig_1.isMockMode)())
|
|
12
|
+
return next();
|
|
13
|
+
res.status(404).end();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=avatarController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatarController.js","sourceRoot":"","sources":["../../../../server/controllers/mock/avatarController.ts"],"names":[],"mappings":";;AAQA,4CAIC;AAXD,sDAAkD;AAElD;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAa,EAAE,GAAa,EAAE,IAAkB;IAC/E,IAAI,CAAC,IAAA,uBAAU,GAAE;QAAE,OAAO,IAAI,EAAE,CAAA;IAEhC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* POST /api/oauth/mock/login
|
|
4
|
+
* mock 模式:直接签发 mock token,写入 HttpOnly Cookie,并返回用户信息
|
|
5
|
+
* 非 mock 模式:透传
|
|
6
|
+
*/
|
|
7
|
+
export declare function loginController(_req: Request, res: Response, next: NextFunction): void | Response<any, Record<string, any>>;
|
|
8
|
+
//# sourceMappingURL=loginController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loginController.d.ts","sourceRoot":"","sources":["../../../../server/controllers/mock/loginController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAUzD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,6CAwB/E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loginController = loginController;
|
|
4
|
+
const mockConfig_1 = require("../../mock/mockConfig");
|
|
5
|
+
const mockTokenUtils_1 = require("../../mock/mockTokenUtils");
|
|
6
|
+
const oauthTokenUtils_1 = require("../../utils/oauthTokenUtils");
|
|
7
|
+
/**
|
|
8
|
+
* POST /api/oauth/mock/login
|
|
9
|
+
* mock 模式:直接签发 mock token,写入 HttpOnly Cookie,并返回用户信息
|
|
10
|
+
* 非 mock 模式:透传
|
|
11
|
+
*/
|
|
12
|
+
function loginController(_req, res, next) {
|
|
13
|
+
if (!(0, mockConfig_1.isMockMode)())
|
|
14
|
+
return next();
|
|
15
|
+
const { user } = (0, mockConfig_1.getMockConfig)();
|
|
16
|
+
const accessToken = (0, mockTokenUtils_1.generateMockAccessToken)(user);
|
|
17
|
+
const refreshToken = (0, mockTokenUtils_1.generateMockRefreshToken)(user);
|
|
18
|
+
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, accessToken, mockTokenUtils_1.MOCK_ACCESS_TOKEN_EXPIRES_IN, 'access');
|
|
19
|
+
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, refreshToken, mockTokenUtils_1.MOCK_REFRESH_TOKEN_EXPIRES_IN, 'refresh');
|
|
20
|
+
return res.json({
|
|
21
|
+
code: 'OK',
|
|
22
|
+
message: '登录成功',
|
|
23
|
+
data: {
|
|
24
|
+
isMock: true,
|
|
25
|
+
user: {
|
|
26
|
+
id: user.userId,
|
|
27
|
+
isVerified: user.isVerified,
|
|
28
|
+
roles: user.roles,
|
|
29
|
+
permissions: user.permissions
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=loginController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loginController.js","sourceRoot":"","sources":["../../../../server/controllers/mock/loginController.ts"],"names":[],"mappings":";;AAeA,0CAwBC;AAtCD,sDAAiE;AACjE,8DAKkC;AAClC,iEAAiE;AAEjE;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAAa,EAAE,GAAa,EAAE,IAAkB;IAC9E,IAAI,CAAC,IAAA,uBAAU,GAAE;QAAE,OAAO,IAAI,EAAE,CAAA;IAEhC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,0BAAa,GAAE,CAAA;IAEhC,MAAM,WAAW,GAAG,IAAA,wCAAuB,EAAC,IAAI,CAAC,CAAA;IACjD,MAAM,YAAY,GAAG,IAAA,yCAAwB,EAAC,IAAI,CAAC,CAAA;IAEnD,IAAA,qCAAmB,EAAC,GAAG,EAAE,WAAW,EAAE,6CAA4B,EAAE,QAAQ,CAAC,CAAA;IAC7E,IAAA,qCAAmB,EAAC,GAAG,EAAE,YAAY,EAAE,8CAA6B,EAAE,SAAS,CAAC,CAAA;IAEhF,OAAO,GAAG,CAAC,IAAI,CAAC;QACd,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,MAAM;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B;SACF;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* POST /api/oauth/mock/logout
|
|
4
|
+
* mock 模式:清除 mock token cookie
|
|
5
|
+
* 非 mock 模式:透传
|
|
6
|
+
*/
|
|
7
|
+
export declare function logoutController(_req: Request, res: Response, next: NextFunction): void | Response<any, Record<string, any>>;
|
|
8
|
+
//# sourceMappingURL=logoutController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logoutController.d.ts","sourceRoot":"","sources":["../../../../server/controllers/mock/logoutController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,6CAOhF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logoutController = logoutController;
|
|
4
|
+
const mockConfig_1 = require("../../mock/mockConfig");
|
|
5
|
+
/**
|
|
6
|
+
* POST /api/oauth/mock/logout
|
|
7
|
+
* mock 模式:清除 mock token cookie
|
|
8
|
+
* 非 mock 模式:透传
|
|
9
|
+
*/
|
|
10
|
+
function logoutController(_req, res, next) {
|
|
11
|
+
if (!(0, mockConfig_1.isMockMode)())
|
|
12
|
+
return next();
|
|
13
|
+
res.clearCookie('access_token');
|
|
14
|
+
res.clearCookie('refresh_token');
|
|
15
|
+
return res.json({ code: 'OK', message: '登出成功' });
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=logoutController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logoutController.js","sourceRoot":"","sources":["../../../../server/controllers/mock/logoutController.ts"],"names":[],"mappings":";;AAQA,4CAOC;AAdD,sDAAkD;AAElD;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAa,EAAE,GAAa,EAAE,IAAkB;IAC/E,IAAI,CAAC,IAAA,uBAAU,GAAE;QAAE,OAAO,IAAI,EAAE,CAAA;IAEhC,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;IAC/B,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;IAEhC,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/oauth/mock/nav/:target
|
|
4
|
+
* mock 模式:导航占位页,展示目标页面名称并提供回退按钮
|
|
5
|
+
* 非 mock 模式:透传
|
|
6
|
+
*/
|
|
7
|
+
export declare function navController(req: Request, res: Response, next: NextFunction): void;
|
|
8
|
+
//# sourceMappingURL=navController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navController.d.ts","sourceRoot":"","sources":["../../../../server/controllers/mock/navController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAUzD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,QA6E5E"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.navController = navController;
|
|
4
|
+
const mockConfig_1 = require("../../mock/mockConfig");
|
|
5
|
+
const NAV_LABELS = {
|
|
6
|
+
home: '首页',
|
|
7
|
+
site: '站点管理',
|
|
8
|
+
user: '用户中心',
|
|
9
|
+
feedback: '意见反馈'
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* GET /api/oauth/mock/nav/:target
|
|
13
|
+
* mock 模式:导航占位页,展示目标页面名称并提供回退按钮
|
|
14
|
+
* 非 mock 模式:透传
|
|
15
|
+
*/
|
|
16
|
+
function navController(req, res, next) {
|
|
17
|
+
if (!(0, mockConfig_1.isMockMode)())
|
|
18
|
+
return next();
|
|
19
|
+
const target = req.params['target'];
|
|
20
|
+
const label = NAV_LABELS[target] || target;
|
|
21
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
22
|
+
res.send(`<!DOCTYPE html>
|
|
23
|
+
<html lang="zh-CN">
|
|
24
|
+
<head>
|
|
25
|
+
<meta charset="UTF-8" />
|
|
26
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
27
|
+
<title>[Mock] ${label}</title>
|
|
28
|
+
<style>
|
|
29
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
30
|
+
body {
|
|
31
|
+
min-height: 100vh;
|
|
32
|
+
display: flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
36
|
+
background: #f5f5f5;
|
|
37
|
+
color: #333;
|
|
38
|
+
}
|
|
39
|
+
.card {
|
|
40
|
+
background: #fff;
|
|
41
|
+
border-radius: 12px;
|
|
42
|
+
box-shadow: 0 4px 24px rgba(0,0,0,.08);
|
|
43
|
+
padding: 48px 56px;
|
|
44
|
+
text-align: center;
|
|
45
|
+
max-width: 420px;
|
|
46
|
+
width: 90%;
|
|
47
|
+
}
|
|
48
|
+
.badge {
|
|
49
|
+
display: inline-block;
|
|
50
|
+
background: #fff3cd;
|
|
51
|
+
color: #856404;
|
|
52
|
+
font-size: 12px;
|
|
53
|
+
font-weight: 600;
|
|
54
|
+
letter-spacing: .5px;
|
|
55
|
+
padding: 3px 10px;
|
|
56
|
+
border-radius: 99px;
|
|
57
|
+
margin-bottom: 20px;
|
|
58
|
+
}
|
|
59
|
+
h1 {
|
|
60
|
+
font-size: 24px;
|
|
61
|
+
font-weight: 700;
|
|
62
|
+
margin-bottom: 8px;
|
|
63
|
+
}
|
|
64
|
+
p {
|
|
65
|
+
font-size: 14px;
|
|
66
|
+
color: #888;
|
|
67
|
+
margin-bottom: 32px;
|
|
68
|
+
line-height: 1.6;
|
|
69
|
+
}
|
|
70
|
+
button {
|
|
71
|
+
background: #333;
|
|
72
|
+
color: #fff;
|
|
73
|
+
border: none;
|
|
74
|
+
border-radius: 8px;
|
|
75
|
+
padding: 10px 28px;
|
|
76
|
+
font-size: 14px;
|
|
77
|
+
cursor: pointer;
|
|
78
|
+
transition: background .15s;
|
|
79
|
+
}
|
|
80
|
+
button:hover { background: #555; }
|
|
81
|
+
</style>
|
|
82
|
+
</head>
|
|
83
|
+
<body>
|
|
84
|
+
<div class="card">
|
|
85
|
+
<span class="badge">MOCK</span>
|
|
86
|
+
<h1>${label}</h1>
|
|
87
|
+
<p>当前处于 Mock 模式,此页面为占位页。<br/>真实环境中将跳转到 OAuth 服务的「${label}」页面。</p>
|
|
88
|
+
<button onclick="history.back()">返回上一页</button>
|
|
89
|
+
</div>
|
|
90
|
+
</body>
|
|
91
|
+
</html>`);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=navController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navController.js","sourceRoot":"","sources":["../../../../server/controllers/mock/navController.ts"],"names":[],"mappings":";;AAeA,sCA6EC;AA3FD,sDAAkD;AAElD,MAAM,UAAU,GAA2B;IACzC,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,MAAM;CACjB,CAAA;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC3E,IAAI,CAAC,IAAA,uBAAU,GAAE;QAAE,OAAO,IAAI,EAAE,CAAA;IAEhC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAW,CAAA;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;IAE1C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAA;IACzD,GAAG,CAAC,IAAI,CAAC;;;;;kBAKO,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2Db,KAAK;uDACwC,KAAK;;;;QAIpD,CAAC,CAAA;AACT,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* PUT /token
|
|
4
|
+
* mock 模式:验证 mock token 并返回用户信息,响应中包含 isMock: true
|
|
5
|
+
* 非 mock 模式:透传到真实的 tokenRefreshController
|
|
6
|
+
*/
|
|
7
|
+
export declare function tokenController(req: Request, res: Response, next: NextFunction): void | Response<any, Record<string, any>>;
|
|
8
|
+
//# sourceMappingURL=tokenController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenController.d.ts","sourceRoot":"","sources":["../../../../server/controllers/mock/tokenController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAsBzD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,6CAoE9E"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tokenController = tokenController;
|
|
4
|
+
const mockConfig_1 = require("../../mock/mockConfig");
|
|
5
|
+
const mockTokenUtils_1 = require("../../mock/mockTokenUtils");
|
|
6
|
+
const oauthTokenUtils_1 = require("../../utils/oauthTokenUtils");
|
|
7
|
+
function parseCookies(cookieString) {
|
|
8
|
+
const cookies = {};
|
|
9
|
+
if (!cookieString)
|
|
10
|
+
return cookies;
|
|
11
|
+
cookieString.split(';').forEach(cookie => {
|
|
12
|
+
const [name, value] = cookie.split('=');
|
|
13
|
+
if (name && value) {
|
|
14
|
+
cookies[name.trim()] = value.trim();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return cookies;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* PUT /token
|
|
21
|
+
* mock 模式:验证 mock token 并返回用户信息,响应中包含 isMock: true
|
|
22
|
+
* 非 mock 模式:透传到真实的 tokenRefreshController
|
|
23
|
+
*/
|
|
24
|
+
function tokenController(req, res, next) {
|
|
25
|
+
if (!(0, mockConfig_1.isMockMode)())
|
|
26
|
+
return next();
|
|
27
|
+
const { user } = (0, mockConfig_1.getMockConfig)();
|
|
28
|
+
const cookies = parseCookies(req.headers.cookie);
|
|
29
|
+
const accessTokenRaw = cookies.access_token || '';
|
|
30
|
+
const refreshTokenRaw = cookies.refresh_token || '';
|
|
31
|
+
// 先验证 access_token
|
|
32
|
+
if (accessTokenRaw && (0, mockTokenUtils_1.isMockToken)(accessTokenRaw)) {
|
|
33
|
+
try {
|
|
34
|
+
const claims = (0, mockTokenUtils_1.verifyMockToken)(accessTokenRaw);
|
|
35
|
+
if (claims.sub) {
|
|
36
|
+
return res.json({
|
|
37
|
+
code: 'OK',
|
|
38
|
+
message: 'Token 仍然有效',
|
|
39
|
+
data: {
|
|
40
|
+
isMock: true,
|
|
41
|
+
user: {
|
|
42
|
+
id: claims.sub,
|
|
43
|
+
isVerified: claims.isVerified ?? user.isVerified,
|
|
44
|
+
roles: claims.roles ?? user.roles,
|
|
45
|
+
permissions: claims.permissions ?? user.permissions
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// access_token 过期,继续尝试 refresh_token
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 使用 refresh_token 重签 access_token
|
|
56
|
+
if (refreshTokenRaw && (0, mockTokenUtils_1.isMockToken)(refreshTokenRaw)) {
|
|
57
|
+
try {
|
|
58
|
+
(0, mockTokenUtils_1.verifyMockToken)(refreshTokenRaw);
|
|
59
|
+
const newAccessToken = (0, mockTokenUtils_1.generateMockAccessToken)(user);
|
|
60
|
+
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, newAccessToken, mockTokenUtils_1.MOCK_ACCESS_TOKEN_EXPIRES_IN, 'access');
|
|
61
|
+
return res.json({
|
|
62
|
+
code: 'OK',
|
|
63
|
+
message: 'Token 刷新成功',
|
|
64
|
+
data: {
|
|
65
|
+
isMock: true,
|
|
66
|
+
user: {
|
|
67
|
+
id: user.userId,
|
|
68
|
+
isVerified: user.isVerified,
|
|
69
|
+
roles: user.roles,
|
|
70
|
+
permissions: user.permissions
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// refresh_token 也过期了
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 未登录
|
|
80
|
+
return res.json({
|
|
81
|
+
code: 'OK',
|
|
82
|
+
message: '未登录',
|
|
83
|
+
data: {
|
|
84
|
+
isMock: true,
|
|
85
|
+
user: null
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=tokenController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenController.js","sourceRoot":"","sources":["../../../../server/controllers/mock/tokenController.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,14 +21,12 @@ export interface MockConfig {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* 判断是否启用了 Mock 模式
|
|
24
|
+
* 每次调用都从 process.env 读取,确保 dotenv 初始化后能正确感知
|
|
24
25
|
*/
|
|
25
26
|
export declare function isMockMode(): boolean;
|
|
26
27
|
/**
|
|
27
28
|
* 获取 Mock 配置
|
|
29
|
+
* 每次调用都从 process.env 读取,避免 dotenv 未加载时缓存错误值
|
|
28
30
|
*/
|
|
29
31
|
export declare function getMockConfig(): MockConfig;
|
|
30
|
-
/**
|
|
31
|
-
* 重置缓存(测试用)
|
|
32
|
-
*/
|
|
33
|
-
export declare function resetMockConfigCache(): void;
|
|
34
32
|
//# sourceMappingURL=mockConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockConfig.d.ts","sourceRoot":"","sources":["../../../server/mock/mockConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,cAAc,CAAA;CACrB;
|
|
1
|
+
{"version":3,"file":"mockConfig.d.ts","sourceRoot":"","sources":["../../../server/mock/mockConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,cAAc,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAU1C"}
|
|
@@ -13,35 +13,26 @@
|
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.isMockMode = isMockMode;
|
|
15
15
|
exports.getMockConfig = getMockConfig;
|
|
16
|
-
exports.resetMockConfigCache = resetMockConfigCache;
|
|
17
|
-
let cachedMockConfig = null;
|
|
18
16
|
/**
|
|
19
17
|
* 判断是否启用了 Mock 模式
|
|
18
|
+
* 每次调用都从 process.env 读取,确保 dotenv 初始化后能正确感知
|
|
20
19
|
*/
|
|
21
20
|
function isMockMode() {
|
|
22
21
|
return process.env.OAUTH_MOCK === 'true';
|
|
23
22
|
}
|
|
24
23
|
/**
|
|
25
24
|
* 获取 Mock 配置
|
|
25
|
+
* 每次调用都从 process.env 读取,避免 dotenv 未加载时缓存错误值
|
|
26
26
|
*/
|
|
27
27
|
function getMockConfig() {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return cachedMockConfig;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* 重置缓存(测试用)
|
|
43
|
-
*/
|
|
44
|
-
function resetMockConfigCache() {
|
|
45
|
-
cachedMockConfig = null;
|
|
28
|
+
return {
|
|
29
|
+
enabled: isMockMode(),
|
|
30
|
+
user: {
|
|
31
|
+
userId: process.env.OAUTH_MOCK_USER_ID || 'mock-user-001',
|
|
32
|
+
roles: process.env.OAUTH_MOCK_USER_ROLES || 'admin',
|
|
33
|
+
permissions: process.env.OAUTH_MOCK_USER_PERMISSIONS || '',
|
|
34
|
+
isVerified: parseInt(process.env.OAUTH_MOCK_USER_IS_VERIFIED || '1', 10)
|
|
35
|
+
}
|
|
36
|
+
};
|
|
46
37
|
}
|
|
47
38
|
//# sourceMappingURL=mockConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockConfig.js","sourceRoot":"","sources":["../../../server/mock/mockConfig.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;
|
|
1
|
+
{"version":3,"file":"mockConfig.js","sourceRoot":"","sources":["../../../server/mock/mockConfig.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAkBH,gCAEC;AAMD,sCAUC;AAtBD;;;GAGG;AACH,SAAgB,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM,CAAA;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,OAAO;QACL,OAAO,EAAE,UAAU,EAAE;QACrB,IAAI,EAAE;YACJ,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,eAAe;YACzD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO;YACnD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE;YAC1D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,GAAG,EAAE,EAAE,CAAC;SACzE;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Mock OAuth
|
|
2
|
+
* Mock OAuth 路由
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* PUT /token
|
|
4
|
+
* 始终注册,非 mock 模式下所有处理器调用 next() 透传到真实路由。
|
|
5
|
+
* PUT /token 在 mock 模式下响应中携带 isMock: true,web SDK 据此走纯前端 mock 路径。
|
|
6
|
+
*
|
|
7
|
+
* Mock API 路由(挂载到 /mock)
|
|
8
|
+
*
|
|
9
|
+
* mock 模式下提供给 web SDK 直接调用的接口,无需页面跳转。
|
|
10
|
+
*
|
|
11
|
+
* 路由列表:
|
|
12
|
+
* POST /mock/login - 签发 mock token,返回用户信息
|
|
13
|
+
* POST /mock/logout - 清除 mock token cookie
|
|
14
|
+
* GET /mock/avatar/:id - 返回 404(mock 模式无头像服务)
|
|
15
|
+
* GET /mock/nav/:target - 导航占位页(home/site/user/feedback)
|
|
6
16
|
*/
|
|
7
17
|
declare const mockRoutes: import("express-serve-static-core").Router;
|
|
8
18
|
export default mockRoutes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockRoutes.d.ts","sourceRoot":"","sources":["../../../server/mock/mockRoutes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mockRoutes.d.ts","sourceRoot":"","sources":["../../../server/mock/mockRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,QAAA,MAAM,UAAU,4CAAmB,CAAA;AASnC,eAAe,UAAU,CAAA"}
|
|
@@ -1,97 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Mock OAuth
|
|
3
|
+
* Mock OAuth 路由
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* PUT /token
|
|
5
|
+
* 始终注册,非 mock 模式下所有处理器调用 next() 透传到真实路由。
|
|
6
|
+
* PUT /token 在 mock 模式下响应中携带 isMock: true,web SDK 据此走纯前端 mock 路径。
|
|
7
|
+
*
|
|
8
|
+
* Mock API 路由(挂载到 /mock)
|
|
9
|
+
*
|
|
10
|
+
* mock 模式下提供给 web SDK 直接调用的接口,无需页面跳转。
|
|
11
|
+
*
|
|
12
|
+
* 路由列表:
|
|
13
|
+
* POST /mock/login - 签发 mock token,返回用户信息
|
|
14
|
+
* POST /mock/logout - 清除 mock token cookie
|
|
15
|
+
* GET /mock/avatar/:id - 返回 404(mock 模式无头像服务)
|
|
16
|
+
* GET /mock/nav/:target - 导航占位页(home/site/user/feedback)
|
|
7
17
|
*/
|
|
8
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
20
|
};
|
|
11
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
22
|
const express_1 = __importDefault(require("express"));
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
23
|
+
const tokenController_1 = require("../controllers/mock/tokenController");
|
|
24
|
+
const loginController_1 = require("../controllers/mock/loginController");
|
|
25
|
+
const logoutController_1 = require("../controllers/mock/logoutController");
|
|
26
|
+
const avatarController_1 = require("../controllers/mock/avatarController");
|
|
27
|
+
const navController_1 = require("../controllers/mock/navController");
|
|
16
28
|
const mockRoutes = express_1.default.Router();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
mockRoutes.
|
|
22
|
-
const { user } = (0, mockConfig_1.getMockConfig)();
|
|
23
|
-
const cookies = parseCookies(req.headers.cookie);
|
|
24
|
-
const accessTokenRaw = cookies.access_token || '';
|
|
25
|
-
const refreshTokenRaw = cookies.refresh_token || '';
|
|
26
|
-
// 先验证 access_token
|
|
27
|
-
if (accessTokenRaw && (0, mockTokenUtils_1.isMockToken)(accessTokenRaw)) {
|
|
28
|
-
try {
|
|
29
|
-
const claims = (0, mockTokenUtils_1.verifyMockToken)(accessTokenRaw);
|
|
30
|
-
if (claims.sub) {
|
|
31
|
-
return res.json({
|
|
32
|
-
code: 'OK',
|
|
33
|
-
message: 'Token 仍然有效',
|
|
34
|
-
data: {
|
|
35
|
-
isMock: true,
|
|
36
|
-
user: {
|
|
37
|
-
id: claims.sub,
|
|
38
|
-
isVerified: claims.isVerified ?? user.isVerified,
|
|
39
|
-
roles: claims.roles ?? user.roles,
|
|
40
|
-
permissions: claims.permissions ?? user.permissions
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// access_token 过期,继续尝试 refresh_token
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// 使用 refresh_token 重签 access_token
|
|
51
|
-
if (refreshTokenRaw && (0, mockTokenUtils_1.isMockToken)(refreshTokenRaw)) {
|
|
52
|
-
try {
|
|
53
|
-
(0, mockTokenUtils_1.verifyMockToken)(refreshTokenRaw);
|
|
54
|
-
const newAccessToken = (0, mockTokenUtils_1.generateMockAccessToken)(user);
|
|
55
|
-
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, newAccessToken, mockTokenUtils_1.MOCK_ACCESS_TOKEN_EXPIRES_IN, 'access');
|
|
56
|
-
return res.json({
|
|
57
|
-
code: 'OK',
|
|
58
|
-
message: 'Token 刷新成功',
|
|
59
|
-
data: {
|
|
60
|
-
isMock: true,
|
|
61
|
-
user: {
|
|
62
|
-
id: user.userId,
|
|
63
|
-
isVerified: user.isVerified,
|
|
64
|
-
roles: user.roles,
|
|
65
|
-
permissions: user.permissions
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// refresh_token 也过期了
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// 未登录
|
|
75
|
-
return res.json({
|
|
76
|
-
code: 'OK',
|
|
77
|
-
message: '未登录',
|
|
78
|
-
data: {
|
|
79
|
-
isMock: true,
|
|
80
|
-
user: null
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
function parseCookies(cookieString) {
|
|
85
|
-
const cookies = {};
|
|
86
|
-
if (!cookieString)
|
|
87
|
-
return cookies;
|
|
88
|
-
cookieString.split(';').forEach(cookie => {
|
|
89
|
-
const [name, value] = cookie.split('=');
|
|
90
|
-
if (name && value) {
|
|
91
|
-
cookies[name.trim()] = value.trim();
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
return cookies;
|
|
95
|
-
}
|
|
29
|
+
mockRoutes.put('/token', tokenController_1.tokenController);
|
|
30
|
+
mockRoutes.post('/mock/login', loginController_1.loginController);
|
|
31
|
+
mockRoutes.post('/mock/logout', logoutController_1.logoutController);
|
|
32
|
+
mockRoutes.get('/mock/avatar/:id', avatarController_1.avatarController);
|
|
33
|
+
mockRoutes.get('/mock/nav/:target', navController_1.navController);
|
|
96
34
|
exports.default = mockRoutes;
|
|
97
35
|
//# sourceMappingURL=mockRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockRoutes.js","sourceRoot":"","sources":["../../../server/mock/mockRoutes.ts"],"names":[],"mappings":";AAAA;;;;;
|
|
1
|
+
{"version":3,"file":"mockRoutes.js","sourceRoot":"","sources":["../../../server/mock/mockRoutes.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;AAEH,sDAA6B;AAC7B,yEAAqE;AACrE,yEAAqE;AACrE,2EAAuE;AACvE,2EAAuE;AACvE,qEAAiE;AAEjE,MAAM,UAAU,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAEnC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,iCAAe,CAAC,CAAA;AAEzC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,iCAAe,CAAC,CAAA;AAC/C,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,mCAAgB,CAAC,CAAA;AACjD,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,mCAAgB,CAAC,CAAA;AACpD,UAAU,CAAC,GAAG,CAAC,mBAAmB,EAAE,6BAAa,CAAC,CAAA;AAElD,kBAAe,UAAU,CAAA"}
|
package/dist/server/routes.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../server/routes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../server/routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,QAAA,MAAM,WAAW,4CAAmB,CAAA;AA0BpC,eAAe,WAAW,CAAA"}
|
package/dist/server/routes.js
CHANGED
|
@@ -1,45 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Sumor OAuth 路由
|
|
4
|
-
*
|
|
5
|
-
* 当 OAUTH_MOCK=true 时,挂载 mock 路由替代真实 OAuth 流程
|
|
4
|
+
* 所有路由始终注册,在处理器内部根据 mock 模式决定具体行为。
|
|
6
5
|
*/
|
|
7
6
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
8
|
};
|
|
10
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
10
|
const express_1 = __importDefault(require("express"));
|
|
12
|
-
const mockConfig_1 = require("./mock/mockConfig");
|
|
13
11
|
const mockRoutes_1 = __importDefault(require("./mock/mockRoutes"));
|
|
14
|
-
const mockApiRoutes_1 = __importDefault(require("./mock/mockApiRoutes"));
|
|
15
12
|
const tokenRefreshController_1 = __importDefault(require("./controllers/tokenRefreshController"));
|
|
16
13
|
const oauthCallbackController_1 = __importDefault(require("./controllers/oauthCallbackController"));
|
|
17
14
|
const logoutController_1 = require("./controllers/logoutController");
|
|
18
15
|
const oauthRoutes = express_1.default.Router();
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* 用户登出 - 需要有效的 Token
|
|
40
|
-
* POST /api/oauth/logout
|
|
41
|
-
*/
|
|
42
|
-
oauthRoutes.post('/logout', logoutController_1.logout);
|
|
43
|
-
}
|
|
16
|
+
/**
|
|
17
|
+
* Mock token 路由(PUT /token、GET /authorize 等)
|
|
18
|
+
* mock 模式下由 mockRoutes 处理,否则透传到后续真实路由
|
|
19
|
+
*/
|
|
20
|
+
oauthRoutes.use('/', mockRoutes_1.default);
|
|
21
|
+
/**
|
|
22
|
+
* Token 刷新端点
|
|
23
|
+
* PUT /token
|
|
24
|
+
*/
|
|
25
|
+
oauthRoutes.put('/token', tokenRefreshController_1.default);
|
|
26
|
+
/**
|
|
27
|
+
* OAuth 授权回调处理
|
|
28
|
+
* GET /callback
|
|
29
|
+
*/
|
|
30
|
+
oauthRoutes.get('/callback', oauthCallbackController_1.default);
|
|
31
|
+
/**
|
|
32
|
+
* 用户登出
|
|
33
|
+
* POST /logout
|
|
34
|
+
*/
|
|
35
|
+
oauthRoutes.post('/logout', logoutController_1.logout);
|
|
44
36
|
exports.default = oauthRoutes;
|
|
45
37
|
//# sourceMappingURL=routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../server/routes.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../server/routes.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH,sDAA6B;AAC7B,mEAA0C;AAC1C,kGAAyE;AACzE,oGAA2E;AAC3E,qEAAuD;AAEvD,MAAM,WAAW,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAEpC;;;GAGG;AACH,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAU,CAAC,CAAA;AAEhC;;;GAGG;AACH,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,gCAAsB,CAAC,CAAA;AAEjD;;;GAGG;AACH,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,iCAAuB,CAAC,CAAA;AAErD;;;GAGG;AACH,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAM,CAAC,CAAA;AAEnC,kBAAe,WAAW,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mock API 路由(挂载到 /api/oauth/mock)
|
|
3
|
-
*
|
|
4
|
-
* 提供给 web SDK 在 mock 模式下直接调用的接口,无需页面跳转。
|
|
5
|
-
*
|
|
6
|
-
* 路由列表:
|
|
7
|
-
* POST /api/oauth/mock/login - 签发 mock token,返回用户信息
|
|
8
|
-
* POST /api/oauth/mock/logout - 清除 mock token cookie
|
|
9
|
-
* GET /api/oauth/mock/avatar/:id - 返回 404(mock 模式无头像服务)
|
|
10
|
-
* GET /api/oauth/mock/nav/:target - 导航占位页(home/site/user/feedback)
|
|
11
|
-
*/
|
|
12
|
-
declare const mockApiRoutes: import("express-serve-static-core").Router;
|
|
13
|
-
export default mockApiRoutes;
|
|
14
|
-
//# sourceMappingURL=mockApiRoutes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mockApiRoutes.d.ts","sourceRoot":"","sources":["../../../server/mock/mockApiRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,QAAA,MAAM,aAAa,4CAAmB,CAAA;AA0ItC,eAAe,aAAa,CAAA"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Mock API 路由(挂载到 /api/oauth/mock)
|
|
4
|
-
*
|
|
5
|
-
* 提供给 web SDK 在 mock 模式下直接调用的接口,无需页面跳转。
|
|
6
|
-
*
|
|
7
|
-
* 路由列表:
|
|
8
|
-
* POST /api/oauth/mock/login - 签发 mock token,返回用户信息
|
|
9
|
-
* POST /api/oauth/mock/logout - 清除 mock token cookie
|
|
10
|
-
* GET /api/oauth/mock/avatar/:id - 返回 404(mock 模式无头像服务)
|
|
11
|
-
* GET /api/oauth/mock/nav/:target - 导航占位页(home/site/user/feedback)
|
|
12
|
-
*/
|
|
13
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
const express_1 = __importDefault(require("express"));
|
|
18
|
-
const mockConfig_1 = require("./mockConfig");
|
|
19
|
-
const mockTokenUtils_1 = require("./mockTokenUtils");
|
|
20
|
-
const oauthTokenUtils_1 = require("../utils/oauthTokenUtils");
|
|
21
|
-
const mockApiRoutes = express_1.default.Router();
|
|
22
|
-
/**
|
|
23
|
-
* POST /api/oauth/mock/login
|
|
24
|
-
* 直接签发 mock token,写入 HttpOnly Cookie,并返回用户信息
|
|
25
|
-
* web SDK 拿到用户信息后直接更新 store,无需页面跳转
|
|
26
|
-
*/
|
|
27
|
-
mockApiRoutes.post('/login', (_req, res) => {
|
|
28
|
-
const { user } = (0, mockConfig_1.getMockConfig)();
|
|
29
|
-
const accessToken = (0, mockTokenUtils_1.generateMockAccessToken)(user);
|
|
30
|
-
const refreshToken = (0, mockTokenUtils_1.generateMockRefreshToken)(user);
|
|
31
|
-
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, accessToken, mockTokenUtils_1.MOCK_ACCESS_TOKEN_EXPIRES_IN, 'access');
|
|
32
|
-
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, refreshToken, mockTokenUtils_1.MOCK_REFRESH_TOKEN_EXPIRES_IN, 'refresh');
|
|
33
|
-
return res.json({
|
|
34
|
-
code: 'OK',
|
|
35
|
-
message: '登录成功',
|
|
36
|
-
data: {
|
|
37
|
-
isMock: true,
|
|
38
|
-
user: {
|
|
39
|
-
id: user.userId,
|
|
40
|
-
isVerified: user.isVerified,
|
|
41
|
-
roles: user.roles,
|
|
42
|
-
permissions: user.permissions
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
/**
|
|
48
|
-
* POST /api/oauth/mock/logout
|
|
49
|
-
* 清除 mock token cookie
|
|
50
|
-
*/
|
|
51
|
-
mockApiRoutes.post('/logout', (_req, res) => {
|
|
52
|
-
res.clearCookie('access_token');
|
|
53
|
-
res.clearCookie('refresh_token');
|
|
54
|
-
return res.json({ code: 'OK', message: '登出成功' });
|
|
55
|
-
});
|
|
56
|
-
/**
|
|
57
|
-
* GET /api/oauth/mock/avatar/:id
|
|
58
|
-
* mock 模式无头像服务,直接返回 404
|
|
59
|
-
*/
|
|
60
|
-
mockApiRoutes.get('/avatar/:id', (_req, res) => {
|
|
61
|
-
res.status(404).end();
|
|
62
|
-
});
|
|
63
|
-
const NAV_LABELS = {
|
|
64
|
-
home: '首页',
|
|
65
|
-
site: '站点管理',
|
|
66
|
-
user: '用户中心',
|
|
67
|
-
feedback: '意见反馈'
|
|
68
|
-
};
|
|
69
|
-
/**
|
|
70
|
-
* GET /api/oauth/mock/nav/:target
|
|
71
|
-
* mock 模式导航占位页,展示目标页面名称并提供回退按钮
|
|
72
|
-
*/
|
|
73
|
-
mockApiRoutes.get('/nav/:target', (req, res) => {
|
|
74
|
-
const target = req.params['target'];
|
|
75
|
-
const label = NAV_LABELS[target] || target;
|
|
76
|
-
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
77
|
-
res.send(`<!DOCTYPE html>
|
|
78
|
-
<html lang="zh-CN">
|
|
79
|
-
<head>
|
|
80
|
-
<meta charset="UTF-8" />
|
|
81
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
82
|
-
<title>[Mock] ${label}</title>
|
|
83
|
-
<style>
|
|
84
|
-
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
85
|
-
body {
|
|
86
|
-
min-height: 100vh;
|
|
87
|
-
display: flex;
|
|
88
|
-
align-items: center;
|
|
89
|
-
justify-content: center;
|
|
90
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
91
|
-
background: #f5f5f5;
|
|
92
|
-
color: #333;
|
|
93
|
-
}
|
|
94
|
-
.card {
|
|
95
|
-
background: #fff;
|
|
96
|
-
border-radius: 12px;
|
|
97
|
-
box-shadow: 0 4px 24px rgba(0,0,0,.08);
|
|
98
|
-
padding: 48px 56px;
|
|
99
|
-
text-align: center;
|
|
100
|
-
max-width: 420px;
|
|
101
|
-
width: 90%;
|
|
102
|
-
}
|
|
103
|
-
.badge {
|
|
104
|
-
display: inline-block;
|
|
105
|
-
background: #fff3cd;
|
|
106
|
-
color: #856404;
|
|
107
|
-
font-size: 12px;
|
|
108
|
-
font-weight: 600;
|
|
109
|
-
letter-spacing: .5px;
|
|
110
|
-
padding: 3px 10px;
|
|
111
|
-
border-radius: 99px;
|
|
112
|
-
margin-bottom: 20px;
|
|
113
|
-
}
|
|
114
|
-
h1 {
|
|
115
|
-
font-size: 24px;
|
|
116
|
-
font-weight: 700;
|
|
117
|
-
margin-bottom: 8px;
|
|
118
|
-
}
|
|
119
|
-
p {
|
|
120
|
-
font-size: 14px;
|
|
121
|
-
color: #888;
|
|
122
|
-
margin-bottom: 32px;
|
|
123
|
-
line-height: 1.6;
|
|
124
|
-
}
|
|
125
|
-
button {
|
|
126
|
-
background: #333;
|
|
127
|
-
color: #fff;
|
|
128
|
-
border: none;
|
|
129
|
-
border-radius: 8px;
|
|
130
|
-
padding: 10px 28px;
|
|
131
|
-
font-size: 14px;
|
|
132
|
-
cursor: pointer;
|
|
133
|
-
transition: background .15s;
|
|
134
|
-
}
|
|
135
|
-
button:hover { background: #555; }
|
|
136
|
-
</style>
|
|
137
|
-
</head>
|
|
138
|
-
<body>
|
|
139
|
-
<div class="card">
|
|
140
|
-
<span class="badge">MOCK</span>
|
|
141
|
-
<h1>${label}</h1>
|
|
142
|
-
<p>当前处于 Mock 模式,此页面为占位页。<br/>真实环境中将跳转到 OAuth 服务的「${label}」页面。</p>
|
|
143
|
-
<button onclick="history.back()">返回上一页</button>
|
|
144
|
-
</div>
|
|
145
|
-
</body>
|
|
146
|
-
</html>`);
|
|
147
|
-
});
|
|
148
|
-
exports.default = mockApiRoutes;
|
|
149
|
-
//# sourceMappingURL=mockApiRoutes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mockApiRoutes.js","sourceRoot":"","sources":["../../../server/mock/mockApiRoutes.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAEH,sDAAoD;AACpD,6CAA4C;AAC5C,qDAKyB;AACzB,8DAA8D;AAE9D,MAAM,aAAa,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAEtC;;;;GAIG;AACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,0BAAa,GAAE,CAAA;IAEhC,MAAM,WAAW,GAAG,IAAA,wCAAuB,EAAC,IAAI,CAAC,CAAA;IACjD,MAAM,YAAY,GAAG,IAAA,yCAAwB,EAAC,IAAI,CAAC,CAAA;IAEnD,IAAA,qCAAmB,EAAC,GAAG,EAAE,WAAW,EAAE,6CAA4B,EAAE,QAAQ,CAAC,CAAA;IAC7E,IAAA,qCAAmB,EAAC,GAAG,EAAE,YAAY,EAAE,8CAA6B,EAAE,SAAS,CAAC,CAAA;IAEhF,OAAO,GAAG,CAAC,IAAI,CAAC;QACd,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,MAAM;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B;SACF;KACF,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC7D,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;IAC/B,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;IAEhC,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEF,MAAM,UAAU,GAA2B;IACzC,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,MAAM;CACjB,CAAA;AAED;;;GAGG;AACH,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAW,CAAA;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;IAE1C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAA;IACzD,GAAG,CAAC,IAAI,CAAC;;;;;kBAKO,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2Db,KAAK;uDACwC,KAAK;;;;QAIpD,CAAC,CAAA;AACT,CAAC,CAAC,CAAA;AAEF,kBAAe,aAAa,CAAA"}
|