sumor 3.0.4 → 3.0.6
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/tokenRefreshController.d.ts.map +1 -1
- package/dist/server/controllers/tokenRefreshController.js +84 -58
- package/dist/server/controllers/tokenRefreshController.js.map +1 -1
- package/dist/server/utils/authUtils.d.ts +7 -1
- package/dist/server/utils/authUtils.d.ts.map +1 -1
- package/dist/server/utils/authUtils.js +14 -13
- package/dist/server/utils/authUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenRefreshController.d.ts","sourceRoot":"","sources":["../../../server/controllers/tokenRefreshController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"tokenRefreshController.d.ts","sourceRoot":"","sources":["../../../server/controllers/tokenRefreshController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAQ3C,wBAA8B,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,+CAiG/E"}
|
|
@@ -15,71 +15,97 @@ const oauthTokenUtils_1 = require("../utils/oauthTokenUtils");
|
|
|
15
15
|
const tokenModel_1 = require("../models/tokenModel");
|
|
16
16
|
const config_1 = require("../utils/config");
|
|
17
17
|
const authorizationUrlGenerator_1 = require("../utils/authorizationUrlGenerator");
|
|
18
|
+
const authUtils_1 = require("../utils/authUtils");
|
|
18
19
|
async function tokenRefreshController(req, res) {
|
|
20
|
+
const config = (0, config_1.getOAuthConfig)();
|
|
21
|
+
const oauthAuthorizeUrl = (0, authorizationUrlGenerator_1.generateAuthorizationUrl)();
|
|
22
|
+
// 初始化响应变量
|
|
23
|
+
let statusCode = 200;
|
|
24
|
+
let code = 'OK';
|
|
25
|
+
let message = '未登录';
|
|
26
|
+
let user = null;
|
|
19
27
|
try {
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (tokenData.refreshToken && tokenData.refreshToken !== refreshToken) {
|
|
42
|
-
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, tokenData.refreshToken, 2592000, 'refresh'); // 30 days
|
|
43
|
-
}
|
|
44
|
-
// 验证新的 accessToken 获取用户信息
|
|
45
|
-
let user = null;
|
|
46
|
-
try {
|
|
47
|
-
const tokenModel = (0, tokenModel_1.getTokenModel)();
|
|
48
|
-
const claims = await tokenModel.verify(tokenData.accessToken);
|
|
49
|
-
if (claims.sub) {
|
|
50
|
-
user = {
|
|
51
|
-
id: claims.sub,
|
|
52
|
-
isVerified: claims.isVerified || 0,
|
|
53
|
-
roles: claims.roles || '',
|
|
54
|
-
permissions: claims.permissions || ''
|
|
55
|
-
};
|
|
28
|
+
// 第一步:先从 Cookie 中获取并验证 access_token
|
|
29
|
+
const accessToken = (0, authUtils_1.getAccessToken)(req);
|
|
30
|
+
const tokenModel = (0, tokenModel_1.getTokenModel)();
|
|
31
|
+
if (accessToken) {
|
|
32
|
+
try {
|
|
33
|
+
// 尝试验证现有的 access_token
|
|
34
|
+
const claims = await tokenModel.verify(accessToken);
|
|
35
|
+
if (claims.sub) {
|
|
36
|
+
// access_token 有效且未过期,无需刷新
|
|
37
|
+
user = {
|
|
38
|
+
id: claims.sub,
|
|
39
|
+
isVerified: claims.isVerified || 0,
|
|
40
|
+
roles: claims.roles || '',
|
|
41
|
+
permissions: claims.permissions || ''
|
|
42
|
+
};
|
|
43
|
+
message = 'Token 仍然有效';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// access_token 已过期或无效,继续执行刷新流程
|
|
48
|
+
console.log('Access token 已过期或无效,准备刷新');
|
|
56
49
|
}
|
|
57
50
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
51
|
+
// 如果 access_token 无效,进行第二步刷新
|
|
52
|
+
if (!user) {
|
|
53
|
+
// 第二步:从 Cookie 中获取 refreshToken 进行刷新
|
|
54
|
+
const refreshToken = (0, authUtils_1.getRefreshToken)(req);
|
|
55
|
+
// 如果有有效的 refreshToken,进行刷新
|
|
56
|
+
if (refreshToken) {
|
|
57
|
+
// 使用 OAuthService 调用 ITS API
|
|
58
|
+
const oauthService = new oauthService_1.default();
|
|
59
|
+
const tokenData = await oauthService.refreshAccessToken(refreshToken);
|
|
60
|
+
// 使用公用的 token 设置函数
|
|
61
|
+
// 设置新的 accessToken
|
|
62
|
+
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, tokenData.accessToken, tokenData.expiresIn, 'access');
|
|
63
|
+
// 如果返回了新的 refreshToken,也设置上
|
|
64
|
+
// PUT /token 通常不返回新的 refreshToken,但为了保险起见检查
|
|
65
|
+
if (tokenData.refreshToken && tokenData.refreshToken !== refreshToken) {
|
|
66
|
+
(0, oauthTokenUtils_1.setOAuthTokenCookie)(res, tokenData.refreshToken, 2592000, 'refresh'); // 30 days
|
|
67
|
+
}
|
|
68
|
+
// 验证新的 accessToken 获取用户信息
|
|
69
|
+
try {
|
|
70
|
+
const claims = await tokenModel.verify(tokenData.accessToken);
|
|
71
|
+
if (claims.sub) {
|
|
72
|
+
user = {
|
|
73
|
+
id: claims.sub,
|
|
74
|
+
isVerified: claims.isVerified || 0,
|
|
75
|
+
roles: claims.roles || '',
|
|
76
|
+
permissions: claims.permissions || ''
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// Token 验证失败,返回 null user
|
|
82
|
+
console.error('Failed to verify new token:', error);
|
|
83
|
+
}
|
|
84
|
+
// 更新消息为成功登录状态
|
|
85
|
+
message = 'Token 刷新成功';
|
|
73
86
|
}
|
|
74
|
-
}
|
|
87
|
+
}
|
|
75
88
|
}
|
|
76
89
|
catch (error) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
90
|
+
// 当 token 刷新失败时(如 401 未授权),返回授权 URL 而不是错误
|
|
91
|
+
if (error.code === 'REFRESH_TOKEN_FAILED' || error.response?.status === 401) {
|
|
92
|
+
message = 'Token 已过期或无效';
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// 其他异常错误
|
|
96
|
+
statusCode = error.response?.status || 500;
|
|
97
|
+
code = 'ERROR';
|
|
98
|
+
message = error.message || 'Token 刷新失败';
|
|
99
|
+
}
|
|
83
100
|
}
|
|
101
|
+
return res.status(statusCode).json({
|
|
102
|
+
code,
|
|
103
|
+
message,
|
|
104
|
+
data: {
|
|
105
|
+
endpoint: config.endpoint,
|
|
106
|
+
authorizeUrl: oauthAuthorizeUrl,
|
|
107
|
+
user
|
|
108
|
+
}
|
|
109
|
+
});
|
|
84
110
|
}
|
|
85
111
|
//# sourceMappingURL=tokenRefreshController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenRefreshController.js","sourceRoot":"","sources":["../../../server/controllers/tokenRefreshController.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;
|
|
1
|
+
{"version":3,"file":"tokenRefreshController.js","sourceRoot":"","sources":["../../../server/controllers/tokenRefreshController.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,15 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export declare function parseCookies(cookieHeader?: string): Record<string, string>;
|
|
9
9
|
/**
|
|
10
|
-
* 从 Cookie
|
|
10
|
+
* 从 Cookie 中获取 Access Token
|
|
11
11
|
* @param req Express 请求对象
|
|
12
12
|
* @returns Token 字符串,如果未找到返回 null
|
|
13
13
|
*/
|
|
14
14
|
export declare function getAccessToken(req: any): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* 从 Cookie 中获取 Refresh Token
|
|
17
|
+
* @param req Express 请求对象
|
|
18
|
+
* @returns Refresh Token 或 null
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRefreshToken(req: any): string | null;
|
|
15
21
|
//# sourceMappingURL=authUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authUtils.d.ts","sourceRoot":"","sources":["../../../server/utils/authUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB1E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"authUtils.d.ts","sourceRoot":"","sources":["../../../server/utils/authUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB1E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAItD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAIvD"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.parseCookies = parseCookies;
|
|
8
8
|
exports.getAccessToken = getAccessToken;
|
|
9
|
+
exports.getRefreshToken = getRefreshToken;
|
|
9
10
|
/**
|
|
10
11
|
* 解析 Cookie 字符串
|
|
11
12
|
*/
|
|
@@ -24,23 +25,23 @@ function parseCookies(cookieHeader) {
|
|
|
24
25
|
return cookies;
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
|
-
* 从 Cookie
|
|
28
|
+
* 从 Cookie 中获取 Access Token
|
|
28
29
|
* @param req Express 请求对象
|
|
29
30
|
* @returns Token 字符串,如果未找到返回 null
|
|
30
31
|
*/
|
|
31
32
|
function getAccessToken(req) {
|
|
32
|
-
//
|
|
33
|
+
// 仅从 Cookie 获取 access_token
|
|
33
34
|
const cookies = parseCookies(req.headers?.cookie);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return null;
|
|
35
|
+
return cookies.access_token || null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 从 Cookie 中获取 Refresh Token
|
|
39
|
+
* @param req Express 请求对象
|
|
40
|
+
* @returns Refresh Token 或 null
|
|
41
|
+
*/
|
|
42
|
+
function getRefreshToken(req) {
|
|
43
|
+
// 从 Cookie 获取 refresh_token
|
|
44
|
+
const cookies = parseCookies(req.headers?.cookie);
|
|
45
|
+
return cookies.refresh_token || null;
|
|
45
46
|
}
|
|
46
47
|
//# sourceMappingURL=authUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authUtils.js","sourceRoot":"","sources":["../../../server/utils/authUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAKH,oCAgBC;AAOD,
|
|
1
|
+
{"version":3,"file":"authUtils.js","sourceRoot":"","sources":["../../../server/utils/authUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAKH,oCAgBC;AAOD,wCAIC;AAOD,0CAIC;AAzCD;;GAEG;AACH,SAAgB,YAAY,CAAC,YAAqB;IAChD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAA;IAE1C,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACnC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAClD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,GAAQ;IACrC,4BAA4B;IAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACjD,OAAO,OAAO,CAAC,YAAY,IAAI,IAAI,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,GAAQ;IACtC,4BAA4B;IAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACjD,OAAO,OAAO,CAAC,aAAa,IAAI,IAAI,CAAA;AACtC,CAAC"}
|