@nauth-toolkit/core 0.1.60 → 0.1.62
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/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +0 -22
- package/dist/bootstrap.js.map +1 -1
- package/dist/dto/change-password-request.dto.d.ts +5 -2
- package/dist/dto/change-password-request.dto.d.ts.map +1 -1
- package/dist/dto/change-password-request.dto.js +6 -1
- package/dist/dto/change-password-request.dto.js.map +1 -1
- package/dist/dto/logout-all.dto.d.ts +5 -2
- package/dist/dto/logout-all.dto.d.ts.map +1 -1
- package/dist/dto/logout-all.dto.js +6 -1
- package/dist/dto/logout-all.dto.js.map +1 -1
- package/dist/dto/refresh-token.dto.d.ts +19 -7
- package/dist/dto/refresh-token.dto.d.ts.map +1 -1
- package/dist/dto/refresh-token.dto.js +20 -6
- package/dist/dto/refresh-token.dto.js.map +1 -1
- package/dist/dto/setup-mfa.dto.d.ts +5 -2
- package/dist/dto/setup-mfa.dto.d.ts.map +1 -1
- package/dist/dto/setup-mfa.dto.js +6 -1
- package/dist/dto/setup-mfa.dto.js.map +1 -1
- package/dist/dto/update-user-attributes-request.dto.d.ts +5 -2
- package/dist/dto/update-user-attributes-request.dto.d.ts.map +1 -1
- package/dist/dto/update-user-attributes-request.dto.js +6 -1
- package/dist/dto/update-user-attributes-request.dto.js.map +1 -1
- package/dist/handlers/csrf.handler.d.ts.map +1 -1
- package/dist/handlers/csrf.handler.js +12 -1
- package/dist/handlers/csrf.handler.js.map +1 -1
- package/dist/interfaces/config.interface.d.ts +306 -76
- package/dist/interfaces/config.interface.d.ts.map +1 -1
- package/dist/interfaces/hooks.interface.d.ts +753 -7
- package/dist/interfaces/hooks.interface.d.ts.map +1 -1
- package/dist/interfaces/provider.interface.d.ts +143 -0
- package/dist/interfaces/provider.interface.d.ts.map +1 -1
- package/dist/interfaces/template.interface.d.ts +20 -43
- package/dist/interfaces/template.interface.d.ts.map +1 -1
- package/dist/interfaces/template.interface.js +8 -0
- package/dist/interfaces/template.interface.js.map +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +7 -1
- package/dist/internal.js.map +1 -1
- package/dist/schemas/auth-config.schema.d.ts +445 -104
- package/dist/schemas/auth-config.schema.d.ts.map +1 -1
- package/dist/schemas/auth-config.schema.js +55 -8
- package/dist/schemas/auth-config.schema.js.map +1 -1
- package/dist/services/adaptive-mfa-decision.service.d.ts +25 -1
- package/dist/services/adaptive-mfa-decision.service.d.ts.map +1 -1
- package/dist/services/adaptive-mfa-decision.service.js +91 -8
- package/dist/services/adaptive-mfa-decision.service.js.map +1 -1
- package/dist/services/auth-audit.service.d.ts.map +1 -1
- package/dist/services/auth-audit.service.js +25 -4
- package/dist/services/auth-audit.service.js.map +1 -1
- package/dist/services/auth-flow-context-builder.service.d.ts.map +1 -1
- package/dist/services/auth-flow-context-builder.service.js +8 -1
- package/dist/services/auth-flow-context-builder.service.js.map +1 -1
- package/dist/services/auth-service-internal-helpers.d.ts +3 -1
- package/dist/services/auth-service-internal-helpers.d.ts.map +1 -1
- package/dist/services/auth-service-internal-helpers.js +28 -1
- package/dist/services/auth-service-internal-helpers.js.map +1 -1
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +84 -27
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/email-notifications.hook.d.ts +14 -0
- package/dist/services/email-notifications.hook.d.ts.map +1 -0
- package/dist/services/email-notifications.hook.js +254 -0
- package/dist/services/email-notifications.hook.js.map +1 -0
- package/dist/services/email-verification.service.d.ts.map +1 -1
- package/dist/services/email-verification.service.js +55 -0
- package/dist/services/email-verification.service.js.map +1 -1
- package/dist/services/hook-registry.service.d.ts +222 -1
- package/dist/services/hook-registry.service.d.ts.map +1 -1
- package/dist/services/hook-registry.service.js +391 -0
- package/dist/services/hook-registry.service.js.map +1 -1
- package/dist/services/mfa-base.service.d.ts +3 -1
- package/dist/services/mfa-base.service.d.ts.map +1 -1
- package/dist/services/mfa-base.service.js +70 -1
- package/dist/services/mfa-base.service.js.map +1 -1
- package/dist/services/mfa.service.d.ts +3 -1
- package/dist/services/mfa.service.d.ts.map +1 -1
- package/dist/services/mfa.service.js +32 -1
- package/dist/services/mfa.service.js.map +1 -1
- package/dist/services/password-reset.service.d.ts.map +1 -1
- package/dist/services/password-reset.service.js +5 -3
- package/dist/services/password-reset.service.js.map +1 -1
- package/dist/services/phone-verification.service.d.ts.map +1 -1
- package/dist/services/phone-verification.service.js +56 -2
- package/dist/services/phone-verification.service.js.map +1 -1
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +84 -1
- package/dist/services/user.service.js.map +1 -1
- package/dist/utils/setup/init-services.d.ts.map +1 -1
- package/dist/utils/setup/init-services.js +22 -23
- package/dist/utils/setup/init-services.js.map +1 -1
- package/dist/validators/template.validator.d.ts.map +1 -1
- package/dist/validators/template.validator.js +8 -0
- package/dist/validators/template.validator.js.map +1 -1
- package/package.json +1 -1
|
@@ -24,7 +24,17 @@ class HookRegistryService {
|
|
|
24
24
|
logger;
|
|
25
25
|
preSignupHooks = [];
|
|
26
26
|
postSignupHooks = [];
|
|
27
|
+
onboardingCompletedHooks = [];
|
|
27
28
|
userProfileUpdatedHooks = [];
|
|
29
|
+
passwordChangedHooks = [];
|
|
30
|
+
mfaDeviceRemovedHooks = [];
|
|
31
|
+
adaptiveMFARiskDetectedHooks = [];
|
|
32
|
+
accountStatusChangedHooks = [];
|
|
33
|
+
emailChangedHooks = [];
|
|
34
|
+
accountLockedHooks = [];
|
|
35
|
+
sessionsRevokedHooks = [];
|
|
36
|
+
mfaFirstEnabledHooks = [];
|
|
37
|
+
mfaMethodAddedHooks = [];
|
|
28
38
|
constructor(logger) {
|
|
29
39
|
this.logger = logger;
|
|
30
40
|
}
|
|
@@ -55,6 +65,18 @@ class HookRegistryService {
|
|
|
55
65
|
this.postSignupHooks.push(provider);
|
|
56
66
|
this.logger?.debug?.(`[HookRegistry] Registered postSignup hook: ${provider.constructor.name}`);
|
|
57
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Register an onboarding completed hook
|
|
70
|
+
*
|
|
71
|
+
* Hooks are executed in registration order.
|
|
72
|
+
* Hook errors are logged but do not block user flows (non-blocking).
|
|
73
|
+
*
|
|
74
|
+
* @param provider - Onboarding completed hook instance
|
|
75
|
+
*/
|
|
76
|
+
registerOnboardingCompleted(provider) {
|
|
77
|
+
this.onboardingCompletedHooks.push(provider);
|
|
78
|
+
this.logger?.debug?.(`[HookRegistry] Registered onboardingCompleted hook: ${provider.constructor.name}`);
|
|
79
|
+
}
|
|
58
80
|
/**
|
|
59
81
|
* Register a user profile updated hook
|
|
60
82
|
*
|
|
@@ -67,6 +89,114 @@ class HookRegistryService {
|
|
|
67
89
|
this.userProfileUpdatedHooks.push(provider);
|
|
68
90
|
this.logger?.debug?.(`[HookRegistry] Registered userProfileUpdated hook: ${provider.constructor.name}`);
|
|
69
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Register a password changed hook
|
|
94
|
+
*
|
|
95
|
+
* Hooks are executed in registration order.
|
|
96
|
+
* Hook errors are logged but do not block password changes (non-blocking).
|
|
97
|
+
*
|
|
98
|
+
* @param provider - Password changed hook instance
|
|
99
|
+
*/
|
|
100
|
+
registerPasswordChanged(provider) {
|
|
101
|
+
this.passwordChangedHooks.push(provider);
|
|
102
|
+
this.logger?.debug?.(`[HookRegistry] Registered passwordChanged hook: ${provider.constructor.name}`);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Register an MFA device removed hook
|
|
106
|
+
*
|
|
107
|
+
* Hooks are executed in registration order.
|
|
108
|
+
* Hook errors are logged but do not block device removal (non-blocking).
|
|
109
|
+
*
|
|
110
|
+
* @param provider - MFA device removed hook instance
|
|
111
|
+
*/
|
|
112
|
+
registerMFADeviceRemoved(provider) {
|
|
113
|
+
this.mfaDeviceRemovedHooks.push(provider);
|
|
114
|
+
this.logger?.debug?.(`[HookRegistry] Registered mfaDeviceRemoved hook: ${provider.constructor.name}`);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Register an adaptive MFA risk detected hook
|
|
118
|
+
*
|
|
119
|
+
* Hooks are executed in registration order.
|
|
120
|
+
* Hook errors are logged but do not block authentication (non-blocking).
|
|
121
|
+
*
|
|
122
|
+
* @param provider - Adaptive MFA risk detected hook instance
|
|
123
|
+
*/
|
|
124
|
+
registerAdaptiveMFARiskDetected(provider) {
|
|
125
|
+
this.adaptiveMFARiskDetectedHooks.push(provider);
|
|
126
|
+
this.logger?.debug?.(`[HookRegistry] Registered adaptiveMFARiskDetected hook: ${provider.constructor.name}`);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Register an account status changed hook
|
|
130
|
+
*
|
|
131
|
+
* Hooks are executed in registration order.
|
|
132
|
+
* Hook errors are logged but do not block status changes (non-blocking).
|
|
133
|
+
*
|
|
134
|
+
* @param provider - Account status changed hook instance
|
|
135
|
+
*/
|
|
136
|
+
registerAccountStatusChanged(provider) {
|
|
137
|
+
this.accountStatusChangedHooks.push(provider);
|
|
138
|
+
this.logger?.debug?.(`[HookRegistry] Registered accountStatusChanged hook: ${provider.constructor.name}`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Register an email changed hook
|
|
142
|
+
*
|
|
143
|
+
* Hooks are executed in registration order.
|
|
144
|
+
* Hook errors are logged but do not block email changes (non-blocking).
|
|
145
|
+
*
|
|
146
|
+
* @param provider - Email changed hook instance
|
|
147
|
+
*/
|
|
148
|
+
registerEmailChanged(provider) {
|
|
149
|
+
this.emailChangedHooks.push(provider);
|
|
150
|
+
this.logger?.debug?.(`[HookRegistry] Registered emailChanged hook: ${provider.constructor.name}`);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Register an account locked hook
|
|
154
|
+
*
|
|
155
|
+
* Hooks are executed in registration order.
|
|
156
|
+
* Hook errors are logged but do not block lockout (non-blocking).
|
|
157
|
+
*
|
|
158
|
+
* @param provider - Account locked hook instance
|
|
159
|
+
*/
|
|
160
|
+
registerAccountLocked(provider) {
|
|
161
|
+
this.accountLockedHooks.push(provider);
|
|
162
|
+
this.logger?.debug?.(`[HookRegistry] Registered accountLocked hook: ${provider.constructor.name}`);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Register a sessions revoked hook
|
|
166
|
+
*
|
|
167
|
+
* Hooks are executed in registration order.
|
|
168
|
+
* Hook errors are logged but do not block session revocation (non-blocking).
|
|
169
|
+
*
|
|
170
|
+
* @param provider - Sessions revoked hook instance
|
|
171
|
+
*/
|
|
172
|
+
registerSessionsRevoked(provider) {
|
|
173
|
+
this.sessionsRevokedHooks.push(provider);
|
|
174
|
+
this.logger?.debug?.(`[HookRegistry] Registered sessionsRevoked hook: ${provider.constructor.name}`);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Register an MFA first enabled hook
|
|
178
|
+
*
|
|
179
|
+
* Hooks are executed in registration order.
|
|
180
|
+
* Hook errors are logged but do not block MFA enrollment (non-blocking).
|
|
181
|
+
*
|
|
182
|
+
* @param provider - MFA first enabled hook instance
|
|
183
|
+
*/
|
|
184
|
+
registerMFAFirstEnabled(provider) {
|
|
185
|
+
this.mfaFirstEnabledHooks.push(provider);
|
|
186
|
+
this.logger?.debug?.(`[HookRegistry] Registered mfaFirstEnabled hook: ${provider.constructor.name}`);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Register an MFA method added hook
|
|
190
|
+
*
|
|
191
|
+
* Hooks are executed in registration order.
|
|
192
|
+
* Hook errors are logged but do not block MFA enrollment (non-blocking).
|
|
193
|
+
*
|
|
194
|
+
* @param provider - MFA method added hook instance
|
|
195
|
+
*/
|
|
196
|
+
registerMFAMethodAdded(provider) {
|
|
197
|
+
this.mfaMethodAddedHooks.push(provider);
|
|
198
|
+
this.logger?.debug?.(`[HookRegistry] Registered mfaMethodAdded hook: ${provider.constructor.name}`);
|
|
199
|
+
}
|
|
70
200
|
// ============================================================================
|
|
71
201
|
// Execution Methods
|
|
72
202
|
// ============================================================================
|
|
@@ -133,6 +263,33 @@ class HookRegistryService {
|
|
|
133
263
|
}
|
|
134
264
|
}
|
|
135
265
|
}
|
|
266
|
+
/**
|
|
267
|
+
* Execute all registered onboarding completed hooks
|
|
268
|
+
*
|
|
269
|
+
* Hooks are executed sequentially in registration order.
|
|
270
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
271
|
+
*
|
|
272
|
+
* @param user - User entity (IUser interface)
|
|
273
|
+
* @param metadata - Completion metadata (verification method, source, timestamp)
|
|
274
|
+
*
|
|
275
|
+
* @internal
|
|
276
|
+
* @remarks This method is called internally by AuthService, EmailVerificationService, and PhoneVerificationService
|
|
277
|
+
*/
|
|
278
|
+
async executeOnboardingCompleted(user, metadata) {
|
|
279
|
+
if (this.onboardingCompletedHooks.length === 0) {
|
|
280
|
+
return; // No hooks registered
|
|
281
|
+
}
|
|
282
|
+
for (const hook of this.onboardingCompletedHooks) {
|
|
283
|
+
try {
|
|
284
|
+
await hook.execute(user, metadata);
|
|
285
|
+
}
|
|
286
|
+
catch (hookError) {
|
|
287
|
+
// Non-blocking: log error and continue
|
|
288
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
289
|
+
this.logger?.error?.(`[HookRegistry] onboardingCompleted hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
136
293
|
/**
|
|
137
294
|
* Execute all registered user profile updated hooks
|
|
138
295
|
*
|
|
@@ -159,6 +316,240 @@ class HookRegistryService {
|
|
|
159
316
|
}
|
|
160
317
|
}
|
|
161
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* Execute all registered password changed hooks
|
|
321
|
+
*
|
|
322
|
+
* Hooks are executed sequentially in registration order.
|
|
323
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
324
|
+
*
|
|
325
|
+
* @param metadata - Password change context with user and change details
|
|
326
|
+
*
|
|
327
|
+
* @internal
|
|
328
|
+
* @remarks This method is called internally by AuthServiceInternalHelpers
|
|
329
|
+
*/
|
|
330
|
+
async executePasswordChanged(metadata) {
|
|
331
|
+
if (this.passwordChangedHooks.length === 0) {
|
|
332
|
+
return; // No hooks registered
|
|
333
|
+
}
|
|
334
|
+
for (const hook of this.passwordChangedHooks) {
|
|
335
|
+
try {
|
|
336
|
+
await hook.execute(metadata);
|
|
337
|
+
}
|
|
338
|
+
catch (hookError) {
|
|
339
|
+
// Non-blocking: log error and continue
|
|
340
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
341
|
+
this.logger?.error?.(`[HookRegistry] passwordChanged hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Execute all registered MFA device removed hooks
|
|
347
|
+
*
|
|
348
|
+
* Hooks are executed sequentially in registration order.
|
|
349
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
350
|
+
*
|
|
351
|
+
* @param metadata - Device removal context with user and device details
|
|
352
|
+
*
|
|
353
|
+
* @internal
|
|
354
|
+
* @remarks This method is called internally by UserService and MFAService
|
|
355
|
+
*/
|
|
356
|
+
async executeMFADeviceRemoved(metadata) {
|
|
357
|
+
if (this.mfaDeviceRemovedHooks.length === 0) {
|
|
358
|
+
return; // No hooks registered
|
|
359
|
+
}
|
|
360
|
+
for (const hook of this.mfaDeviceRemovedHooks) {
|
|
361
|
+
try {
|
|
362
|
+
await hook.execute(metadata);
|
|
363
|
+
}
|
|
364
|
+
catch (hookError) {
|
|
365
|
+
// Non-blocking: log error and continue
|
|
366
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
367
|
+
this.logger?.error?.(`[HookRegistry] mfaDeviceRemoved hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Execute all registered adaptive MFA risk detected hooks
|
|
373
|
+
*
|
|
374
|
+
* Hooks are executed sequentially in registration order.
|
|
375
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
376
|
+
*
|
|
377
|
+
* @param metadata - Risk evaluation context with user and risk details
|
|
378
|
+
*
|
|
379
|
+
* @internal
|
|
380
|
+
* @remarks This method is called internally by AdaptiveMFADecisionService
|
|
381
|
+
*/
|
|
382
|
+
async executeAdaptiveMFARiskDetected(metadata) {
|
|
383
|
+
if (this.adaptiveMFARiskDetectedHooks.length === 0) {
|
|
384
|
+
return; // No hooks registered
|
|
385
|
+
}
|
|
386
|
+
for (const hook of this.adaptiveMFARiskDetectedHooks) {
|
|
387
|
+
try {
|
|
388
|
+
await hook.execute(metadata);
|
|
389
|
+
}
|
|
390
|
+
catch (hookError) {
|
|
391
|
+
// Non-blocking: log error and continue
|
|
392
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
393
|
+
this.logger?.error?.(`[HookRegistry] adaptiveMFARiskDetected hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Execute all registered account status changed hooks
|
|
399
|
+
*
|
|
400
|
+
* Hooks are executed sequentially in registration order.
|
|
401
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
402
|
+
*
|
|
403
|
+
* @param metadata - Status change context with user and change details
|
|
404
|
+
*
|
|
405
|
+
* @internal
|
|
406
|
+
* @remarks This method is called internally by UserService
|
|
407
|
+
*/
|
|
408
|
+
async executeAccountStatusChanged(metadata) {
|
|
409
|
+
if (this.accountStatusChangedHooks.length === 0) {
|
|
410
|
+
return; // No hooks registered
|
|
411
|
+
}
|
|
412
|
+
for (const hook of this.accountStatusChangedHooks) {
|
|
413
|
+
try {
|
|
414
|
+
await hook.execute(metadata);
|
|
415
|
+
}
|
|
416
|
+
catch (hookError) {
|
|
417
|
+
// Non-blocking: log error and continue
|
|
418
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
419
|
+
this.logger?.error?.(`[HookRegistry] accountStatusChanged hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Execute all registered email changed hooks
|
|
425
|
+
*
|
|
426
|
+
* Hooks are executed sequentially in registration order.
|
|
427
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
428
|
+
*
|
|
429
|
+
* @param metadata - Email change context with old and new addresses
|
|
430
|
+
*
|
|
431
|
+
* @internal
|
|
432
|
+
* @remarks This method is called internally by UserService
|
|
433
|
+
*/
|
|
434
|
+
async executeEmailChanged(metadata) {
|
|
435
|
+
if (this.emailChangedHooks.length === 0) {
|
|
436
|
+
return; // No hooks registered
|
|
437
|
+
}
|
|
438
|
+
for (const hook of this.emailChangedHooks) {
|
|
439
|
+
try {
|
|
440
|
+
await hook.execute(metadata);
|
|
441
|
+
}
|
|
442
|
+
catch (hookError) {
|
|
443
|
+
// Non-blocking: log error and continue
|
|
444
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
445
|
+
this.logger?.error?.(`[HookRegistry] emailChanged hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Execute all registered account locked hooks
|
|
451
|
+
*
|
|
452
|
+
* Hooks are executed sequentially in registration order.
|
|
453
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
454
|
+
*
|
|
455
|
+
* @param metadata - Lockout context with user and lock details
|
|
456
|
+
*
|
|
457
|
+
* @internal
|
|
458
|
+
* @remarks This method is called internally by AuthServiceInternalHelpers
|
|
459
|
+
*/
|
|
460
|
+
async executeAccountLocked(metadata) {
|
|
461
|
+
if (this.accountLockedHooks.length === 0) {
|
|
462
|
+
return; // No hooks registered
|
|
463
|
+
}
|
|
464
|
+
for (const hook of this.accountLockedHooks) {
|
|
465
|
+
try {
|
|
466
|
+
await hook.execute(metadata);
|
|
467
|
+
}
|
|
468
|
+
catch (hookError) {
|
|
469
|
+
// Non-blocking: log error and continue
|
|
470
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
471
|
+
this.logger?.error?.(`[HookRegistry] accountLocked hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Execute all registered sessions revoked hooks
|
|
477
|
+
*
|
|
478
|
+
* Hooks are executed sequentially in registration order.
|
|
479
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
480
|
+
*
|
|
481
|
+
* @param metadata - Revocation context with user and session details
|
|
482
|
+
*
|
|
483
|
+
* @internal
|
|
484
|
+
* @remarks This method is called internally by SessionService
|
|
485
|
+
*/
|
|
486
|
+
async executeSessionsRevoked(metadata) {
|
|
487
|
+
if (this.sessionsRevokedHooks.length === 0) {
|
|
488
|
+
return; // No hooks registered
|
|
489
|
+
}
|
|
490
|
+
for (const hook of this.sessionsRevokedHooks) {
|
|
491
|
+
try {
|
|
492
|
+
await hook.execute(metadata);
|
|
493
|
+
}
|
|
494
|
+
catch (hookError) {
|
|
495
|
+
// Non-blocking: log error and continue
|
|
496
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
497
|
+
this.logger?.error?.(`[HookRegistry] sessionsRevoked hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Execute all registered MFA first enabled hooks
|
|
503
|
+
*
|
|
504
|
+
* Hooks are executed sequentially in registration order.
|
|
505
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
506
|
+
*
|
|
507
|
+
* @param metadata - MFA enrollment context with user and device details
|
|
508
|
+
*
|
|
509
|
+
* @internal
|
|
510
|
+
* @remarks This method is called internally by BaseMFAProviderService
|
|
511
|
+
*/
|
|
512
|
+
async executeMFAFirstEnabled(metadata) {
|
|
513
|
+
if (this.mfaFirstEnabledHooks.length === 0) {
|
|
514
|
+
return; // No hooks registered
|
|
515
|
+
}
|
|
516
|
+
for (const hook of this.mfaFirstEnabledHooks) {
|
|
517
|
+
try {
|
|
518
|
+
await hook.execute(metadata);
|
|
519
|
+
}
|
|
520
|
+
catch (hookError) {
|
|
521
|
+
// Non-blocking: log error and continue
|
|
522
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
523
|
+
this.logger?.error?.(`[HookRegistry] mfaFirstEnabled hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Execute all registered MFA method added hooks
|
|
529
|
+
*
|
|
530
|
+
* Hooks are executed sequentially in registration order.
|
|
531
|
+
* Hook errors are logged but do not stop execution (non-blocking).
|
|
532
|
+
*
|
|
533
|
+
* @param metadata - MFA method addition context
|
|
534
|
+
*
|
|
535
|
+
* @internal
|
|
536
|
+
* @remarks This method is called internally by BaseMFAProviderService
|
|
537
|
+
*/
|
|
538
|
+
async executeMFAMethodAdded(metadata) {
|
|
539
|
+
if (this.mfaMethodAddedHooks.length === 0) {
|
|
540
|
+
return; // No hooks registered
|
|
541
|
+
}
|
|
542
|
+
for (const hook of this.mfaMethodAddedHooks) {
|
|
543
|
+
try {
|
|
544
|
+
await hook.execute(metadata);
|
|
545
|
+
}
|
|
546
|
+
catch (hookError) {
|
|
547
|
+
// Non-blocking: log error and continue
|
|
548
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
549
|
+
this.logger?.error?.(`[HookRegistry] mfaMethodAdded hook error: ${hook.constructor.name} - ${errorMessage}`, hookError instanceof Error ? { error: hookError } : undefined);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
162
553
|
}
|
|
163
554
|
exports.HookRegistryService = HookRegistryService;
|
|
164
555
|
//# sourceMappingURL=hook-registry.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-registry.service.js","sourceRoot":"","sources":["../../src/services/hook-registry.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hook-registry.service.js","sourceRoot":"","sources":["../../src/services/hook-registry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { InternalAuthAuditService as AuthAuditService } from './auth-audit.servi
|
|
|
7
7
|
import { ClientInfoService } from './client-info.service';
|
|
8
8
|
import { IMFAProviderService } from '../interfaces/mfa-provider.interface';
|
|
9
9
|
import { ChallengeService } from './challenge.service';
|
|
10
|
+
import { HookRegistryService } from './hook-registry.service';
|
|
10
11
|
/**
|
|
11
12
|
* Base MFA Provider Service
|
|
12
13
|
*
|
|
@@ -59,9 +60,10 @@ export declare abstract class BaseMFAProviderService implements IMFAProviderServ
|
|
|
59
60
|
protected readonly challengeService?: ChallengeService | undefined;
|
|
60
61
|
protected readonly auditService?: AuthAuditService | undefined;
|
|
61
62
|
protected readonly clientInfoService?: ClientInfoService | undefined;
|
|
63
|
+
protected readonly hookRegistry?: HookRegistryService | undefined;
|
|
62
64
|
abstract readonly methodName: string;
|
|
63
65
|
constructor(mfaDeviceRepository: Repository<BaseMFADevice>, userRepository: Repository<BaseUser>, config: NAuthConfig, logger: NAuthLogger, passwordService?: unknown | undefined, // Optional - from @nauth-toolkit/core
|
|
64
|
-
challengeService?: ChallengeService | undefined, auditService?: AuthAuditService | undefined, clientInfoService?: ClientInfoService | undefined);
|
|
66
|
+
challengeService?: ChallengeService | undefined, auditService?: AuthAuditService | undefined, clientInfoService?: ClientInfoService | undefined, hookRegistry?: HookRegistryService | undefined);
|
|
65
67
|
/**
|
|
66
68
|
* Check if this MFA method is allowed by configuration
|
|
67
69
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa-base.service.d.ts","sourceRoot":"","sources":["../../src/services/mfa-base.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,wBAAwB,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"mfa-base.service.d.ts","sourceRoot":"","sources":["../../src/services/mfa-base.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,8 +58,9 @@ class BaseMFAProviderService {
|
|
|
58
58
|
challengeService;
|
|
59
59
|
auditService;
|
|
60
60
|
clientInfoService;
|
|
61
|
+
hookRegistry;
|
|
61
62
|
constructor(mfaDeviceRepository, userRepository, config, logger, passwordService, // Optional - from @nauth-toolkit/core
|
|
62
|
-
challengeService, auditService, clientInfoService) {
|
|
63
|
+
challengeService, auditService, clientInfoService, hookRegistry) {
|
|
63
64
|
this.mfaDeviceRepository = mfaDeviceRepository;
|
|
64
65
|
this.userRepository = userRepository;
|
|
65
66
|
this.config = config;
|
|
@@ -68,6 +69,7 @@ class BaseMFAProviderService {
|
|
|
68
69
|
this.challengeService = challengeService;
|
|
69
70
|
this.auditService = auditService;
|
|
70
71
|
this.clientInfoService = clientInfoService;
|
|
72
|
+
this.hookRegistry = hookRegistry;
|
|
71
73
|
}
|
|
72
74
|
/**
|
|
73
75
|
* Check if this MFA method is allowed by configuration
|
|
@@ -258,6 +260,9 @@ class BaseMFAProviderService {
|
|
|
258
260
|
}
|
|
259
261
|
const userEntityRecord = userEntity;
|
|
260
262
|
const isFirstDevice = !userEntityRecord.mfaEnabled;
|
|
263
|
+
const previousMethods = Array.isArray(userEntityRecord.mfaMethods)
|
|
264
|
+
? userEntityRecord.mfaMethods
|
|
265
|
+
: [];
|
|
261
266
|
if (!userEntityRecord.mfaEnabled) {
|
|
262
267
|
userEntityRecord.mfaEnabled = true;
|
|
263
268
|
userEntityRecord.mfaEnforcedAt = new Date();
|
|
@@ -265,6 +270,7 @@ class BaseMFAProviderService {
|
|
|
265
270
|
// Update mfaMethods array
|
|
266
271
|
const devices = await this.getUserDevices(userId);
|
|
267
272
|
const methods = [...new Set(devices.filter((d) => d.isActive).map((d) => d.type))];
|
|
273
|
+
const newlyAddedMethods = methods.filter((m) => !previousMethods.includes(m));
|
|
268
274
|
userEntityRecord.mfaMethods = methods;
|
|
269
275
|
// Set preferred method if not set
|
|
270
276
|
if (!userEntityRecord.preferredMfaMethod && methods.length > 0) {
|
|
@@ -272,6 +278,41 @@ class BaseMFAProviderService {
|
|
|
272
278
|
userEntityRecord.preferredMfaMethod = primaryDevice?.type || methods[0];
|
|
273
279
|
}
|
|
274
280
|
await this.userRepository.save(userEntity);
|
|
281
|
+
// ============================================================================
|
|
282
|
+
// Lifecycle Hook: MFA Method Added (additional methods only)
|
|
283
|
+
// ============================================================================
|
|
284
|
+
// This complements (and avoids duplicating) the "first enabled" hook:
|
|
285
|
+
// - First ever method → `executeMFAFirstEnabled`
|
|
286
|
+
// - Subsequent new method → `executeMFAMethodAdded`
|
|
287
|
+
if (!isFirstDevice && newlyAddedMethods.length > 0 && this.hookRegistry && this.clientInfoService) {
|
|
288
|
+
try {
|
|
289
|
+
const clientInfo = this.clientInfoService.get();
|
|
290
|
+
for (const method of newlyAddedMethods) {
|
|
291
|
+
await this.hookRegistry.executeMFAMethodAdded({
|
|
292
|
+
user: userEntity,
|
|
293
|
+
method: method,
|
|
294
|
+
isFirstMethod: false,
|
|
295
|
+
enabledMethods: methods,
|
|
296
|
+
timestamp: new Date(),
|
|
297
|
+
clientInfo: {
|
|
298
|
+
ipAddress: clientInfo.ipAddress,
|
|
299
|
+
userAgent: clientInfo.userAgent,
|
|
300
|
+
ipCountry: clientInfo.ipCountry,
|
|
301
|
+
ipCity: clientInfo.ipCity,
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (hookError) {
|
|
307
|
+
// Non-blocking: Log but continue
|
|
308
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
309
|
+
this.logger?.error?.(`Failed to execute mfaMethodAdded hooks: ${errorMessage}`, {
|
|
310
|
+
error: hookError,
|
|
311
|
+
userId: user.id,
|
|
312
|
+
methodName: this.methodName,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
275
316
|
// If this is the first MFA device being set up, clear any MFA_SETUP_REQUIRED challenges
|
|
276
317
|
// This prevents phantom challenges when user sets up MFA while logged in
|
|
277
318
|
// if (isFirstDevice && this.challengeService) {
|
|
@@ -309,6 +350,34 @@ class BaseMFAProviderService {
|
|
|
309
350
|
});
|
|
310
351
|
}
|
|
311
352
|
}
|
|
353
|
+
// ============================================================================
|
|
354
|
+
// Lifecycle Hook: MFA First Enabled (only for first device)
|
|
355
|
+
// ============================================================================
|
|
356
|
+
if (isFirstDevice && this.hookRegistry && this.clientInfoService) {
|
|
357
|
+
try {
|
|
358
|
+
const clientInfo = this.clientInfoService.get();
|
|
359
|
+
await this.hookRegistry.executeMFAFirstEnabled({
|
|
360
|
+
user: userEntity,
|
|
361
|
+
firstMethod: this.methodName,
|
|
362
|
+
enforcedAt: new Date(),
|
|
363
|
+
clientInfo: {
|
|
364
|
+
ipAddress: clientInfo.ipAddress,
|
|
365
|
+
userAgent: clientInfo.userAgent,
|
|
366
|
+
ipCountry: clientInfo.ipCountry,
|
|
367
|
+
ipCity: clientInfo.ipCity,
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
catch (hookError) {
|
|
372
|
+
// Non-blocking: Log but continue
|
|
373
|
+
const errorMessage = hookError instanceof Error ? hookError.message : 'Unknown error';
|
|
374
|
+
this.logger?.error?.(`Failed to execute mfaFirstEnabled hooks: ${errorMessage}`, {
|
|
375
|
+
error: hookError,
|
|
376
|
+
userId: user.id,
|
|
377
|
+
methodName: this.methodName,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
312
381
|
}
|
|
313
382
|
// ============================================================================
|
|
314
383
|
// Backup Codes (Common Logic)
|