@nauth-toolkit/core 0.1.0 → 0.1.5

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 (184) hide show
  1. package/LICENSE +90 -0
  2. package/README.md +9 -0
  3. package/package.json +8 -3
  4. package/jest.config.js +0 -15
  5. package/jest.setup.ts +0 -6
  6. package/src/adapters/database-columns.ts +0 -165
  7. package/src/adapters/express.adapter.ts +0 -385
  8. package/src/adapters/fastify.adapter.ts +0 -416
  9. package/src/adapters/index.ts +0 -16
  10. package/src/adapters/storage.factory.ts +0 -143
  11. package/src/bootstrap.ts +0 -374
  12. package/src/dto/auth-challenge.dto.ts +0 -231
  13. package/src/dto/auth-response.dto.ts +0 -253
  14. package/src/dto/challenge-response.dto.ts +0 -234
  15. package/src/dto/change-password-request.dto.ts +0 -50
  16. package/src/dto/change-password-response.dto.ts +0 -29
  17. package/src/dto/change-password.dto.ts +0 -57
  18. package/src/dto/error-response.dto.ts +0 -136
  19. package/src/dto/get-available-methods.dto.ts +0 -55
  20. package/src/dto/get-challenge-data-response.dto.ts +0 -28
  21. package/src/dto/get-challenge-data.dto.ts +0 -69
  22. package/src/dto/get-client-info.dto.ts +0 -104
  23. package/src/dto/get-device-token-response.dto.ts +0 -25
  24. package/src/dto/get-events-by-type.dto.ts +0 -76
  25. package/src/dto/get-ip-address-response.dto.ts +0 -24
  26. package/src/dto/get-mfa-status.dto.ts +0 -94
  27. package/src/dto/get-risk-assessment-history.dto.ts +0 -39
  28. package/src/dto/get-session-id-response.dto.ts +0 -25
  29. package/src/dto/get-setup-data-response.dto.ts +0 -31
  30. package/src/dto/get-setup-data.dto.ts +0 -75
  31. package/src/dto/get-suspicious-activity.dto.ts +0 -42
  32. package/src/dto/get-user-agent-response.dto.ts +0 -23
  33. package/src/dto/get-user-auth-history.dto.ts +0 -95
  34. package/src/dto/get-user-by-email.dto.ts +0 -61
  35. package/src/dto/get-user-by-id.dto.ts +0 -46
  36. package/src/dto/get-user-devices.dto.ts +0 -53
  37. package/src/dto/get-user-response.dto.ts +0 -17
  38. package/src/dto/has-provider.dto.ts +0 -56
  39. package/src/dto/index.ts +0 -57
  40. package/src/dto/is-trusted-device-response.dto.ts +0 -34
  41. package/src/dto/list-providers-response.dto.ts +0 -23
  42. package/src/dto/login.dto.ts +0 -95
  43. package/src/dto/logout-all-response.dto.ts +0 -24
  44. package/src/dto/logout-all.dto.ts +0 -65
  45. package/src/dto/logout-response.dto.ts +0 -25
  46. package/src/dto/logout.dto.ts +0 -64
  47. package/src/dto/refresh-token.dto.ts +0 -36
  48. package/src/dto/remove-devices.dto.ts +0 -85
  49. package/src/dto/resend-code-response.dto.ts +0 -32
  50. package/src/dto/resend-code.dto.ts +0 -51
  51. package/src/dto/reset-password.dto.ts +0 -115
  52. package/src/dto/respond-challenge.dto.ts +0 -272
  53. package/src/dto/set-mfa-exemption.dto.ts +0 -112
  54. package/src/dto/set-must-change-password-response.dto.ts +0 -27
  55. package/src/dto/set-must-change-password.dto.ts +0 -46
  56. package/src/dto/set-preferred-method.dto.ts +0 -80
  57. package/src/dto/setup-mfa.dto.ts +0 -98
  58. package/src/dto/signup.dto.ts +0 -174
  59. package/src/dto/social-auth.dto.ts +0 -422
  60. package/src/dto/trust-device-response.dto.ts +0 -30
  61. package/src/dto/trust-device.dto.ts +0 -9
  62. package/src/dto/update-user-attributes-request.dto.ts +0 -51
  63. package/src/dto/user-response.dto.ts +0 -138
  64. package/src/dto/user-update.dto.ts +0 -222
  65. package/src/dto/verify-email.dto.ts +0 -313
  66. package/src/dto/verify-mfa-code.dto.ts +0 -103
  67. package/src/dto/verify-phone-by-sub.dto.ts +0 -78
  68. package/src/dto/verify-phone.dto.ts +0 -245
  69. package/src/entities/auth-audit.entity.ts +0 -232
  70. package/src/entities/challenge-session.entity.ts +0 -116
  71. package/src/entities/index.ts +0 -29
  72. package/src/entities/login-attempt.entity.ts +0 -64
  73. package/src/entities/mfa-device.entity.ts +0 -151
  74. package/src/entities/rate-limit.entity.ts +0 -44
  75. package/src/entities/session.entity.ts +0 -180
  76. package/src/entities/social-account.entity.ts +0 -96
  77. package/src/entities/storage-lock.entity.ts +0 -39
  78. package/src/entities/trusted-device.entity.ts +0 -112
  79. package/src/entities/user.entity.ts +0 -243
  80. package/src/entities/verification-token.entity.ts +0 -141
  81. package/src/enums/auth-audit-event-type.enum.ts +0 -360
  82. package/src/enums/error-codes.enum.ts +0 -420
  83. package/src/enums/mfa-method.enum.ts +0 -97
  84. package/src/enums/risk-factor.enum.ts +0 -111
  85. package/src/exceptions/nauth.exception.ts +0 -231
  86. package/src/handlers/auth.handler.ts +0 -260
  87. package/src/handlers/client-info.handler.ts +0 -101
  88. package/src/handlers/csrf.handler.ts +0 -156
  89. package/src/handlers/token-delivery.handler.ts +0 -118
  90. package/src/index.ts +0 -118
  91. package/src/interfaces/client-info.interface.ts +0 -85
  92. package/src/interfaces/config.interface.ts +0 -2135
  93. package/src/interfaces/entities.interface.ts +0 -226
  94. package/src/interfaces/index.ts +0 -15
  95. package/src/interfaces/logger.interface.ts +0 -283
  96. package/src/interfaces/mfa-provider.interface.ts +0 -154
  97. package/src/interfaces/oauth.interface.ts +0 -148
  98. package/src/interfaces/provider.interface.ts +0 -47
  99. package/src/interfaces/social-auth-provider.interface.ts +0 -131
  100. package/src/interfaces/storage-adapter.interface.ts +0 -82
  101. package/src/interfaces/template.interface.ts +0 -510
  102. package/src/interfaces/token-verifier.interface.ts +0 -110
  103. package/src/internal.ts +0 -178
  104. package/src/platform/interfaces.ts +0 -299
  105. package/src/schemas/auth-config.schema.ts +0 -646
  106. package/src/services/adaptive-mfa-decision.service.spec.ts +0 -1058
  107. package/src/services/adaptive-mfa-decision.service.ts +0 -457
  108. package/src/services/auth-audit.service.spec.ts +0 -675
  109. package/src/services/auth-audit.service.ts +0 -558
  110. package/src/services/auth-challenge-helper.service.spec.ts +0 -3227
  111. package/src/services/auth-challenge-helper.service.ts +0 -825
  112. package/src/services/auth-flow-context-builder.service.ts +0 -520
  113. package/src/services/auth-flow-rules.ts +0 -202
  114. package/src/services/auth-flow-state-definitions.ts +0 -190
  115. package/src/services/auth-flow-state-machine.service.ts +0 -207
  116. package/src/services/auth-flow-state-machine.types.ts +0 -316
  117. package/src/services/auth.service.spec.ts +0 -4195
  118. package/src/services/auth.service.ts +0 -3727
  119. package/src/services/challenge.service.spec.ts +0 -1363
  120. package/src/services/challenge.service.ts +0 -696
  121. package/src/services/client-info.service.spec.ts +0 -572
  122. package/src/services/client-info.service.ts +0 -374
  123. package/src/services/csrf.service.ts +0 -54
  124. package/src/services/email-verification.service.spec.ts +0 -1229
  125. package/src/services/email-verification.service.ts +0 -578
  126. package/src/services/geo-location.service.spec.ts +0 -603
  127. package/src/services/geo-location.service.ts +0 -599
  128. package/src/services/index.ts +0 -13
  129. package/src/services/jwt.service.spec.ts +0 -882
  130. package/src/services/jwt.service.ts +0 -621
  131. package/src/services/mfa-base.service.spec.ts +0 -246
  132. package/src/services/mfa-base.service.ts +0 -611
  133. package/src/services/mfa.service.spec.ts +0 -693
  134. package/src/services/mfa.service.ts +0 -960
  135. package/src/services/password.service.spec.ts +0 -166
  136. package/src/services/password.service.ts +0 -309
  137. package/src/services/phone-verification.service.spec.ts +0 -1120
  138. package/src/services/phone-verification.service.ts +0 -751
  139. package/src/services/risk-detection.service.spec.ts +0 -1292
  140. package/src/services/risk-detection.service.ts +0 -1012
  141. package/src/services/risk-scoring.service.spec.ts +0 -204
  142. package/src/services/risk-scoring.service.ts +0 -131
  143. package/src/services/session.service.spec.ts +0 -1293
  144. package/src/services/session.service.ts +0 -803
  145. package/src/services/social-account.service.spec.ts +0 -725
  146. package/src/services/social-auth-base.service.spec.ts +0 -418
  147. package/src/services/social-auth-base.service.ts +0 -581
  148. package/src/services/social-auth.service.spec.ts +0 -238
  149. package/src/services/social-auth.service.ts +0 -436
  150. package/src/services/social-provider-registry.service.spec.ts +0 -238
  151. package/src/services/social-provider-registry.service.ts +0 -122
  152. package/src/services/trusted-device.service.spec.ts +0 -505
  153. package/src/services/trusted-device.service.ts +0 -339
  154. package/src/storage/account-lockout-storage.service.spec.ts +0 -310
  155. package/src/storage/account-lockout-storage.service.ts +0 -89
  156. package/src/storage/index.ts +0 -3
  157. package/src/storage/memory-storage.adapter.ts +0 -443
  158. package/src/storage/rate-limit-storage.service.spec.ts +0 -247
  159. package/src/storage/rate-limit-storage.service.ts +0 -38
  160. package/src/templates/html-template.engine.spec.ts +0 -161
  161. package/src/templates/html-template.engine.ts +0 -688
  162. package/src/templates/index.ts +0 -7
  163. package/src/utils/common-passwords.spec.ts +0 -230
  164. package/src/utils/common-passwords.ts +0 -170
  165. package/src/utils/context-storage.ts +0 -188
  166. package/src/utils/cookie-names.util.ts +0 -67
  167. package/src/utils/cookies.util.ts +0 -94
  168. package/src/utils/index.ts +0 -12
  169. package/src/utils/ip-extractor.spec.ts +0 -330
  170. package/src/utils/ip-extractor.ts +0 -220
  171. package/src/utils/nauth-logger.spec.ts +0 -388
  172. package/src/utils/nauth-logger.ts +0 -215
  173. package/src/utils/pii-redactor.spec.ts +0 -130
  174. package/src/utils/pii-redactor.ts +0 -288
  175. package/src/utils/setup/get-repositories.ts +0 -140
  176. package/src/utils/setup/init-services.ts +0 -422
  177. package/src/utils/setup/init-social.ts +0 -189
  178. package/src/utils/setup/init-storage.ts +0 -94
  179. package/src/utils/setup/register-mfa.ts +0 -165
  180. package/src/utils/setup/run-nauth-migrations.ts +0 -61
  181. package/src/utils/token-delivery-policy.ts +0 -38
  182. package/src/validators/template.validator.ts +0 -219
  183. package/tsconfig.json +0 -37
  184. package/tsconfig.lint.json +0 -6
@@ -1,238 +0,0 @@
1
- import { SocialProviderRegistry } from './social-provider-registry.service';
2
- import { ISocialAuthProviderService } from '../interfaces/social-auth-provider.interface';
3
- import { NAuthException } from '../exceptions/nauth.exception';
4
- import { AuthErrorCode } from '../enums/error-codes.enum';
5
-
6
- /**
7
- * Social Provider Registry Unit Tests
8
- *
9
- * Tests social authentication provider registry functionality.
10
- * Covers provider registration, lookup, and listing.
11
- *
12
- * Platform-agnostic: Uses direct instantiation, no NestJS dependencies.
13
- */
14
- describe('SocialProviderRegistry', () => {
15
- let service: SocialProviderRegistry;
16
- let mockProvider1: jest.Mocked<ISocialAuthProviderService>;
17
- let mockProvider2: jest.Mocked<ISocialAuthProviderService>;
18
-
19
- beforeEach(() => {
20
- // Create mock providers
21
- mockProvider1 = {
22
- providerName: 'google',
23
- getAuthUrl: jest.fn(),
24
- handleCallback: jest.fn(),
25
- verifyToken: jest.fn(),
26
- linkAccount: jest.fn(),
27
- getUserProfileFromCallback: jest.fn(),
28
- } as any;
29
-
30
- mockProvider2 = {
31
- providerName: 'apple',
32
- getAuthUrl: jest.fn(),
33
- handleCallback: jest.fn(),
34
- verifyToken: jest.fn(),
35
- linkAccount: jest.fn(),
36
- getUserProfileFromCallback: jest.fn(),
37
- } as any;
38
-
39
- // Instantiate service directly
40
- service = new SocialAuthService();
41
- });
42
-
43
- afterEach(() => {
44
- jest.clearAllMocks();
45
- });
46
-
47
- // ============================================================================
48
- // Service Initialization
49
- // ============================================================================
50
-
51
- it('should be defined', () => {
52
- expect(service).toBeDefined();
53
- });
54
-
55
- // ============================================================================
56
- // registerProvider() Method
57
- // ============================================================================
58
-
59
- describe('registerProvider', () => {
60
- it('should register provider successfully', () => {
61
- service.registerProvider(mockProvider1);
62
-
63
- expect(service.hasProvider('google')).toBe(true);
64
- });
65
-
66
- it('should throw error when provider already registered', () => {
67
- service.registerProvider(mockProvider1);
68
-
69
- expect(() => service.registerProvider(mockProvider1)).toThrow(NAuthException);
70
- expect(() => service.registerProvider(mockProvider1)).toThrow('already registered');
71
- });
72
-
73
- it('should allow multiple different providers', () => {
74
- service.registerProvider(mockProvider1);
75
- service.registerProvider(mockProvider2);
76
-
77
- expect(service.hasProvider('google')).toBe(true);
78
- expect(service.hasProvider('apple')).toBe(true);
79
- });
80
-
81
- it('should register provider with correct name', () => {
82
- service.registerProvider(mockProvider1);
83
-
84
- const provider = service.getProvider('google');
85
- expect(provider).toBe(mockProvider1);
86
- expect(provider.providerName).toBe('google');
87
- });
88
- });
89
-
90
- // ============================================================================
91
- // getProvider() Method
92
- // ============================================================================
93
-
94
- describe('getProvider', () => {
95
- it('should return registered provider', () => {
96
- service.registerProvider(mockProvider1);
97
-
98
- const provider = service.getProvider('google');
99
-
100
- expect(provider).toBe(mockProvider1);
101
- });
102
-
103
- it('should throw error when provider not registered', () => {
104
- expect(() => service.getProvider('google')).toThrow(NAuthException);
105
- expect(() => service.getProvider('google')).toThrow('not registered');
106
- });
107
-
108
- it('should throw error with helpful message suggesting module import', () => {
109
- try {
110
- service.getProvider('facebook');
111
- fail('Should have thrown NAuthException');
112
- } catch (error: any) {
113
- expect(error).toBeInstanceOf(NAuthException);
114
- expect(error.message).toContain('Import the provider module');
115
- }
116
- });
117
-
118
- it('should use correct error code when provider not found', () => {
119
- try {
120
- service.getProvider('google');
121
- } catch (error) {
122
- expect(error).toBeInstanceOf(NAuthException);
123
- expect((error as NAuthException).code).toBe(AuthErrorCode.SOCIAL_CONFIG_MISSING);
124
- }
125
- });
126
- });
127
-
128
- // ============================================================================
129
- // hasProvider() Method
130
- // ============================================================================
131
-
132
- describe('hasProvider', () => {
133
- it('should return true for registered provider', () => {
134
- service.registerProvider(mockProvider1);
135
-
136
- expect(service.hasProvider('google')).toBe(true);
137
- });
138
-
139
- it('should return false for unregistered provider', () => {
140
- expect(service.hasProvider('google')).toBe(false);
141
- });
142
-
143
- it('should return false for provider that was never registered', () => {
144
- service.registerProvider(mockProvider1);
145
-
146
- expect(service.hasProvider('facebook')).toBe(false);
147
- });
148
- });
149
-
150
- // ============================================================================
151
- // listProviders() Method
152
- // ============================================================================
153
-
154
- describe('listProviders', () => {
155
- it('should return empty array when no providers registered', () => {
156
- expect(service.listProviders()).toEqual([]);
157
- });
158
-
159
- it('should return all registered provider names', () => {
160
- service.registerProvider(mockProvider1);
161
- service.registerProvider(mockProvider2);
162
-
163
- const providers = service.listProviders();
164
-
165
- expect(providers).toContain('google');
166
- expect(providers).toContain('apple');
167
- expect(providers.length).toBe(2);
168
- });
169
-
170
- it('should return provider names in registration order', () => {
171
- service.registerProvider(mockProvider1);
172
- service.registerProvider(mockProvider2);
173
-
174
- const providers = service.listProviders();
175
-
176
- expect(providers[0]).toBe('google');
177
- expect(providers[1]).toBe('apple');
178
- });
179
-
180
- it('should return updated list after new provider registered', () => {
181
- expect(service.listProviders()).toEqual([]);
182
-
183
- service.registerProvider(mockProvider1);
184
- expect(service.listProviders()).toEqual(['google']);
185
-
186
- service.registerProvider(mockProvider2);
187
- expect(service.listProviders()).toEqual(['google', 'apple']);
188
- });
189
- });
190
-
191
- // ============================================================================
192
- // Integration Tests
193
- // ============================================================================
194
-
195
- describe('Integration', () => {
196
- it('should allow full provider lifecycle', () => {
197
- // Register
198
- service.registerProvider(mockProvider1);
199
- expect(service.hasProvider('google')).toBe(true);
200
-
201
- // Get
202
- const provider = service.getProvider('google');
203
- expect(provider).toBe(mockProvider1);
204
-
205
- // List
206
- const providers = service.listProviders();
207
- expect(providers).toContain('google');
208
- });
209
-
210
- it('should handle multiple providers independently', () => {
211
- service.registerProvider(mockProvider1);
212
- service.registerProvider(mockProvider2);
213
-
214
- const googleProvider = service.getProvider('google');
215
- const appleProvider = service.getProvider('apple');
216
-
217
- expect(googleProvider).toBe(mockProvider1);
218
- expect(appleProvider).toBe(mockProvider2);
219
- expect(googleProvider).not.toBe(appleProvider);
220
- });
221
-
222
- it('should maintain provider registry across operations', () => {
223
- service.registerProvider(mockProvider1);
224
- service.registerProvider(mockProvider2);
225
-
226
- // Verify both still registered
227
- expect(service.hasProvider('google')).toBe(true);
228
- expect(service.hasProvider('apple')).toBe(true);
229
-
230
- // Get both
231
- const google = service.getProvider('google');
232
- const apple = service.getProvider('apple');
233
-
234
- expect(google).toBe(mockProvider1);
235
- expect(apple).toBe(mockProvider2);
236
- });
237
- });
238
- });
@@ -1,122 +0,0 @@
1
- import { ISocialAuthProviderService } from '../interfaces/social-auth-provider.interface';
2
- import { NAuthException } from '../exceptions/nauth.exception';
3
- import { AuthErrorCode } from '../enums/error-codes.enum';
4
-
5
- /**
6
- * Social Provider Registry (Internal)
7
- *
8
- * Internal registry service for managing social authentication providers.
9
- * This is an implementation detail used by SocialAuthService and provider modules.
10
- *
11
- * **Note:** This is an internal service. Consumer applications should use
12
- * `SocialAuthService` instead, which provides a high-level API for social authentication.
13
- *
14
- * **Key Features:**
15
- * - Dynamic provider registration without hardcoded names
16
- * - Provider lookup by name
17
- * - Auto-registration when provider modules are imported
18
- *
19
- * **How it works:**
20
- * Provider modules (Google, Apple, Facebook, etc.) automatically register themselves
21
- * with this registry using OnModuleInit when their modules are imported.
22
- *
23
- * @internal
24
- *
25
- * @example
26
- * ```typescript
27
- * // Provider modules auto-register
28
- * onModuleInit() {
29
- * this.providerRegistry.registerProvider(this);
30
- * }
31
- *
32
- * // SocialAuthService uses the registry internally
33
- * const provider = this.providerRegistry.getProvider('google');
34
- * ```
35
- */
36
- export class SocialProviderRegistry {
37
- private readonly providers = new Map<string, ISocialAuthProviderService>();
38
-
39
- /**
40
- * Register a social auth provider
41
- *
42
- * Called automatically by provider modules during initialization.
43
- * Provider names must be unique.
44
- *
45
- * @param provider - Provider service instance (must have providerName property)
46
- *
47
- * @example
48
- * ```typescript
49
- * // In provider module OnModuleInit:
50
- * constructor(private providerRegistry: SocialProviderRegistry) {}
51
- *
52
- * onModuleInit() {
53
- * this.providerRegistry.registerProvider(this);
54
- * }
55
- * ```
56
- */
57
- registerProvider(provider: ISocialAuthProviderService): void {
58
- const name = provider.providerName;
59
-
60
- if (this.providers.has(name)) {
61
- throw new NAuthException(AuthErrorCode.VALIDATION_FAILED, `Social auth provider '${name}' is already registered`);
62
- }
63
-
64
- this.providers.set(name, provider);
65
- }
66
-
67
- /**
68
- * Get a provider by name
69
- *
70
- * @param name - Provider name (e.g., 'google', 'apple', 'facebook')
71
- * @returns Provider service instance
72
- * @throws {NAuthException} If provider is not registered
73
- *
74
- * @example
75
- * ```typescript
76
- * const googleProvider = this.providerRegistry.getProvider('google');
77
- * const authUrl = await googleProvider.getAuthUrl();
78
- * ```
79
- */
80
- getProvider(name: string): ISocialAuthProviderService {
81
- const provider = this.providers.get(name);
82
- if (!provider) {
83
- throw new NAuthException(
84
- AuthErrorCode.SOCIAL_CONFIG_MISSING,
85
- `Social auth provider '${name}' is not registered. Import the provider module (e.g., GoogleSocialAuthModule) and ensure it's properly configured.`,
86
- );
87
- }
88
- return provider;
89
- }
90
-
91
- /**
92
- * Check if a provider is registered
93
- *
94
- * @param name - Provider name
95
- * @returns True if provider exists
96
- *
97
- * @example
98
- * ```typescript
99
- * if (this.providerRegistry.hasProvider('github')) {
100
- * // Use GitHub provider
101
- * }
102
- * ```
103
- */
104
- hasProvider(name: string): boolean {
105
- return this.providers.has(name);
106
- }
107
-
108
- /**
109
- * Get all registered provider names
110
- *
111
- * @returns Array of provider names
112
- *
113
- * @example
114
- * ```typescript
115
- * const providers = this.providerRegistry.listProviders();
116
- * // ['google', 'apple', 'facebook']
117
- * ```
118
- */
119
- listProviders(): string[] {
120
- return Array.from(this.providers.keys());
121
- }
122
- }