sumor 3.3.2 → 3.3.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.
- package/README.md +53 -0
- package/README.zh-CN.md +61 -7
- package/dist/server/controllers/logoutController.js +2 -2
- 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/controllers/oauthCallbackController.js +2 -2
- package/dist/server/controllers/tokenRefreshController.js +2 -2
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +2 -2
- 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/models/blacklistModel.js +2 -2
- package/dist/server/models/jwksModel.js +2 -2
- 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/dist/server/services/OAuthService.d.ts +24 -0
- package/dist/server/services/OAuthService.d.ts.map +1 -0
- package/dist/server/services/OAuthService.js +32 -0
- package/dist/server/services/OAuthService.js.map +1 -0
- package/dist/server/services/oauth/MockDataGenerator.d.ts +18 -0
- package/dist/server/services/oauth/MockDataGenerator.d.ts.map +1 -0
- package/dist/server/services/oauth/MockDataGenerator.js +39 -0
- package/dist/server/services/oauth/MockDataGenerator.js.map +1 -0
- package/dist/server/services/oauth/OAuthMockService.d.ts +28 -0
- package/dist/server/services/oauth/OAuthMockService.d.ts.map +1 -0
- package/dist/server/services/oauth/OAuthMockService.js +184 -0
- package/dist/server/services/oauth/OAuthMockService.js.map +1 -0
- package/dist/server/services/oauth/OAuthProductionService.d.ts +22 -0
- package/dist/server/services/oauth/OAuthProductionService.d.ts.map +1 -0
- package/dist/server/services/oauth/OAuthProductionService.js +203 -0
- package/dist/server/services/oauth/OAuthProductionService.js.map +1 -0
- package/dist/server/services/oauth/OAuthServiceError.d.ts +9 -0
- package/dist/server/services/oauth/OAuthServiceError.d.ts.map +1 -0
- package/dist/server/services/oauth/OAuthServiceError.js +16 -0
- package/dist/server/services/oauth/OAuthServiceError.js.map +1 -0
- 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
- package/dist/server/services/oauthService.d.ts +0 -149
- package/dist/server/services/oauthService.d.ts.map +0 -1
- package/dist/server/services/oauthService.js +0 -360
- package/dist/server/services/oauthService.js.map +0 -1
|
@@ -1,360 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* OAuth 服务层
|
|
4
|
-
*
|
|
5
|
-
* 提供 OAuth 相关的业务操作,包括 Token 管理、黑名单检查等。
|
|
6
|
-
* 在 APIs 层基础上添加了错误处理、日志记录等功能。
|
|
7
|
-
*/
|
|
8
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.getOAuthService = exports.initOAuthService = exports.OAuthService = exports.OAuthServiceError = void 0;
|
|
13
|
-
const http_1 = __importDefault(require("../utils/http"));
|
|
14
|
-
const mockConfig_1 = require("../mock/mockConfig");
|
|
15
|
-
/**
|
|
16
|
-
* OAuth 服务自定义错误
|
|
17
|
-
*/
|
|
18
|
-
class OAuthServiceError extends Error {
|
|
19
|
-
constructor(code, message, details) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.code = code;
|
|
22
|
-
this.details = details;
|
|
23
|
-
this.name = 'OAuthServiceError';
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
exports.OAuthServiceError = OAuthServiceError;
|
|
27
|
-
/**
|
|
28
|
-
* OAuth 服务类
|
|
29
|
-
* 提供 OAuth 相关的业务操作和 API 调用
|
|
30
|
-
*/
|
|
31
|
-
class OAuthService {
|
|
32
|
-
constructor() { }
|
|
33
|
-
/**
|
|
34
|
-
* 用授权码交换 Token
|
|
35
|
-
* RFC 6749 §4.1.3
|
|
36
|
-
*
|
|
37
|
-
* @param grantType 授权类型,固定为 'authorization_code'
|
|
38
|
-
* @param code 授权码
|
|
39
|
-
* @param redirectUri 回调地址
|
|
40
|
-
* @param codeVerifier PKCE code_verifier
|
|
41
|
-
* @returns Token 响应
|
|
42
|
-
* @throws OAuthServiceError 当交换失败时抛出异常
|
|
43
|
-
*/
|
|
44
|
-
async exchangeCode(grantType, code, redirectUri, codeVerifier) {
|
|
45
|
-
try {
|
|
46
|
-
const httpClient = (0, http_1.default)();
|
|
47
|
-
const response = await httpClient.post('/token', {
|
|
48
|
-
code,
|
|
49
|
-
redirectUri
|
|
50
|
-
});
|
|
51
|
-
// OAuth API 标准响应格式:{ code, message, data: { accessToken, refreshToken, tokenType, expiresIn, jti } }
|
|
52
|
-
const body = response.data;
|
|
53
|
-
const tokenData = body?.data ?? response.data;
|
|
54
|
-
return tokenData;
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
const errorMsg = error.response?.data?.message || error.message || '授权码交换失败';
|
|
58
|
-
throw new OAuthServiceError('EXCHANGE_CODE_FAILED', errorMsg, error.response?.data);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 获取授权服务器的 JWKS(JSON Web Key Set)
|
|
63
|
-
* 用于获取签名公钥,验证 JWT
|
|
64
|
-
*
|
|
65
|
-
* @returns JWKS 响应,包含签名密钥列表
|
|
66
|
-
* @throws OAuthServiceError 当获取失败时抛出异常
|
|
67
|
-
*/
|
|
68
|
-
async getJWKS() {
|
|
69
|
-
try {
|
|
70
|
-
const httpClient = (0, http_1.default)();
|
|
71
|
-
const response = await httpClient.get('/jwks');
|
|
72
|
-
// OAuth API 标准响应格式:{ code, message, data: { keys } }
|
|
73
|
-
const body = response.data;
|
|
74
|
-
return body?.data ?? response.data;
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
const errorMsg = error.message || 'JWKS 获取失败';
|
|
78
|
-
throw new OAuthServiceError('GET_JWKS_FAILED', errorMsg, error.response?.data);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* 检查会话是否在黑名单中
|
|
83
|
-
* 用于检查会话是否已被撤销
|
|
84
|
-
*
|
|
85
|
-
* @param sessionId 会话 ID(UUID)
|
|
86
|
-
* @returns 黑名单检查响应
|
|
87
|
-
* @throws OAuthServiceError 当检查失败时抛出异常
|
|
88
|
-
*/
|
|
89
|
-
async checkBlacklist(sessionId) {
|
|
90
|
-
try {
|
|
91
|
-
const httpClient = (0, http_1.default)();
|
|
92
|
-
const response = await httpClient.get(`/sessions/${sessionId}/blacklist`);
|
|
93
|
-
// OAuth API 标准响应格式:{ code, message, data: { sessionId, isBlacklisted } }
|
|
94
|
-
const body = response.data;
|
|
95
|
-
const inner = body?.data;
|
|
96
|
-
if (inner !== undefined) {
|
|
97
|
-
return { code: body.code, data: inner };
|
|
98
|
-
}
|
|
99
|
-
return response.data;
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
const errorMsg = error.message || '会话黑名单检查失败';
|
|
103
|
-
throw new OAuthServiceError('CHECK_BLACKLIST_FAILED', errorMsg, error.response?.data);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* 撤销会话(注销 Token)
|
|
108
|
-
* RFC 7009
|
|
109
|
-
*
|
|
110
|
-
* @param sessionId 要撤销的会话 ID
|
|
111
|
-
* @throws OAuthServiceError 当撤销失败时抛出异常
|
|
112
|
-
*/
|
|
113
|
-
async revokeSession(sessionId) {
|
|
114
|
-
try {
|
|
115
|
-
const httpClient = (0, http_1.default)();
|
|
116
|
-
await httpClient.post('/logout', {
|
|
117
|
-
sessionId
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
const errorMsg = error.message || '会话撤销失败';
|
|
122
|
-
throw new OAuthServiceError('REVOKE_SESSION_FAILED', errorMsg, error.response?.data);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* 刷新 Access Token
|
|
127
|
-
* RFC 6749 §6
|
|
128
|
-
*
|
|
129
|
-
* @param refreshToken 刷新令牌(仅支持驼峰格式 refreshToken,不支持下划线 refresh_token)
|
|
130
|
-
* @returns Token 响应,与 exchangeCode 格式一致
|
|
131
|
-
* @throws OAuthServiceError 当刷新失败时抛出异常
|
|
132
|
-
*/
|
|
133
|
-
async refreshAccessToken(refreshToken) {
|
|
134
|
-
try {
|
|
135
|
-
const httpClient = (0, http_1.default)();
|
|
136
|
-
const response = await httpClient.put('/token', {
|
|
137
|
-
refreshToken
|
|
138
|
-
});
|
|
139
|
-
// OAuth API 标准响应格式:{ code, message, data: { accessToken, ... } }
|
|
140
|
-
const body = response.data;
|
|
141
|
-
const tokenData = body?.data ?? response.data;
|
|
142
|
-
return tokenData;
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
const errorMsg = error.response?.data?.message || error.message || 'Access Token 刷新失败';
|
|
146
|
-
throw new OAuthServiceError('REFRESH_TOKEN_FAILED', errorMsg, error.response?.data);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* 发送微信模板消息
|
|
151
|
-
*
|
|
152
|
-
* @param templateId 微信消息模板ID
|
|
153
|
-
* @param userId 用户ID,系统会内部查找对应的微信OpenID
|
|
154
|
-
* @param data 消息模板数据,键值对形式
|
|
155
|
-
* @param url 点击消息后跳转的URL(可选)
|
|
156
|
-
* @returns 发送结果,包含消息ID
|
|
157
|
-
* @throws OAuthServiceError 当发送失败时抛出异常
|
|
158
|
-
*/
|
|
159
|
-
async sendWechatMessage(templateId, userId, data, url) {
|
|
160
|
-
try {
|
|
161
|
-
const payload = {
|
|
162
|
-
templateId,
|
|
163
|
-
userId,
|
|
164
|
-
data
|
|
165
|
-
};
|
|
166
|
-
if (url) {
|
|
167
|
-
payload.url = url;
|
|
168
|
-
}
|
|
169
|
-
const httpClient = (0, http_1.default)();
|
|
170
|
-
const response = await httpClient.post('/message/wechat', payload);
|
|
171
|
-
return response.data;
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
const errorMsg = error.response?.data?.message || error.message || '微信消息发送失败';
|
|
175
|
-
throw new OAuthServiceError('SEND_WECHAT_MESSAGE_FAILED', errorMsg, error.response?.data);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* 批量发送微信模板消息给指定角色的用户
|
|
180
|
-
*
|
|
181
|
-
* @param templateId 微信消息模板ID
|
|
182
|
-
* @param data 消息模板数据,格式: { "key": { "value": "content" }, ... }
|
|
183
|
-
* @param roleIds 目标用户的角色ID数组
|
|
184
|
-
* @param url 点击消息后跳转的URL(可选)
|
|
185
|
-
* @returns 批量发送结果,包含发送统计和详细结果
|
|
186
|
-
* @throws OAuthServiceError 当批量发送失败时抛出异常
|
|
187
|
-
*/
|
|
188
|
-
async broadcastWechatMessage(templateId, data, roleIds, url) {
|
|
189
|
-
try {
|
|
190
|
-
const payload = {
|
|
191
|
-
templateId,
|
|
192
|
-
data,
|
|
193
|
-
roleIds
|
|
194
|
-
};
|
|
195
|
-
if (url) {
|
|
196
|
-
payload.url = url;
|
|
197
|
-
}
|
|
198
|
-
const httpClient = (0, http_1.default)();
|
|
199
|
-
const response = await httpClient.post('/message/wechat/broadcast', payload);
|
|
200
|
-
return response.data;
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
const errorMsg = error.response?.data?.message || error.message || '批量发送微信消息失败';
|
|
204
|
-
throw new OAuthServiceError('BROADCAST_WECHAT_MESSAGE_FAILED', errorMsg, error.response?.data);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* 获取单个用户信息
|
|
209
|
-
* GET /api/oauth/users/:userId
|
|
210
|
-
*
|
|
211
|
-
* @param userId 用户ID
|
|
212
|
-
* @returns 用户信息或 null(如果用户不存在)
|
|
213
|
-
* @throws OAuthServiceError 当获取失败时抛出异常
|
|
214
|
-
*/
|
|
215
|
-
async getUserInfo(userId) {
|
|
216
|
-
try {
|
|
217
|
-
if (!userId) {
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
const httpClient = (0, http_1.default)();
|
|
221
|
-
const response = await httpClient.get(`/users/${userId}`);
|
|
222
|
-
const user = response.data?.data || null;
|
|
223
|
-
return user;
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* 批量获取用户信息
|
|
231
|
-
* 并行请求多个用户信息,提高性能
|
|
232
|
-
*
|
|
233
|
-
* @param userIds 用户ID数组
|
|
234
|
-
* @returns 用户信息数组(保持输入顺序,不存在的用户为 null)
|
|
235
|
-
* @throws OAuthServiceError 当批量获取失败时抛出异常
|
|
236
|
-
*/
|
|
237
|
-
async getUsersInfo(userIds) {
|
|
238
|
-
try {
|
|
239
|
-
if (!userIds || userIds.length === 0) {
|
|
240
|
-
return [];
|
|
241
|
-
}
|
|
242
|
-
// 去重并过滤空值
|
|
243
|
-
const uniqueIds = [...new Set(userIds.filter(Boolean))];
|
|
244
|
-
// 并行请求所有用户
|
|
245
|
-
const httpClient = (0, http_1.default)();
|
|
246
|
-
const promises = uniqueIds.map(userId => this.getUserInfo(userId).catch(() => null));
|
|
247
|
-
const results = await Promise.all(promises);
|
|
248
|
-
// 构建 userId -> user 的 Map
|
|
249
|
-
const userMap = new Map();
|
|
250
|
-
uniqueIds.forEach((userId, index) => {
|
|
251
|
-
userMap.set(userId, results[index]);
|
|
252
|
-
});
|
|
253
|
-
// 按原始顺序返回
|
|
254
|
-
const orderedResults = userIds.map(id => userMap.get(id) || null);
|
|
255
|
-
return orderedResults;
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
// 返回与输入等长的 null 数组
|
|
259
|
-
return userIds.map(() => null);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* 搜索用户
|
|
264
|
-
* GET /api/oauth/users?term=xxx&limit=20
|
|
265
|
-
*
|
|
266
|
-
* @param searchTerm 搜索词
|
|
267
|
-
* @param limit 返回最多数量(默认20,最大100)
|
|
268
|
-
* @returns 搜索到的用户数组
|
|
269
|
-
* @throws OAuthServiceError 当搜索失败时抛出异常
|
|
270
|
-
*/
|
|
271
|
-
async searchUsers(searchTerm, limit = 20) {
|
|
272
|
-
try {
|
|
273
|
-
if (!searchTerm || searchTerm.trim() === '') {
|
|
274
|
-
return [];
|
|
275
|
-
}
|
|
276
|
-
const httpClient = (0, http_1.default)();
|
|
277
|
-
const response = await httpClient.get('/users', {
|
|
278
|
-
params: {
|
|
279
|
-
term: searchTerm.trim(),
|
|
280
|
-
limit: Math.min(limit, 100),
|
|
281
|
-
skip: 0
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
const users = response.data?.data || [];
|
|
285
|
-
return users;
|
|
286
|
-
}
|
|
287
|
-
catch (error) {
|
|
288
|
-
return [];
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* 获取当前客户端的权限配置
|
|
293
|
-
* GET /api/oauth/permissions
|
|
294
|
-
*
|
|
295
|
-
* @returns 权限树和客户端权限配置
|
|
296
|
-
* @throws OAuthServiceError 当获取失败时抛出异常
|
|
297
|
-
*/
|
|
298
|
-
async getPermissions() {
|
|
299
|
-
try {
|
|
300
|
-
const httpClient = (0, http_1.default)();
|
|
301
|
-
const response = await httpClient.get('/permissions');
|
|
302
|
-
// OAuth API 标准响应格式:{ code, message, data: { permissionsTree, clientPermissions } }
|
|
303
|
-
const body = response.data;
|
|
304
|
-
return body?.data ?? response.data;
|
|
305
|
-
}
|
|
306
|
-
catch (error) {
|
|
307
|
-
const errorMsg = error.message || '权限配置获取失败';
|
|
308
|
-
throw new OAuthServiceError('GET_PERMISSIONS_FAILED', errorMsg, error.response?.data);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* 更新当前客户端的权限配置
|
|
313
|
-
* PUT /api/oauth/permissions
|
|
314
|
-
*
|
|
315
|
-
* @param permissionsConfig 权限配置对象,包含:
|
|
316
|
-
* - permissions: 权限数组 ["module:operation"]
|
|
317
|
-
* - permissionLabels: 模块标签数组 [{module, zh, en}]
|
|
318
|
-
* @returns 更新后的权限配置
|
|
319
|
-
* @throws OAuthServiceError 当更新失败时抛出异常
|
|
320
|
-
*/
|
|
321
|
-
async updatePermissions(permissionsConfig) {
|
|
322
|
-
if ((0, mockConfig_1.isMockMode)()) {
|
|
323
|
-
return null;
|
|
324
|
-
}
|
|
325
|
-
try {
|
|
326
|
-
const httpClient = (0, http_1.default)();
|
|
327
|
-
const response = await httpClient.put('/permissions', { ...permissionsConfig });
|
|
328
|
-
// OAuth API 标准响应格式:{ code, message, data: { clientKey, name, permissions, ... } }
|
|
329
|
-
const body = response.data;
|
|
330
|
-
return body?.data ?? response.data;
|
|
331
|
-
}
|
|
332
|
-
catch (error) {
|
|
333
|
-
const errorMsg = error.message || '权限配置更新失败';
|
|
334
|
-
throw new OAuthServiceError('UPDATE_PERMISSIONS_FAILED', errorMsg, error.response?.data);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
exports.OAuthService = OAuthService;
|
|
339
|
-
// 导出单例实例
|
|
340
|
-
let serviceInstance = null;
|
|
341
|
-
/**
|
|
342
|
-
* 初始化 OAuth 服务
|
|
343
|
-
*/
|
|
344
|
-
const initOAuthService = () => {
|
|
345
|
-
if (serviceInstance) {
|
|
346
|
-
return serviceInstance;
|
|
347
|
-
}
|
|
348
|
-
serviceInstance = new OAuthService();
|
|
349
|
-
return serviceInstance;
|
|
350
|
-
};
|
|
351
|
-
exports.initOAuthService = initOAuthService;
|
|
352
|
-
/**
|
|
353
|
-
* 获取 OAuth 服务实例
|
|
354
|
-
*/
|
|
355
|
-
const getOAuthService = () => {
|
|
356
|
-
return serviceInstance;
|
|
357
|
-
};
|
|
358
|
-
exports.getOAuthService = getOAuthService;
|
|
359
|
-
exports.default = OAuthService;
|
|
360
|
-
//# sourceMappingURL=oauthService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauthService.js","sourceRoot":"","sources":["../../../server/services/oauthService.ts"],"names":[],"mappings":"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"}
|