@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.
@@ -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 };