@longzai-intelligence-auth/core 0.0.5 → 0.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/index.d.ts +1297 -0
- package/dist/index.js +1 -0
- package/package.json +6 -17
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +0 -532
- package/dist/index.d.mts +0 -532
- package/dist/index.mjs +0 -1
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,1297 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DomainError } from "@longzai-intelligence/error";
|
|
3
|
+
|
|
4
|
+
//#region src/types/token.types.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* AccessToken 载荷类型
|
|
7
|
+
*/
|
|
8
|
+
type AccessTokenPayload = {
|
|
9
|
+
/**
|
|
10
|
+
* 用户 ID
|
|
11
|
+
*/
|
|
12
|
+
sub: string;
|
|
13
|
+
/**
|
|
14
|
+
* Token 类型
|
|
15
|
+
*/
|
|
16
|
+
type: "access";
|
|
17
|
+
/**
|
|
18
|
+
* 租户 ID
|
|
19
|
+
*/
|
|
20
|
+
tenantId?: string;
|
|
21
|
+
/**
|
|
22
|
+
* 签发者
|
|
23
|
+
*/
|
|
24
|
+
iss?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 受众
|
|
27
|
+
*/
|
|
28
|
+
aud?: string;
|
|
29
|
+
/**
|
|
30
|
+
* JWT ID
|
|
31
|
+
*/
|
|
32
|
+
jti?: string;
|
|
33
|
+
/**
|
|
34
|
+
* 角色列表
|
|
35
|
+
*/
|
|
36
|
+
roles?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* 权限列表
|
|
39
|
+
*/
|
|
40
|
+
permissions?: string[];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* RefreshToken 载荷类型
|
|
44
|
+
*/
|
|
45
|
+
type RefreshTokenPayload = {
|
|
46
|
+
/**
|
|
47
|
+
* 用户 ID
|
|
48
|
+
*/
|
|
49
|
+
sub: string;
|
|
50
|
+
/**
|
|
51
|
+
* 会话 ID
|
|
52
|
+
*/
|
|
53
|
+
sessionId: string;
|
|
54
|
+
/**
|
|
55
|
+
* Token 类型
|
|
56
|
+
*/
|
|
57
|
+
type: "refresh";
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 密码重置 Token 载荷类型
|
|
61
|
+
*/
|
|
62
|
+
type PasswordResetTokenPayload = {
|
|
63
|
+
/**
|
|
64
|
+
* 用户 ID
|
|
65
|
+
*/
|
|
66
|
+
sub: string;
|
|
67
|
+
/**
|
|
68
|
+
* Token 类型
|
|
69
|
+
*/
|
|
70
|
+
type: "password_reset";
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* MFA 待验证 Token 载荷类型
|
|
74
|
+
*/
|
|
75
|
+
type MfaPendingTokenPayload = {
|
|
76
|
+
/**
|
|
77
|
+
* 用户 ID
|
|
78
|
+
*/
|
|
79
|
+
sub: string;
|
|
80
|
+
/**
|
|
81
|
+
* Token 类型
|
|
82
|
+
*/
|
|
83
|
+
type: "mfa_pending";
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* 所有 Token 载荷类型的联合类型
|
|
87
|
+
*/
|
|
88
|
+
type TokenPayload = AccessTokenPayload | RefreshTokenPayload | PasswordResetTokenPayload | MfaPendingTokenPayload;
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/types/auth-context.types.d.ts
|
|
91
|
+
/**
|
|
92
|
+
* 用户基础信息(从 JWT 解析得到)
|
|
93
|
+
*/
|
|
94
|
+
type UserInfo = {
|
|
95
|
+
/**
|
|
96
|
+
* 用户 ID
|
|
97
|
+
*/
|
|
98
|
+
userId: string;
|
|
99
|
+
/**
|
|
100
|
+
* 租户 ID
|
|
101
|
+
*/
|
|
102
|
+
tenantId?: string;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* 认证上下文(由认证插件注入到请求上下文中)
|
|
106
|
+
*/
|
|
107
|
+
type AuthContext = {
|
|
108
|
+
/**
|
|
109
|
+
* 已认证用户的 ID
|
|
110
|
+
*/
|
|
111
|
+
userId: string;
|
|
112
|
+
/**
|
|
113
|
+
* 当前租户 ID
|
|
114
|
+
*/
|
|
115
|
+
tenantId?: string;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* 统一认证上下文,所有认证插件输出一致的结构
|
|
119
|
+
*/
|
|
120
|
+
type UnifiedAuthContext = {
|
|
121
|
+
/**
|
|
122
|
+
* 用户唯一标识
|
|
123
|
+
*/
|
|
124
|
+
userId: string;
|
|
125
|
+
/**
|
|
126
|
+
* 租户ID
|
|
127
|
+
*/
|
|
128
|
+
tenantId: string;
|
|
129
|
+
/**
|
|
130
|
+
* 用户角色列表
|
|
131
|
+
*/
|
|
132
|
+
roles: string[];
|
|
133
|
+
/**
|
|
134
|
+
* 用户权限列表
|
|
135
|
+
*/
|
|
136
|
+
permissions: string[];
|
|
137
|
+
/**
|
|
138
|
+
* 认证方式
|
|
139
|
+
*/
|
|
140
|
+
authMethod: "jwt" | "api-key";
|
|
141
|
+
};
|
|
142
|
+
//#endregion
|
|
143
|
+
//#region src/types/permission.types.d.ts
|
|
144
|
+
/**
|
|
145
|
+
* 资源操作权限标识
|
|
146
|
+
*/
|
|
147
|
+
type ResourceAction = {
|
|
148
|
+
/**
|
|
149
|
+
* 资源标识(如 "user", "role")
|
|
150
|
+
*/
|
|
151
|
+
resource: string;
|
|
152
|
+
/**
|
|
153
|
+
* 操作标识(如 "read", "write", "delete")
|
|
154
|
+
*/
|
|
155
|
+
action: string;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* 权限检查函数类型
|
|
159
|
+
*/
|
|
160
|
+
type PermissionCheckFn = (userId: string, resource: string, action: string) => Promise<void>;
|
|
161
|
+
/**
|
|
162
|
+
* 带租户隔离的权限检查函数类型
|
|
163
|
+
*/
|
|
164
|
+
type TenantPermissionCheckFn = (userId: string, tenantId: string, resource: string, action: string) => Promise<void>;
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/types/config.types.d.ts
|
|
167
|
+
/**
|
|
168
|
+
* JWT 配置
|
|
169
|
+
*/
|
|
170
|
+
type JwtConfig = {
|
|
171
|
+
/**
|
|
172
|
+
* JWT 签名密钥
|
|
173
|
+
*/
|
|
174
|
+
secret: string;
|
|
175
|
+
/**
|
|
176
|
+
* AccessToken 有效期(如 "15m")
|
|
177
|
+
*/
|
|
178
|
+
accessExpiresIn: string;
|
|
179
|
+
/**
|
|
180
|
+
* RefreshToken 有效期(如 "7d")
|
|
181
|
+
*/
|
|
182
|
+
refreshExpiresIn: string;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* 密码策略配置
|
|
186
|
+
*/
|
|
187
|
+
type PasswordPolicyConfig = {
|
|
188
|
+
/**
|
|
189
|
+
* 最小长度
|
|
190
|
+
*/
|
|
191
|
+
minLength: number;
|
|
192
|
+
/**
|
|
193
|
+
* 是否要求大写字母
|
|
194
|
+
*/
|
|
195
|
+
requireUppercase: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* 是否要求小写字母
|
|
198
|
+
*/
|
|
199
|
+
requireLowercase: boolean;
|
|
200
|
+
/**
|
|
201
|
+
* 是否要求数字
|
|
202
|
+
*/
|
|
203
|
+
requireNumber: boolean;
|
|
204
|
+
/**
|
|
205
|
+
* 是否要求特殊字符
|
|
206
|
+
*/
|
|
207
|
+
requireSpecial: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* 历史密码检查数量
|
|
210
|
+
*/
|
|
211
|
+
historyCount: number;
|
|
212
|
+
/**
|
|
213
|
+
* 过期天数(0 表示不过期)
|
|
214
|
+
*/
|
|
215
|
+
expireDays: number;
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* 认证共享包完整配置
|
|
219
|
+
*/
|
|
220
|
+
type AuthConfig = {
|
|
221
|
+
/**
|
|
222
|
+
* JWT 配置
|
|
223
|
+
*/
|
|
224
|
+
jwt: JwtConfig;
|
|
225
|
+
/**
|
|
226
|
+
* 密码策略配置
|
|
227
|
+
*/
|
|
228
|
+
passwordPolicy: PasswordPolicyConfig;
|
|
229
|
+
/**
|
|
230
|
+
* 默认租户 ID(用于非多租户模式)
|
|
231
|
+
*/
|
|
232
|
+
defaultTenantId: string;
|
|
233
|
+
};
|
|
234
|
+
//#endregion
|
|
235
|
+
//#region src/types/password.types.d.ts
|
|
236
|
+
/**
|
|
237
|
+
* 密码验证结果
|
|
238
|
+
*/
|
|
239
|
+
type PasswordValidationResult = {
|
|
240
|
+
/**
|
|
241
|
+
* 是否通过验证
|
|
242
|
+
*/
|
|
243
|
+
valid: boolean;
|
|
244
|
+
/**
|
|
245
|
+
* 验证失败的错误消息列表
|
|
246
|
+
*/
|
|
247
|
+
errors: string[];
|
|
248
|
+
};
|
|
249
|
+
//#endregion
|
|
250
|
+
//#region src/types/rate-limit.types.d.ts
|
|
251
|
+
/**
|
|
252
|
+
* 限流配置
|
|
253
|
+
*/
|
|
254
|
+
type RateLimitConfig = {
|
|
255
|
+
/**
|
|
256
|
+
* 时间窗口秒数
|
|
257
|
+
*/
|
|
258
|
+
windowSeconds: number;
|
|
259
|
+
/**
|
|
260
|
+
* 最大请求数
|
|
261
|
+
*/
|
|
262
|
+
maxRequests: number;
|
|
263
|
+
};
|
|
264
|
+
//#endregion
|
|
265
|
+
//#region src/types/logger.types.d.ts
|
|
266
|
+
/**
|
|
267
|
+
* 日志服务接口
|
|
268
|
+
*/
|
|
269
|
+
type LoggerService = {
|
|
270
|
+
/**
|
|
271
|
+
* 调试级别日志
|
|
272
|
+
*/
|
|
273
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
274
|
+
/**
|
|
275
|
+
* 信息级别日志
|
|
276
|
+
*/
|
|
277
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
278
|
+
/**
|
|
279
|
+
* 警告级别日志
|
|
280
|
+
*/
|
|
281
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
282
|
+
/**
|
|
283
|
+
* 错误级别日志
|
|
284
|
+
*/
|
|
285
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
286
|
+
};
|
|
287
|
+
//#endregion
|
|
288
|
+
//#region src/types/auth-api.types.d.ts
|
|
289
|
+
/**
|
|
290
|
+
* 登录请求
|
|
291
|
+
*/
|
|
292
|
+
type LoginRequest = {
|
|
293
|
+
/**
|
|
294
|
+
* 邮箱
|
|
295
|
+
*/
|
|
296
|
+
email: string;
|
|
297
|
+
/**
|
|
298
|
+
* 密码
|
|
299
|
+
*/
|
|
300
|
+
password: string;
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* 登录响应
|
|
304
|
+
*/
|
|
305
|
+
type LoginResponse = {
|
|
306
|
+
/**
|
|
307
|
+
* 访问令牌
|
|
308
|
+
*/
|
|
309
|
+
accessToken: string;
|
|
310
|
+
/**
|
|
311
|
+
* 刷新令牌
|
|
312
|
+
*/
|
|
313
|
+
refreshToken: string;
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* 注册请求
|
|
317
|
+
*/
|
|
318
|
+
type RegisterRequest = {
|
|
319
|
+
/**
|
|
320
|
+
* 邮箱
|
|
321
|
+
*/
|
|
322
|
+
email: string;
|
|
323
|
+
/**
|
|
324
|
+
* 密码
|
|
325
|
+
*/
|
|
326
|
+
password: string;
|
|
327
|
+
/**
|
|
328
|
+
* 用户名
|
|
329
|
+
*/
|
|
330
|
+
name: string;
|
|
331
|
+
};
|
|
332
|
+
/**
|
|
333
|
+
* 注册响应
|
|
334
|
+
*/
|
|
335
|
+
type RegisterResponse = {
|
|
336
|
+
/**
|
|
337
|
+
* 用户 ID
|
|
338
|
+
*/
|
|
339
|
+
userId: string;
|
|
340
|
+
/**
|
|
341
|
+
* 消息
|
|
342
|
+
*/
|
|
343
|
+
message: string;
|
|
344
|
+
};
|
|
345
|
+
/**
|
|
346
|
+
* 刷新 Token 请求
|
|
347
|
+
*/
|
|
348
|
+
type RefreshTokenRequest = {
|
|
349
|
+
/**
|
|
350
|
+
* 刷新令牌
|
|
351
|
+
*/
|
|
352
|
+
refreshToken: string;
|
|
353
|
+
};
|
|
354
|
+
/**
|
|
355
|
+
* 刷新 Token 响应
|
|
356
|
+
*/
|
|
357
|
+
type RefreshTokenResponse = {
|
|
358
|
+
/**
|
|
359
|
+
* 访问令牌
|
|
360
|
+
*/
|
|
361
|
+
accessToken: string;
|
|
362
|
+
/**
|
|
363
|
+
* 刷新令牌
|
|
364
|
+
*/
|
|
365
|
+
refreshToken: string;
|
|
366
|
+
};
|
|
367
|
+
/**
|
|
368
|
+
* 密码重置请求
|
|
369
|
+
*/
|
|
370
|
+
type PasswordResetRequest = {
|
|
371
|
+
/**
|
|
372
|
+
* 邮箱
|
|
373
|
+
*/
|
|
374
|
+
email: string;
|
|
375
|
+
};
|
|
376
|
+
/**
|
|
377
|
+
* 密码重置确认请求
|
|
378
|
+
*/
|
|
379
|
+
type PasswordResetConfirmRequest = {
|
|
380
|
+
/**
|
|
381
|
+
* 重置令牌
|
|
382
|
+
*/
|
|
383
|
+
token: string;
|
|
384
|
+
/**
|
|
385
|
+
* 新密码
|
|
386
|
+
*/
|
|
387
|
+
password: string;
|
|
388
|
+
};
|
|
389
|
+
/**
|
|
390
|
+
* 修改密码请求
|
|
391
|
+
*/
|
|
392
|
+
type ChangePasswordRequest = {
|
|
393
|
+
/**
|
|
394
|
+
* 旧密码
|
|
395
|
+
*/
|
|
396
|
+
oldPassword: string;
|
|
397
|
+
/**
|
|
398
|
+
* 新密码
|
|
399
|
+
*/
|
|
400
|
+
newPassword: string;
|
|
401
|
+
};
|
|
402
|
+
/**
|
|
403
|
+
* 通用消息响应
|
|
404
|
+
*/
|
|
405
|
+
type MessageResponse = {
|
|
406
|
+
/**
|
|
407
|
+
* 消息内容
|
|
408
|
+
*/
|
|
409
|
+
message: string;
|
|
410
|
+
};
|
|
411
|
+
/**
|
|
412
|
+
* 当前用户信息响应
|
|
413
|
+
*/
|
|
414
|
+
type MeResponse = {
|
|
415
|
+
/**
|
|
416
|
+
* 用户 ID
|
|
417
|
+
*/
|
|
418
|
+
userId: string;
|
|
419
|
+
/**
|
|
420
|
+
* 租户 ID
|
|
421
|
+
*/
|
|
422
|
+
tenantId?: string;
|
|
423
|
+
};
|
|
424
|
+
//#endregion
|
|
425
|
+
//#region src/types/user.types.d.ts
|
|
426
|
+
/**
|
|
427
|
+
* 用户状态
|
|
428
|
+
*/
|
|
429
|
+
type UserStatus = "active" | "disabled" | "locked";
|
|
430
|
+
/**
|
|
431
|
+
* 用户数据类型(替代 UserEntity)
|
|
432
|
+
*/
|
|
433
|
+
type User = {
|
|
434
|
+
/**
|
|
435
|
+
* 用户 ID
|
|
436
|
+
*/
|
|
437
|
+
id: string;
|
|
438
|
+
/**
|
|
439
|
+
* 邮箱
|
|
440
|
+
*/
|
|
441
|
+
email: string;
|
|
442
|
+
/**
|
|
443
|
+
* 用户名
|
|
444
|
+
*/
|
|
445
|
+
username: string;
|
|
446
|
+
/**
|
|
447
|
+
* 密码哈希
|
|
448
|
+
*/
|
|
449
|
+
passwordHash: string;
|
|
450
|
+
/**
|
|
451
|
+
* 显示名称
|
|
452
|
+
*/
|
|
453
|
+
displayName: string | null;
|
|
454
|
+
/**
|
|
455
|
+
* 头像 URL
|
|
456
|
+
*/
|
|
457
|
+
avatarUrl: string | null;
|
|
458
|
+
/**
|
|
459
|
+
* 用户状态
|
|
460
|
+
*/
|
|
461
|
+
status: UserStatus;
|
|
462
|
+
/**
|
|
463
|
+
* 是否启用 MFA
|
|
464
|
+
*/
|
|
465
|
+
mfaEnabled: boolean;
|
|
466
|
+
/**
|
|
467
|
+
* MFA 密钥
|
|
468
|
+
*/
|
|
469
|
+
mfaSecret: string | null;
|
|
470
|
+
/**
|
|
471
|
+
* 连续登录失败次数
|
|
472
|
+
*/
|
|
473
|
+
failedLoginAttempts: number;
|
|
474
|
+
/**
|
|
475
|
+
* 锁定截止时间
|
|
476
|
+
*/
|
|
477
|
+
lockedUntil: string | null;
|
|
478
|
+
/**
|
|
479
|
+
* 密码修改时间
|
|
480
|
+
*/
|
|
481
|
+
passwordChangedAt: string | null;
|
|
482
|
+
/**
|
|
483
|
+
* 最后登录时间
|
|
484
|
+
*/
|
|
485
|
+
lastLoginAt: string | null;
|
|
486
|
+
/**
|
|
487
|
+
* 创建时间
|
|
488
|
+
*/
|
|
489
|
+
createdAt: string;
|
|
490
|
+
/**
|
|
491
|
+
* 更新时间
|
|
492
|
+
*/
|
|
493
|
+
updatedAt: string;
|
|
494
|
+
};
|
|
495
|
+
/**
|
|
496
|
+
* 创建用户输入
|
|
497
|
+
*/
|
|
498
|
+
type CreateUserInput = {
|
|
499
|
+
email: string;
|
|
500
|
+
username: string;
|
|
501
|
+
passwordHash: string;
|
|
502
|
+
displayName?: string;
|
|
503
|
+
avatarUrl?: string;
|
|
504
|
+
};
|
|
505
|
+
/**
|
|
506
|
+
* 更新用户输入
|
|
507
|
+
*/
|
|
508
|
+
type UpdateUserInput = {
|
|
509
|
+
displayName?: string;
|
|
510
|
+
avatarUrl?: string;
|
|
511
|
+
};
|
|
512
|
+
//#endregion
|
|
513
|
+
//#region src/types/session.types.d.ts
|
|
514
|
+
/**
|
|
515
|
+
* 会话数据类型(替代 SessionEntity)
|
|
516
|
+
*/
|
|
517
|
+
type Session = {
|
|
518
|
+
/**
|
|
519
|
+
* 会话 ID
|
|
520
|
+
*/
|
|
521
|
+
id: string;
|
|
522
|
+
/**
|
|
523
|
+
* 关联用户 ID
|
|
524
|
+
*/
|
|
525
|
+
userId: string;
|
|
526
|
+
/**
|
|
527
|
+
* 租户 ID
|
|
528
|
+
*/
|
|
529
|
+
tenantId: string;
|
|
530
|
+
/**
|
|
531
|
+
* 刷新令牌哈希
|
|
532
|
+
*/
|
|
533
|
+
refreshTokenHash: string;
|
|
534
|
+
/**
|
|
535
|
+
* 设备信息
|
|
536
|
+
*/
|
|
537
|
+
deviceInfo: string | null;
|
|
538
|
+
/**
|
|
539
|
+
* IP 地址
|
|
540
|
+
*/
|
|
541
|
+
ipAddress: string | null;
|
|
542
|
+
/**
|
|
543
|
+
* 用户代理
|
|
544
|
+
*/
|
|
545
|
+
userAgent: string | null;
|
|
546
|
+
/**
|
|
547
|
+
* 过期时间
|
|
548
|
+
*/
|
|
549
|
+
expiresAt: string;
|
|
550
|
+
/**
|
|
551
|
+
* 创建时间
|
|
552
|
+
*/
|
|
553
|
+
createdAt: string;
|
|
554
|
+
};
|
|
555
|
+
/**
|
|
556
|
+
* 创建会话输入
|
|
557
|
+
*/
|
|
558
|
+
type CreateSessionInput = {
|
|
559
|
+
userId: string;
|
|
560
|
+
tenantId: string;
|
|
561
|
+
refreshTokenHash: string;
|
|
562
|
+
deviceInfo?: string;
|
|
563
|
+
ipAddress?: string;
|
|
564
|
+
userAgent?: string;
|
|
565
|
+
expiresAt: string;
|
|
566
|
+
};
|
|
567
|
+
/**
|
|
568
|
+
* 会话信息,等价于 Session
|
|
569
|
+
*/
|
|
570
|
+
type SessionInfo = Session;
|
|
571
|
+
//#endregion
|
|
572
|
+
//#region src/types/tenant.types.d.ts
|
|
573
|
+
/**
|
|
574
|
+
* 租户状态
|
|
575
|
+
*/
|
|
576
|
+
type TenantStatus = "active" | "suspended";
|
|
577
|
+
/**
|
|
578
|
+
* 租户数据类型(替代 TenantEntity)
|
|
579
|
+
*/
|
|
580
|
+
type Tenant = {
|
|
581
|
+
/**
|
|
582
|
+
* 租户 ID
|
|
583
|
+
*/
|
|
584
|
+
id: string;
|
|
585
|
+
/**
|
|
586
|
+
* 租户名称
|
|
587
|
+
*/
|
|
588
|
+
name: string;
|
|
589
|
+
/**
|
|
590
|
+
* 租户标识(小写字母数字和连字符)
|
|
591
|
+
*/
|
|
592
|
+
slug: string;
|
|
593
|
+
/**
|
|
594
|
+
* 租户状态
|
|
595
|
+
*/
|
|
596
|
+
status: TenantStatus;
|
|
597
|
+
/**
|
|
598
|
+
* 最大用户数
|
|
599
|
+
*/
|
|
600
|
+
maxUsers: number;
|
|
601
|
+
/**
|
|
602
|
+
* 租户设置
|
|
603
|
+
*/
|
|
604
|
+
settings: string | null;
|
|
605
|
+
/**
|
|
606
|
+
* 创建时间
|
|
607
|
+
*/
|
|
608
|
+
createdAt: string;
|
|
609
|
+
/**
|
|
610
|
+
* 更新时间
|
|
611
|
+
*/
|
|
612
|
+
updatedAt: string;
|
|
613
|
+
};
|
|
614
|
+
/**
|
|
615
|
+
* 创建租户输入
|
|
616
|
+
*/
|
|
617
|
+
type CreateTenantInput = {
|
|
618
|
+
name: string;
|
|
619
|
+
slug: string;
|
|
620
|
+
maxUsers?: number;
|
|
621
|
+
settings?: string;
|
|
622
|
+
};
|
|
623
|
+
/**
|
|
624
|
+
* 更新租户输入
|
|
625
|
+
*/
|
|
626
|
+
type UpdateTenantInput = {
|
|
627
|
+
name?: string;
|
|
628
|
+
maxUsers?: number;
|
|
629
|
+
settings?: string;
|
|
630
|
+
};
|
|
631
|
+
//#endregion
|
|
632
|
+
//#region src/types/tenant-member.types.d.ts
|
|
633
|
+
/**
|
|
634
|
+
* 租户成员角色
|
|
635
|
+
*/
|
|
636
|
+
type TenantMemberRole = "owner" | "admin" | "member";
|
|
637
|
+
/**
|
|
638
|
+
* 租户成员数据类型(替代 TenantMemberEntity)
|
|
639
|
+
*/
|
|
640
|
+
type TenantMember = {
|
|
641
|
+
/**
|
|
642
|
+
* 成员记录 ID
|
|
643
|
+
*/
|
|
644
|
+
id: string;
|
|
645
|
+
/**
|
|
646
|
+
* 所属租户标识
|
|
647
|
+
*/
|
|
648
|
+
tenantId: string;
|
|
649
|
+
/**
|
|
650
|
+
* 用户标识
|
|
651
|
+
*/
|
|
652
|
+
userId: string;
|
|
653
|
+
/**
|
|
654
|
+
* 成员角色
|
|
655
|
+
*/
|
|
656
|
+
role: TenantMemberRole;
|
|
657
|
+
/**
|
|
658
|
+
* 加入时间
|
|
659
|
+
*/
|
|
660
|
+
joinedAt: string;
|
|
661
|
+
};
|
|
662
|
+
/**
|
|
663
|
+
* 创建租户成员输入
|
|
664
|
+
*/
|
|
665
|
+
type CreateTenantMemberInput = {
|
|
666
|
+
tenantId: string;
|
|
667
|
+
userId: string;
|
|
668
|
+
role?: TenantMemberRole;
|
|
669
|
+
};
|
|
670
|
+
//#endregion
|
|
671
|
+
//#region src/schemas/auth-config.schema.d.ts
|
|
672
|
+
/** JWT 配置 Schema */
|
|
673
|
+
declare const jwtConfigSchema: z.ZodObject<{
|
|
674
|
+
secret: z.ZodString;
|
|
675
|
+
accessExpiresIn: z.ZodDefault<z.ZodString>;
|
|
676
|
+
refreshExpiresIn: z.ZodDefault<z.ZodString>;
|
|
677
|
+
}, z.core.$strip>;
|
|
678
|
+
/** 密码策略配置 Schema */
|
|
679
|
+
declare const passwordPolicyConfigSchema: z.ZodObject<{
|
|
680
|
+
minLength: z.ZodDefault<z.ZodNumber>;
|
|
681
|
+
requireUppercase: z.ZodDefault<z.ZodBoolean>;
|
|
682
|
+
requireLowercase: z.ZodDefault<z.ZodBoolean>;
|
|
683
|
+
requireNumber: z.ZodDefault<z.ZodBoolean>;
|
|
684
|
+
requireSpecial: z.ZodDefault<z.ZodBoolean>;
|
|
685
|
+
historyCount: z.ZodDefault<z.ZodNumber>;
|
|
686
|
+
expireDays: z.ZodDefault<z.ZodNumber>;
|
|
687
|
+
}, z.core.$strip>;
|
|
688
|
+
/** 限流配置 Schema */
|
|
689
|
+
declare const rateLimitConfigSchema: z.ZodObject<{
|
|
690
|
+
windowSeconds: z.ZodDefault<z.ZodNumber>;
|
|
691
|
+
maxRequests: z.ZodDefault<z.ZodNumber>;
|
|
692
|
+
}, z.core.$strip>;
|
|
693
|
+
/** 认证共享包完整配置 Schema */
|
|
694
|
+
declare const authConfigSchema: z.ZodObject<{
|
|
695
|
+
jwt: z.ZodObject<{
|
|
696
|
+
secret: z.ZodString;
|
|
697
|
+
accessExpiresIn: z.ZodDefault<z.ZodString>;
|
|
698
|
+
refreshExpiresIn: z.ZodDefault<z.ZodString>;
|
|
699
|
+
}, z.core.$strip>;
|
|
700
|
+
passwordPolicy: z.ZodObject<{
|
|
701
|
+
minLength: z.ZodDefault<z.ZodNumber>;
|
|
702
|
+
requireUppercase: z.ZodDefault<z.ZodBoolean>;
|
|
703
|
+
requireLowercase: z.ZodDefault<z.ZodBoolean>;
|
|
704
|
+
requireNumber: z.ZodDefault<z.ZodBoolean>;
|
|
705
|
+
requireSpecial: z.ZodDefault<z.ZodBoolean>;
|
|
706
|
+
historyCount: z.ZodDefault<z.ZodNumber>;
|
|
707
|
+
expireDays: z.ZodDefault<z.ZodNumber>;
|
|
708
|
+
}, z.core.$strip>;
|
|
709
|
+
defaultTenantId: z.ZodDefault<z.ZodString>;
|
|
710
|
+
}, z.core.$strip>;
|
|
711
|
+
//#endregion
|
|
712
|
+
//#region src/schemas/token.schema.d.ts
|
|
713
|
+
/** AccessToken 载荷 Schema */
|
|
714
|
+
declare const accessTokenPayloadSchema: z.ZodObject<{
|
|
715
|
+
sub: z.ZodString;
|
|
716
|
+
type: z.ZodLiteral<"access">;
|
|
717
|
+
tenantId: z.ZodOptional<z.ZodString>;
|
|
718
|
+
iss: z.ZodOptional<z.ZodString>;
|
|
719
|
+
aud: z.ZodOptional<z.ZodString>;
|
|
720
|
+
jti: z.ZodOptional<z.ZodString>;
|
|
721
|
+
roles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
722
|
+
permissions: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
723
|
+
}, z.core.$strip>;
|
|
724
|
+
/** RefreshToken 载荷 Schema */
|
|
725
|
+
declare const refreshTokenPayloadSchema: z.ZodObject<{
|
|
726
|
+
sub: z.ZodString;
|
|
727
|
+
sessionId: z.ZodString;
|
|
728
|
+
type: z.ZodLiteral<"refresh">;
|
|
729
|
+
}, z.core.$strip>;
|
|
730
|
+
/** 密码重置 Token 载荷 Schema */
|
|
731
|
+
declare const passwordResetTokenPayloadSchema: z.ZodObject<{
|
|
732
|
+
sub: z.ZodString;
|
|
733
|
+
type: z.ZodLiteral<"password_reset">;
|
|
734
|
+
}, z.core.$strip>;
|
|
735
|
+
/** MFA 待验证 Token 载荷 Schema */
|
|
736
|
+
declare const mfaPendingTokenPayloadSchema: z.ZodObject<{
|
|
737
|
+
sub: z.ZodString;
|
|
738
|
+
type: z.ZodLiteral<"mfa_pending">;
|
|
739
|
+
}, z.core.$strip>;
|
|
740
|
+
//#endregion
|
|
741
|
+
//#region src/schemas/permission.schema.d.ts
|
|
742
|
+
/** 权限字符串 Schema,格式为 "resource:action" */
|
|
743
|
+
declare const permissionStringSchema: z.ZodString;
|
|
744
|
+
/** 资源操作权限 Schema */
|
|
745
|
+
declare const resourceActionSchema: z.ZodObject<{
|
|
746
|
+
resource: z.ZodString;
|
|
747
|
+
action: z.ZodString;
|
|
748
|
+
}, z.core.$strip>;
|
|
749
|
+
//#endregion
|
|
750
|
+
//#region src/schemas/user.schema.d.ts
|
|
751
|
+
/** 创建用户 Schema */
|
|
752
|
+
declare const createUserSchema: z.ZodObject<{
|
|
753
|
+
email: z.ZodString;
|
|
754
|
+
username: z.ZodString;
|
|
755
|
+
password: z.ZodString;
|
|
756
|
+
displayName: z.ZodOptional<z.ZodString>;
|
|
757
|
+
}, z.core.$strip>;
|
|
758
|
+
/** 更新用户 Schema */
|
|
759
|
+
declare const updateUserSchema: z.ZodObject<{
|
|
760
|
+
displayName: z.ZodOptional<z.ZodString>;
|
|
761
|
+
avatarUrl: z.ZodOptional<z.ZodString>;
|
|
762
|
+
}, z.core.$strip>;
|
|
763
|
+
/** 修改密码 Schema */
|
|
764
|
+
declare const changePasswordSchema: z.ZodObject<{
|
|
765
|
+
currentPassword: z.ZodString;
|
|
766
|
+
newPassword: z.ZodString;
|
|
767
|
+
}, z.core.$strip>;
|
|
768
|
+
//#endregion
|
|
769
|
+
//#region src/schemas/session.schema.d.ts
|
|
770
|
+
/** 登录 Schema */
|
|
771
|
+
declare const loginSchema: z.ZodObject<{
|
|
772
|
+
email: z.ZodString;
|
|
773
|
+
password: z.ZodString;
|
|
774
|
+
}, z.core.$strip>;
|
|
775
|
+
/** 刷新令牌 Schema */
|
|
776
|
+
declare const refreshTokenSchema: z.ZodObject<{
|
|
777
|
+
refreshToken: z.ZodString;
|
|
778
|
+
}, z.core.$strip>;
|
|
779
|
+
//#endregion
|
|
780
|
+
//#region src/ports/strategy.port.d.ts
|
|
781
|
+
/**
|
|
782
|
+
* 令牌验证结果
|
|
783
|
+
*
|
|
784
|
+
* @typeParam T - 令牌载荷类型
|
|
785
|
+
*/
|
|
786
|
+
type TokenVerifyResult<T> = {
|
|
787
|
+
/**
|
|
788
|
+
* 验证是否成功
|
|
789
|
+
*/
|
|
790
|
+
success: boolean;
|
|
791
|
+
/**
|
|
792
|
+
* 解码后的载荷(验证成功时)
|
|
793
|
+
*/
|
|
794
|
+
payload?: T;
|
|
795
|
+
/**
|
|
796
|
+
* 错误信息(验证失败时)
|
|
797
|
+
*/
|
|
798
|
+
error?: string;
|
|
799
|
+
};
|
|
800
|
+
/**
|
|
801
|
+
* 令牌签名器
|
|
802
|
+
*/
|
|
803
|
+
type TokenSigner = {
|
|
804
|
+
/**
|
|
805
|
+
* 签名访问令牌
|
|
806
|
+
*
|
|
807
|
+
* @param payload - 访问令牌载荷
|
|
808
|
+
* @returns 签名后的令牌字符串
|
|
809
|
+
*/
|
|
810
|
+
signAccessToken(payload: AccessTokenPayload): Promise<string>;
|
|
811
|
+
/**
|
|
812
|
+
* 签名刷新令牌
|
|
813
|
+
*
|
|
814
|
+
* @param payload - 刷新令牌载荷
|
|
815
|
+
* @returns 签名后的令牌字符串
|
|
816
|
+
*/
|
|
817
|
+
signRefreshToken(payload: RefreshTokenPayload): Promise<string>;
|
|
818
|
+
};
|
|
819
|
+
/**
|
|
820
|
+
* 令牌验证器
|
|
821
|
+
*/
|
|
822
|
+
type TokenVerifier = {
|
|
823
|
+
/**
|
|
824
|
+
* 验证访问令牌
|
|
825
|
+
*
|
|
826
|
+
* @param token - 要验证的令牌字符串
|
|
827
|
+
* @returns 验证结果
|
|
828
|
+
*/
|
|
829
|
+
verifyAccessToken(token: string): Promise<TokenVerifyResult<AccessTokenPayload>>;
|
|
830
|
+
/**
|
|
831
|
+
* 验证刷新令牌
|
|
832
|
+
*
|
|
833
|
+
* @param token - 要验证的令牌字符串
|
|
834
|
+
* @returns 验证结果
|
|
835
|
+
*/
|
|
836
|
+
verifyRefreshToken(token: string): Promise<TokenVerifyResult<RefreshTokenPayload>>;
|
|
837
|
+
};
|
|
838
|
+
/**
|
|
839
|
+
* 认证策略
|
|
840
|
+
*/
|
|
841
|
+
type AuthStrategy = {
|
|
842
|
+
/**
|
|
843
|
+
* 策略名称
|
|
844
|
+
*/
|
|
845
|
+
name: string;
|
|
846
|
+
/**
|
|
847
|
+
* 验证凭证
|
|
848
|
+
*
|
|
849
|
+
* @param credentials - 认证凭证
|
|
850
|
+
* @returns 访问令牌载荷
|
|
851
|
+
*/
|
|
852
|
+
verify(credentials: unknown): Promise<AccessTokenPayload>;
|
|
853
|
+
};
|
|
854
|
+
//#endregion
|
|
855
|
+
//#region src/ports/auth-backend.port.d.ts
|
|
856
|
+
/**
|
|
857
|
+
* 用户认证信息,用于认证过程中获取用户状态和安全相关数据
|
|
858
|
+
*/
|
|
859
|
+
type UserAuthInfo = {
|
|
860
|
+
/**
|
|
861
|
+
* 用户 ID
|
|
862
|
+
*/
|
|
863
|
+
userId: string;
|
|
864
|
+
/**
|
|
865
|
+
* 邮箱
|
|
866
|
+
*/
|
|
867
|
+
email: string;
|
|
868
|
+
/**
|
|
869
|
+
* 租户 ID
|
|
870
|
+
*/
|
|
871
|
+
tenantId: string;
|
|
872
|
+
/**
|
|
873
|
+
* 用户状态
|
|
874
|
+
*/
|
|
875
|
+
status: UserStatus;
|
|
876
|
+
/**
|
|
877
|
+
* 密码哈希
|
|
878
|
+
*/
|
|
879
|
+
passwordHash: string;
|
|
880
|
+
/**
|
|
881
|
+
* 是否启用 MFA
|
|
882
|
+
*/
|
|
883
|
+
mfaEnabled: boolean;
|
|
884
|
+
/**
|
|
885
|
+
* MFA 密钥
|
|
886
|
+
*/
|
|
887
|
+
mfaSecret: string | null;
|
|
888
|
+
/**
|
|
889
|
+
* 连续登录失败次数
|
|
890
|
+
*/
|
|
891
|
+
failedLoginAttempts: number;
|
|
892
|
+
/**
|
|
893
|
+
* 锁定截止时间
|
|
894
|
+
*/
|
|
895
|
+
lockedUntil: string | null;
|
|
896
|
+
};
|
|
897
|
+
/**
|
|
898
|
+
* 密码验证结果,包含验证状态和用户信息或错误信息
|
|
899
|
+
*/
|
|
900
|
+
type VerifyPasswordResult = {
|
|
901
|
+
/**
|
|
902
|
+
* 验证是否成功
|
|
903
|
+
*/
|
|
904
|
+
success: boolean;
|
|
905
|
+
/**
|
|
906
|
+
* 验证成功时的用户信息
|
|
907
|
+
*/
|
|
908
|
+
user?: User;
|
|
909
|
+
/**
|
|
910
|
+
* 验证失败时的错误信息
|
|
911
|
+
*/
|
|
912
|
+
error?: string;
|
|
913
|
+
};
|
|
914
|
+
/**
|
|
915
|
+
* 租户验证结果,包含验证状态和租户信息或错误信息
|
|
916
|
+
*/
|
|
917
|
+
type TenantValidateResult = {
|
|
918
|
+
/**
|
|
919
|
+
* 租户是否有效
|
|
920
|
+
*/
|
|
921
|
+
valid: boolean;
|
|
922
|
+
/**
|
|
923
|
+
* 租户信息(验证成功时)
|
|
924
|
+
*/
|
|
925
|
+
tenant?: Tenant;
|
|
926
|
+
/**
|
|
927
|
+
* 错误信息(验证失败时)
|
|
928
|
+
*/
|
|
929
|
+
error?: string;
|
|
930
|
+
};
|
|
931
|
+
/**
|
|
932
|
+
* 用户数据端口
|
|
933
|
+
*/
|
|
934
|
+
type UserPort = {
|
|
935
|
+
findById(userId: string): Promise<User | null>;
|
|
936
|
+
findByEmail(email: string): Promise<User | null>;
|
|
937
|
+
findByUsername(username: string): Promise<User | null>;
|
|
938
|
+
findAuthInfo(userId: string): Promise<UserAuthInfo | null>;
|
|
939
|
+
findAuthInfoByEmail(email: string): Promise<UserAuthInfo | null>;
|
|
940
|
+
findPermissions(userId: string, tenantId: string): Promise<ResourceAction[]>;
|
|
941
|
+
isSuperAdmin(userId: string, tenantId: string): Promise<boolean>;
|
|
942
|
+
create(input: CreateUserInput): Promise<User>;
|
|
943
|
+
update(userId: string, input: UpdateUserInput): Promise<User>;
|
|
944
|
+
verifyPassword(email: string, password: string): Promise<VerifyPasswordResult>;
|
|
945
|
+
updatePassword(userId: string, newPasswordHash: string): Promise<void>;
|
|
946
|
+
};
|
|
947
|
+
/**
|
|
948
|
+
* 会话数据端口
|
|
949
|
+
*/
|
|
950
|
+
type SessionPort = {
|
|
951
|
+
create(input: CreateSessionInput): Promise<Session>;
|
|
952
|
+
findById(sessionId: string): Promise<Session | null>;
|
|
953
|
+
findByRefreshTokenHash(hash: string): Promise<Session | null>;
|
|
954
|
+
revoke(sessionId: string): Promise<void>;
|
|
955
|
+
revokeAllByUser(userId: string): Promise<void>;
|
|
956
|
+
};
|
|
957
|
+
/**
|
|
958
|
+
* 令牌操作端口
|
|
959
|
+
*/
|
|
960
|
+
type TokenPort = {
|
|
961
|
+
signAccessToken(payload: AccessTokenPayload): Promise<string>;
|
|
962
|
+
signRefreshToken(payload: RefreshTokenPayload): Promise<string>;
|
|
963
|
+
verifyAccessToken(token: string): Promise<TokenVerifyResult<AccessTokenPayload>>;
|
|
964
|
+
verifyRefreshToken(token: string): Promise<TokenVerifyResult<RefreshTokenPayload>>;
|
|
965
|
+
};
|
|
966
|
+
/**
|
|
967
|
+
* 认证后端端口 -- auth 核心所需的最小端口集
|
|
968
|
+
*/
|
|
969
|
+
type AuthBackendPort = {
|
|
970
|
+
user: UserPort;
|
|
971
|
+
session: SessionPort;
|
|
972
|
+
token: TokenPort;
|
|
973
|
+
};
|
|
974
|
+
/**
|
|
975
|
+
* 本地认证后端 -- AuthBackendPort 的别名,用于同进程直连场景
|
|
976
|
+
*/
|
|
977
|
+
type LocalAuthBackend = AuthBackendPort;
|
|
978
|
+
//#endregion
|
|
979
|
+
//#region src/ports/identity.port.d.ts
|
|
980
|
+
/** 租户数据端口 */
|
|
981
|
+
type TenantPort = {
|
|
982
|
+
findById(tenantId: string): Promise<Tenant | null>;
|
|
983
|
+
findBySlug(slug: string): Promise<Tenant | null>;
|
|
984
|
+
create(input: CreateTenantInput): Promise<Tenant>;
|
|
985
|
+
validateStatus(tenantId: string): Promise<TenantValidateResult>;
|
|
986
|
+
};
|
|
987
|
+
/** 租户成员端口 */
|
|
988
|
+
type TenantMemberPort = {
|
|
989
|
+
getMember(tenantId: string, userId: string): Promise<TenantMember | null>;
|
|
990
|
+
addMember(tenantId: string, userId: string, role: string): Promise<TenantMember>;
|
|
991
|
+
removeMember(tenantId: string, userId: string): Promise<void>;
|
|
992
|
+
isMember(tenantId: string, userId: string): Promise<boolean>;
|
|
993
|
+
};
|
|
994
|
+
/** Identity 扩展后端端口 -- 在 AuthBackendPort 基础上增加租户能力 */
|
|
995
|
+
type IdentityAuthBackend = AuthBackendPort & {
|
|
996
|
+
tenant: TenantPort;
|
|
997
|
+
tenantMember: TenantMemberPort;
|
|
998
|
+
};
|
|
999
|
+
/** 租户验证函数 */
|
|
1000
|
+
type TenantValidateFn = (tenantId: string) => Promise<TenantValidateResult>;
|
|
1001
|
+
//#endregion
|
|
1002
|
+
//#region src/ports/password-hash.port.d.ts
|
|
1003
|
+
/** 密码哈希器端口 */
|
|
1004
|
+
type PasswordHasherPort = {
|
|
1005
|
+
/**
|
|
1006
|
+
* 哈希密码
|
|
1007
|
+
*
|
|
1008
|
+
* @param password - 原始密码
|
|
1009
|
+
* @returns 哈希后的密码字符串
|
|
1010
|
+
*/
|
|
1011
|
+
hash(password: string): Promise<string>;
|
|
1012
|
+
/**
|
|
1013
|
+
* 验证密码
|
|
1014
|
+
*
|
|
1015
|
+
* @param password - 原始密码
|
|
1016
|
+
* @param hash - 哈希值
|
|
1017
|
+
* @returns 验证结果
|
|
1018
|
+
*/
|
|
1019
|
+
verify(password: string, hash: string): Promise<boolean>;
|
|
1020
|
+
};
|
|
1021
|
+
/**
|
|
1022
|
+
* 密码哈希器类型别名
|
|
1023
|
+
*
|
|
1024
|
+
* @deprecated 使用 PasswordHasherPort 代替
|
|
1025
|
+
*/
|
|
1026
|
+
type PasswordHasher = PasswordHasherPort;
|
|
1027
|
+
//#endregion
|
|
1028
|
+
//#region src/ports/token.port.d.ts
|
|
1029
|
+
/**
|
|
1030
|
+
* 令牌验证结果
|
|
1031
|
+
*
|
|
1032
|
+
* @typeParam T - 令牌载荷类型,默认为 AccessTokenPayload
|
|
1033
|
+
*/
|
|
1034
|
+
type TokenVerifyResult$1<T = AccessTokenPayload> = {
|
|
1035
|
+
/**
|
|
1036
|
+
* 验证是否成功
|
|
1037
|
+
*/
|
|
1038
|
+
success: boolean;
|
|
1039
|
+
/**
|
|
1040
|
+
* 解码后的载荷(验证成功时)
|
|
1041
|
+
*/
|
|
1042
|
+
payload?: T;
|
|
1043
|
+
/**
|
|
1044
|
+
* 错误信息(验证失败时)
|
|
1045
|
+
*/
|
|
1046
|
+
error?: string;
|
|
1047
|
+
};
|
|
1048
|
+
/**
|
|
1049
|
+
* 令牌验证端口
|
|
1050
|
+
*/
|
|
1051
|
+
type TokenVerifierPort = {
|
|
1052
|
+
/**
|
|
1053
|
+
* 验证访问令牌
|
|
1054
|
+
*
|
|
1055
|
+
* @param token - 要验证的令牌字符串
|
|
1056
|
+
* @returns 验证结果,包含载荷或错误信息
|
|
1057
|
+
*/
|
|
1058
|
+
verifyAccessToken(token: string): Promise<TokenVerifyResult$1<AccessTokenPayload>>;
|
|
1059
|
+
/**
|
|
1060
|
+
* 验证刷新令牌
|
|
1061
|
+
*
|
|
1062
|
+
* @param token - 要验证的令牌字符串
|
|
1063
|
+
* @returns 验证结果,包含载荷或错误信息
|
|
1064
|
+
*/
|
|
1065
|
+
verifyRefreshToken(token: string): Promise<TokenVerifyResult$1<RefreshTokenPayload>>;
|
|
1066
|
+
};
|
|
1067
|
+
/**
|
|
1068
|
+
* 令牌签名端口
|
|
1069
|
+
*/
|
|
1070
|
+
type TokenSignerPort = {
|
|
1071
|
+
/**
|
|
1072
|
+
* 签名访问令牌
|
|
1073
|
+
*
|
|
1074
|
+
* @param payload - 访问令牌载荷
|
|
1075
|
+
* @returns 签名后的令牌字符串
|
|
1076
|
+
*/
|
|
1077
|
+
signAccessToken(payload: AccessTokenPayload): Promise<string>;
|
|
1078
|
+
/**
|
|
1079
|
+
* 签名刷新令牌
|
|
1080
|
+
*
|
|
1081
|
+
* @param payload - 刷新令牌载荷
|
|
1082
|
+
* @returns 签名后的令牌字符串
|
|
1083
|
+
*/
|
|
1084
|
+
signRefreshToken(payload: RefreshTokenPayload): Promise<string>;
|
|
1085
|
+
};
|
|
1086
|
+
//#endregion
|
|
1087
|
+
//#region src/ports/rate-limit.port.d.ts
|
|
1088
|
+
/**
|
|
1089
|
+
* 速率限制结果
|
|
1090
|
+
*/
|
|
1091
|
+
type RateLimitResult = {
|
|
1092
|
+
/**
|
|
1093
|
+
* 是否允许请求
|
|
1094
|
+
*/
|
|
1095
|
+
allowed: boolean;
|
|
1096
|
+
/**
|
|
1097
|
+
* 剩余请求次数
|
|
1098
|
+
*/
|
|
1099
|
+
remaining: number;
|
|
1100
|
+
/**
|
|
1101
|
+
* 重置时间
|
|
1102
|
+
*/
|
|
1103
|
+
resetAt: Date;
|
|
1104
|
+
};
|
|
1105
|
+
/**
|
|
1106
|
+
* 速率限制器端口
|
|
1107
|
+
*/
|
|
1108
|
+
type RateLimiterPort = {
|
|
1109
|
+
/**
|
|
1110
|
+
* 检查速率限制
|
|
1111
|
+
*
|
|
1112
|
+
* @param key - 限制键(如用户ID、IP地址等)
|
|
1113
|
+
* @returns 限制检查结果
|
|
1114
|
+
*/
|
|
1115
|
+
checkLimit(key: string): Promise<RateLimitResult>;
|
|
1116
|
+
/**
|
|
1117
|
+
* 重置速率限制
|
|
1118
|
+
*
|
|
1119
|
+
* @param key - 限制键
|
|
1120
|
+
*/
|
|
1121
|
+
reset(key: string): Promise<void>;
|
|
1122
|
+
};
|
|
1123
|
+
//#endregion
|
|
1124
|
+
//#region src/factories/default-config.factory.d.ts
|
|
1125
|
+
/**
|
|
1126
|
+
* 创建默认 JWT 配置
|
|
1127
|
+
*
|
|
1128
|
+
* 从环境变量自动读取 JWT 配置,支持以下环境变量:
|
|
1129
|
+
* - `JWT_SECRET`:JWT 签名密钥(未设置时使用开发密钥并输出警告)
|
|
1130
|
+
* - `JWT_ALGORITHM`:JWT 签名算法(预留,当前类型未包含)
|
|
1131
|
+
* - `JWT_ACCESS_EXPIRES_IN`:AccessToken 有效期,默认 "15m"
|
|
1132
|
+
* - `JWT_REFRESH_EXPIRES_IN`:RefreshToken 有效期,默认 "7d"
|
|
1133
|
+
*
|
|
1134
|
+
* @returns 默认的 JWT 配置
|
|
1135
|
+
*/
|
|
1136
|
+
declare function createDefaultJwtConfig(): JwtConfig;
|
|
1137
|
+
/**
|
|
1138
|
+
* 创建默认速率限制配置
|
|
1139
|
+
*
|
|
1140
|
+
* 提供基于内存的速率限制默认配置:
|
|
1141
|
+
* - windowSeconds=60(时间窗口 60 秒)
|
|
1142
|
+
* - maxRequests=100(最大请求数 100)
|
|
1143
|
+
*
|
|
1144
|
+
* @returns 默认的速率限制配置
|
|
1145
|
+
*/
|
|
1146
|
+
declare function createDefaultRateLimitConfig(): RateLimitConfig;
|
|
1147
|
+
/**
|
|
1148
|
+
* 创建默认密码策略配置
|
|
1149
|
+
*
|
|
1150
|
+
* 提供合理的默认密码策略:
|
|
1151
|
+
* - minLength=8(最小长度 8 位)
|
|
1152
|
+
* - requireUppercase=true(要求大写字母)
|
|
1153
|
+
* - requireLowercase=true(要求小写字母)
|
|
1154
|
+
* - requireNumber=true(要求数字)
|
|
1155
|
+
* - requireSpecial=false(不要求特殊字符)
|
|
1156
|
+
* - historyCount=0(不检查历史密码)
|
|
1157
|
+
* - expireDays=0(密码不过期)
|
|
1158
|
+
*
|
|
1159
|
+
* @returns 默认的密码策略配置
|
|
1160
|
+
*/
|
|
1161
|
+
declare function createDefaultPasswordPolicy(): PasswordPolicyConfig;
|
|
1162
|
+
//#endregion
|
|
1163
|
+
//#region src/errors/auth.errors.d.ts
|
|
1164
|
+
/**
|
|
1165
|
+
* Token 已过期错误
|
|
1166
|
+
*/
|
|
1167
|
+
declare class TokenExpiredError extends DomainError {
|
|
1168
|
+
/**
|
|
1169
|
+
* 创建 Token 已过期错误实例
|
|
1170
|
+
*
|
|
1171
|
+
* @param message - 错误消息,默认为 "认证令牌已过期"
|
|
1172
|
+
*/
|
|
1173
|
+
constructor(message?: string);
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* Token 无效错误(签名不匹配或格式错误)
|
|
1177
|
+
*/
|
|
1178
|
+
declare class TokenInvalidError extends DomainError {
|
|
1179
|
+
/**
|
|
1180
|
+
* 创建 Token 无效错误实例
|
|
1181
|
+
*
|
|
1182
|
+
* @param message - 错误消息,默认为 "无效的认证令牌"
|
|
1183
|
+
*/
|
|
1184
|
+
constructor(message?: string);
|
|
1185
|
+
}
|
|
1186
|
+
/**
|
|
1187
|
+
* Token 缺失错误(未提供 Bearer Token)
|
|
1188
|
+
*/
|
|
1189
|
+
declare class TokenMissingError extends DomainError {
|
|
1190
|
+
/**
|
|
1191
|
+
* 创建 Token 缺失错误实例
|
|
1192
|
+
*
|
|
1193
|
+
* @param message - 错误消息,默认为 "未认证,请先登录"
|
|
1194
|
+
*/
|
|
1195
|
+
constructor(message?: string);
|
|
1196
|
+
}
|
|
1197
|
+
/**
|
|
1198
|
+
* MFA 验证要求错误(端点需要 MFA 但 Token 未经过 MFA 验证)
|
|
1199
|
+
*/
|
|
1200
|
+
declare class MfaRequiredError extends DomainError {
|
|
1201
|
+
/**
|
|
1202
|
+
* 创建 MFA 验证要求错误实例
|
|
1203
|
+
*
|
|
1204
|
+
* @param message - 错误消息,默认为 "需要多因素认证验证"
|
|
1205
|
+
*/
|
|
1206
|
+
constructor(message?: string);
|
|
1207
|
+
}
|
|
1208
|
+
/**
|
|
1209
|
+
* 无效凭据错误
|
|
1210
|
+
*/
|
|
1211
|
+
declare class InvalidCredentialsError extends DomainError {
|
|
1212
|
+
/**
|
|
1213
|
+
* 创建无效凭据错误实例
|
|
1214
|
+
*
|
|
1215
|
+
* @param message - 错误消息,默认为 "用户名或密码错误"
|
|
1216
|
+
*/
|
|
1217
|
+
constructor(message?: string);
|
|
1218
|
+
}
|
|
1219
|
+
/**
|
|
1220
|
+
* 账户被禁用错误
|
|
1221
|
+
*/
|
|
1222
|
+
declare class AccountDisabledError extends DomainError {
|
|
1223
|
+
/**
|
|
1224
|
+
* 创建账户被禁用错误实例
|
|
1225
|
+
*
|
|
1226
|
+
* @param message - 错误消息,默认为 "账户已被禁用"
|
|
1227
|
+
*/
|
|
1228
|
+
constructor(message?: string);
|
|
1229
|
+
}
|
|
1230
|
+
/**
|
|
1231
|
+
* 用户未找到错误
|
|
1232
|
+
*/
|
|
1233
|
+
declare class UserNotFoundError extends DomainError {
|
|
1234
|
+
/**
|
|
1235
|
+
* 创建用户未找到错误实例
|
|
1236
|
+
*
|
|
1237
|
+
* @param message - 错误消息,默认为 "用户不存在"
|
|
1238
|
+
*/
|
|
1239
|
+
constructor(message?: string);
|
|
1240
|
+
}
|
|
1241
|
+
/**
|
|
1242
|
+
* 用户已存在错误
|
|
1243
|
+
*/
|
|
1244
|
+
declare class UserAlreadyExistsError extends DomainError {
|
|
1245
|
+
/**
|
|
1246
|
+
* 创建用户已存在错误实例
|
|
1247
|
+
*
|
|
1248
|
+
* @param message - 错误消息,默认为 "用户已存在"
|
|
1249
|
+
*/
|
|
1250
|
+
constructor(message?: string);
|
|
1251
|
+
}
|
|
1252
|
+
/**
|
|
1253
|
+
* 密码策略违规错误
|
|
1254
|
+
*/
|
|
1255
|
+
declare class PasswordPolicyViolationError extends DomainError {
|
|
1256
|
+
/**
|
|
1257
|
+
* 创建密码策略违规错误实例
|
|
1258
|
+
*
|
|
1259
|
+
* @param message - 错误消息,默认为 "密码不符合策略要求"
|
|
1260
|
+
*/
|
|
1261
|
+
constructor(message?: string);
|
|
1262
|
+
}
|
|
1263
|
+
/**
|
|
1264
|
+
* 会话未找到错误
|
|
1265
|
+
*/
|
|
1266
|
+
declare class SessionNotFoundError extends DomainError {
|
|
1267
|
+
/**
|
|
1268
|
+
* 创建会话未找到错误实例
|
|
1269
|
+
*
|
|
1270
|
+
* @param message - 错误消息,默认为 "会话不存在"
|
|
1271
|
+
*/
|
|
1272
|
+
constructor(message?: string);
|
|
1273
|
+
}
|
|
1274
|
+
/**
|
|
1275
|
+
* 会话已过期错误
|
|
1276
|
+
*/
|
|
1277
|
+
declare class SessionExpiredError extends DomainError {
|
|
1278
|
+
/**
|
|
1279
|
+
* 创建会话已过期错误实例
|
|
1280
|
+
*
|
|
1281
|
+
* @param message - 错误消息,默认为 "会话已过期"
|
|
1282
|
+
*/
|
|
1283
|
+
constructor(message?: string);
|
|
1284
|
+
}
|
|
1285
|
+
/**
|
|
1286
|
+
* 限流触发错误(请求频率超限)
|
|
1287
|
+
*/
|
|
1288
|
+
declare class RateLimitExceededError extends DomainError {
|
|
1289
|
+
/**
|
|
1290
|
+
* 创建限流触发错误实例
|
|
1291
|
+
*
|
|
1292
|
+
* @param message - 错误消息,默认为 "请求过于频繁,请稍后再试"
|
|
1293
|
+
*/
|
|
1294
|
+
constructor(message?: string);
|
|
1295
|
+
}
|
|
1296
|
+
//#endregion
|
|
1297
|
+
export { type AccessTokenPayload, AccountDisabledError, type AuthBackendPort, type AuthConfig, type AuthContext, type AuthStrategy, type ChangePasswordRequest, type CreateSessionInput, type CreateTenantInput, type CreateTenantMemberInput, type CreateUserInput, type IdentityAuthBackend, InvalidCredentialsError, type JwtConfig, type LocalAuthBackend, type LoggerService, type LoginRequest, type LoginResponse, type MeResponse, type MessageResponse, type MfaPendingTokenPayload, MfaRequiredError, type PasswordHasher, type PasswordHasherPort, type PasswordPolicyConfig, PasswordPolicyViolationError, type PasswordResetConfirmRequest, type PasswordResetRequest, type PasswordResetTokenPayload, type PasswordValidationResult, type PermissionCheckFn, type RateLimitConfig, RateLimitExceededError, type RateLimitResult, type RateLimiterPort, type RefreshTokenPayload, type RefreshTokenRequest, type RefreshTokenResponse, type RegisterRequest, type RegisterResponse, type ResourceAction, type Session, SessionExpiredError, type SessionInfo, SessionNotFoundError, type SessionPort, type Tenant, type TenantMember, type TenantMemberPort, type TenantMemberRole, type TenantPermissionCheckFn, type TenantPort, type TenantStatus, type TenantValidateFn, type TenantValidateResult, TokenExpiredError, TokenInvalidError, TokenMissingError, type TokenPayload, type TokenPort, type TokenSigner, type TokenSignerPort, type TokenVerifier, type TokenVerifierPort, type TokenVerifyResult, type UnifiedAuthContext, type UpdateTenantInput, type UpdateUserInput, type User, UserAlreadyExistsError, type UserAuthInfo, type UserInfo, UserNotFoundError, type UserPort, type UserStatus, type VerifyPasswordResult, accessTokenPayloadSchema, authConfigSchema, changePasswordSchema, createDefaultJwtConfig, createDefaultPasswordPolicy, createDefaultRateLimitConfig, createUserSchema, jwtConfigSchema, loginSchema, mfaPendingTokenPayloadSchema, passwordPolicyConfigSchema, passwordResetTokenPayloadSchema, permissionStringSchema, rateLimitConfigSchema, refreshTokenPayloadSchema, refreshTokenSchema, resourceActionSchema, updateUserSchema };
|