sumor 3.3.3 → 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.
Files changed (34) hide show
  1. package/README.md +53 -0
  2. package/README.zh-CN.md +61 -7
  3. package/dist/server/controllers/logoutController.js +2 -2
  4. package/dist/server/controllers/oauthCallbackController.js +2 -2
  5. package/dist/server/controllers/tokenRefreshController.js +2 -2
  6. package/dist/server/index.d.ts +1 -1
  7. package/dist/server/index.js +2 -2
  8. package/dist/server/models/blacklistModel.js +2 -2
  9. package/dist/server/models/jwksModel.js +2 -2
  10. package/dist/server/services/OAuthService.d.ts +24 -0
  11. package/dist/server/services/OAuthService.d.ts.map +1 -0
  12. package/dist/server/services/OAuthService.js +32 -0
  13. package/dist/server/services/OAuthService.js.map +1 -0
  14. package/dist/server/services/oauth/MockDataGenerator.d.ts +18 -0
  15. package/dist/server/services/oauth/MockDataGenerator.d.ts.map +1 -0
  16. package/dist/server/services/oauth/MockDataGenerator.js +39 -0
  17. package/dist/server/services/oauth/MockDataGenerator.js.map +1 -0
  18. package/dist/server/services/oauth/OAuthMockService.d.ts +28 -0
  19. package/dist/server/services/oauth/OAuthMockService.d.ts.map +1 -0
  20. package/dist/server/services/oauth/OAuthMockService.js +184 -0
  21. package/dist/server/services/oauth/OAuthMockService.js.map +1 -0
  22. package/dist/server/services/oauth/OAuthProductionService.d.ts +22 -0
  23. package/dist/server/services/oauth/OAuthProductionService.d.ts.map +1 -0
  24. package/dist/server/services/oauth/OAuthProductionService.js +203 -0
  25. package/dist/server/services/oauth/OAuthProductionService.js.map +1 -0
  26. package/dist/server/services/oauth/OAuthServiceError.d.ts +9 -0
  27. package/dist/server/services/oauth/OAuthServiceError.d.ts.map +1 -0
  28. package/dist/server/services/oauth/OAuthServiceError.js +16 -0
  29. package/dist/server/services/oauth/OAuthServiceError.js.map +1 -0
  30. package/package.json +1 -1
  31. package/dist/server/services/oauthService.d.ts +0 -149
  32. package/dist/server/services/oauthService.d.ts.map +0 -1
  33. package/dist/server/services/oauthService.js +0 -360
  34. 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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"}