@nauth-toolkit/mfa-totp 0.1.83 → 0.1.85
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/src/totp-mfa-provider.service.js +2 -2
- package/dist/src/totp-mfa-provider.service.js.map +1 -1
- package/dist/src/totp.service.d.ts +7 -16
- package/dist/src/totp.service.d.ts.map +1 -1
- package/dist/src/totp.service.js +37 -36
- package/dist/src/totp.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -93,7 +93,7 @@ class TOTPMFAProviderService extends internal_1.BaseMFAProviderService {
|
|
|
93
93
|
throw new core_1.NAuthException(core_1.AuthErrorCode.VALIDATION_FAILED, 'Invalid TOTP secret', { field: 'secret' });
|
|
94
94
|
}
|
|
95
95
|
// Verify code
|
|
96
|
-
const result = this.totpService.verifyCodeWithDetails(dto.secret, dto.code);
|
|
96
|
+
const result = await this.totpService.verifyCodeWithDetails(dto.secret, dto.code);
|
|
97
97
|
if (!result.valid) {
|
|
98
98
|
throw new core_1.NAuthException(core_1.AuthErrorCode.VERIFICATION_CODE_INVALID, result.error || 'Invalid TOTP code');
|
|
99
99
|
}
|
|
@@ -151,7 +151,7 @@ class TOTPMFAProviderService extends internal_1.BaseMFAProviderService {
|
|
|
151
151
|
return false;
|
|
152
152
|
}
|
|
153
153
|
// Verify code
|
|
154
|
-
const isValid = this.totpService.verifyCode(device.secret, totpCode);
|
|
154
|
+
const isValid = await this.totpService.verifyCode(device.secret, totpCode);
|
|
155
155
|
if (isValid) {
|
|
156
156
|
// Update device usage
|
|
157
157
|
await this.updateDeviceUsage(device.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totp-mfa-provider.service.js","sourceRoot":"","sources":["../../src/totp-mfa-provider.service.ts"],"names":[],"mappings":";;;AACA,qBAAqB;AACrB,8CAU6B;AAC7B,sDAAsD;AACtD,2DAA0G;AAI1G;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAa,sBAAuB,SAAQ,iCAAsB;IAS7C;IARV,UAAU,GAAG,gBAAS,CAAC,IAAI,CAAC;IAErC,YACE,mBAA8C,EAC9C,cAAoC,EACpC,MAAmB,EACnB,MAAmB,EACnB,eAAwB,EACP,WAAwB,EACzC,gBAAmC,EACnC,YAA+B,EAC/B,iBAAqC;QAErC,KAAK,CACH,mBAAmB,EACnB,cAAc,EACd,MAAM,EACN,MAAM,EACN,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,CAClB,CAAC;QAde,gBAAW,GAAX,WAAW,CAAa;IAe3C,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,KAAK,CAAC,IAAW,EAAE,UAAoB;QAC3C,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,6BAA6B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAE5D,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,8BAA8B;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,kCAAkC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjE,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,KAAK,CAAC,WAAW,CAAC,IAAW,EAAE,gBAAyB,EAAE,UAAmB;QAC3E,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,kCAAkC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,gBAAsC,CAAC;QAEnD,yBAAyB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,qBAAc,CAAC,oBAAa,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,cAAc;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"totp-mfa-provider.service.js","sourceRoot":"","sources":["../../src/totp-mfa-provider.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,15 +27,6 @@ export declare class TOTPService {
|
|
|
27
27
|
private readonly logger;
|
|
28
28
|
private readonly defaultConfig;
|
|
29
29
|
constructor(config: NAuthConfig, logger: NAuthLogger);
|
|
30
|
-
/**
|
|
31
|
-
* Configure otplib authenticator with config settings
|
|
32
|
-
*
|
|
33
|
-
* Applies TOTP configuration from NAuthConfig or uses defaults.
|
|
34
|
-
* Called during service initialization.
|
|
35
|
-
*
|
|
36
|
-
* @private
|
|
37
|
-
*/
|
|
38
|
-
private configureAuthenticator;
|
|
39
30
|
/**
|
|
40
31
|
* Get TOTP configuration with defaults
|
|
41
32
|
*
|
|
@@ -100,13 +91,13 @@ export declare class TOTPService {
|
|
|
100
91
|
* @example
|
|
101
92
|
* ```typescript
|
|
102
93
|
* // User enters code from Google Authenticator
|
|
103
|
-
* const isValid = totpService.verifyCode(user.totpSecret, '123456');
|
|
94
|
+
* const isValid = await totpService.verifyCode(user.totpSecret, '123456');
|
|
104
95
|
* if (isValid) {
|
|
105
96
|
* // Grant access
|
|
106
97
|
* }
|
|
107
98
|
* ```
|
|
108
99
|
*/
|
|
109
|
-
verifyCode(secret: string, code: string): boolean
|
|
100
|
+
verifyCode(secret: string, code: string): Promise<boolean>;
|
|
110
101
|
/**
|
|
111
102
|
* Verify TOTP code with additional validation
|
|
112
103
|
*
|
|
@@ -118,16 +109,16 @@ export declare class TOTPService {
|
|
|
118
109
|
*
|
|
119
110
|
* @example
|
|
120
111
|
* ```typescript
|
|
121
|
-
* const result = totpService.verifyCodeWithDetails(secret, '123456');
|
|
112
|
+
* const result = await totpService.verifyCodeWithDetails(secret, '123456');
|
|
122
113
|
* if (!result.valid) {
|
|
123
114
|
* throw new BadRequestException(result.error);
|
|
124
115
|
* }
|
|
125
116
|
* ```
|
|
126
117
|
*/
|
|
127
|
-
verifyCodeWithDetails(secret: string, code: string): {
|
|
118
|
+
verifyCodeWithDetails(secret: string, code: string): Promise<{
|
|
128
119
|
valid: boolean;
|
|
129
120
|
error?: string;
|
|
130
|
-
}
|
|
121
|
+
}>;
|
|
131
122
|
/**
|
|
132
123
|
* Generate current TOTP code for secret
|
|
133
124
|
*
|
|
@@ -140,11 +131,11 @@ export declare class TOTPService {
|
|
|
140
131
|
* @example
|
|
141
132
|
* ```typescript
|
|
142
133
|
* // Testing only
|
|
143
|
-
* const code = totpService.generateCode(secret);
|
|
134
|
+
* const code = await totpService.generateCode(secret);
|
|
144
135
|
* // Returns: '123456'
|
|
145
136
|
* ```
|
|
146
137
|
*/
|
|
147
|
-
generateCode(secret: string): string
|
|
138
|
+
generateCode(secret: string): Promise<string>;
|
|
148
139
|
/**
|
|
149
140
|
* Validate secret format
|
|
150
141
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totp.service.d.ts","sourceRoot":"","sources":["../../src/totp.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAc,WAAW,EAAiC,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,qBAAa,WAAW;IASpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK5B;gBAGiB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"totp.service.d.ts","sourceRoot":"","sources":["../../src/totp.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAc,WAAW,EAAiC,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,qBAAa,WAAW;IASpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK5B;gBAGiB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW;IAStC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAQjB;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2CxE;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,0BAA0B;IAQlC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoChE;;;;;;;;;;;;;;;;OAgBG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+BtG;;;;;;;;;;;;;;;OAeG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWnD;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAkBtC;;;;;;;;;;;;;OAaG;IACH,gBAAgB,IAAI,MAAM;CAM3B"}
|
package/dist/src/totp.service.js
CHANGED
|
@@ -71,28 +71,8 @@ class TOTPService {
|
|
|
71
71
|
constructor(config, logger) {
|
|
72
72
|
this.config = config;
|
|
73
73
|
this.logger = logger;
|
|
74
|
-
//
|
|
75
|
-
this.configureAuthenticator();
|
|
76
|
-
}
|
|
77
|
-
// ============================================================================
|
|
78
|
-
// Configuration
|
|
79
|
-
// ============================================================================
|
|
80
|
-
/**
|
|
81
|
-
* Configure otplib authenticator with config settings
|
|
82
|
-
*
|
|
83
|
-
* Applies TOTP configuration from NAuthConfig or uses defaults.
|
|
84
|
-
* Called during service initialization.
|
|
85
|
-
*
|
|
86
|
-
* @private
|
|
87
|
-
*/
|
|
88
|
-
configureAuthenticator() {
|
|
74
|
+
// Log TOTP configuration
|
|
89
75
|
const totpConfig = this.getTOTPConfig();
|
|
90
|
-
otplib_1.authenticator.options = {
|
|
91
|
-
step: totpConfig.stepSeconds,
|
|
92
|
-
window: totpConfig.window,
|
|
93
|
-
digits: totpConfig.digits,
|
|
94
|
-
algorithm: totpConfig.algorithm, // Type cast - otplib types don't match our config
|
|
95
|
-
};
|
|
96
76
|
this.logger?.debug?.(`TOTP configured: step=${totpConfig.stepSeconds}s, window=${totpConfig.window}, digits=${totpConfig.digits}`);
|
|
97
77
|
}
|
|
98
78
|
/**
|
|
@@ -139,11 +119,19 @@ class TOTPService {
|
|
|
139
119
|
async generateSecret(accountName) {
|
|
140
120
|
this.logger?.log?.(`Generating TOTP secret for: ${accountName}`);
|
|
141
121
|
// Generate base32-encoded secret
|
|
142
|
-
const secret = otplib_1.
|
|
122
|
+
const secret = (0, otplib_1.generateSecret)();
|
|
143
123
|
// Get issuer name
|
|
144
124
|
const issuer = this.getIssuer();
|
|
145
125
|
// Generate otpauth URI for QR code
|
|
146
|
-
const
|
|
126
|
+
const totpConfig = this.getTOTPConfig();
|
|
127
|
+
const otpauthUrl = await (0, otplib_1.generateURI)({
|
|
128
|
+
label: accountName,
|
|
129
|
+
issuer,
|
|
130
|
+
secret,
|
|
131
|
+
algorithm: totpConfig.algorithm,
|
|
132
|
+
digits: totpConfig.digits,
|
|
133
|
+
period: totpConfig.stepSeconds,
|
|
134
|
+
});
|
|
147
135
|
// Generate QR code as data URL
|
|
148
136
|
let qrCode;
|
|
149
137
|
try {
|
|
@@ -201,13 +189,13 @@ class TOTPService {
|
|
|
201
189
|
* @example
|
|
202
190
|
* ```typescript
|
|
203
191
|
* // User enters code from Google Authenticator
|
|
204
|
-
* const isValid = totpService.verifyCode(user.totpSecret, '123456');
|
|
192
|
+
* const isValid = await totpService.verifyCode(user.totpSecret, '123456');
|
|
205
193
|
* if (isValid) {
|
|
206
194
|
* // Grant access
|
|
207
195
|
* }
|
|
208
196
|
* ```
|
|
209
197
|
*/
|
|
210
|
-
verifyCode(secret, code) {
|
|
198
|
+
async verifyCode(secret, code) {
|
|
211
199
|
try {
|
|
212
200
|
// Remove spaces and validate format
|
|
213
201
|
const cleanCode = code.replace(/\s/g, '');
|
|
@@ -215,18 +203,24 @@ class TOTPService {
|
|
|
215
203
|
this.logger?.warn?.('Invalid TOTP code format');
|
|
216
204
|
return false;
|
|
217
205
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
206
|
+
const totpConfig = this.getTOTPConfig();
|
|
207
|
+
// Verify code using otplib v13 API
|
|
208
|
+
const result = await (0, otplib_1.verify)({
|
|
221
209
|
secret,
|
|
210
|
+
token: cleanCode,
|
|
211
|
+
strategy: 'totp',
|
|
212
|
+
epochTolerance: totpConfig.window,
|
|
213
|
+
period: totpConfig.stepSeconds,
|
|
214
|
+
digits: totpConfig.digits,
|
|
215
|
+
algorithm: totpConfig.algorithm,
|
|
222
216
|
});
|
|
223
|
-
if (
|
|
217
|
+
if (result.valid) {
|
|
224
218
|
this.logger?.debug?.('TOTP code verified successfully');
|
|
225
219
|
}
|
|
226
220
|
else {
|
|
227
221
|
this.logger?.warn?.('TOTP code verification failed');
|
|
228
222
|
}
|
|
229
|
-
return
|
|
223
|
+
return result.valid;
|
|
230
224
|
}
|
|
231
225
|
catch (error) {
|
|
232
226
|
this.logger?.error?.('TOTP verification error', error);
|
|
@@ -244,13 +238,13 @@ class TOTPService {
|
|
|
244
238
|
*
|
|
245
239
|
* @example
|
|
246
240
|
* ```typescript
|
|
247
|
-
* const result = totpService.verifyCodeWithDetails(secret, '123456');
|
|
241
|
+
* const result = await totpService.verifyCodeWithDetails(secret, '123456');
|
|
248
242
|
* if (!result.valid) {
|
|
249
243
|
* throw new BadRequestException(result.error);
|
|
250
244
|
* }
|
|
251
245
|
* ```
|
|
252
246
|
*/
|
|
253
|
-
verifyCodeWithDetails(secret, code) {
|
|
247
|
+
async verifyCodeWithDetails(secret, code) {
|
|
254
248
|
// Validate code format
|
|
255
249
|
const cleanCode = code.replace(/\s/g, '');
|
|
256
250
|
if (!cleanCode) {
|
|
@@ -264,7 +258,7 @@ class TOTPService {
|
|
|
264
258
|
return { valid: false, error: 'Invalid secret' };
|
|
265
259
|
}
|
|
266
260
|
// Verify code
|
|
267
|
-
const isValid = this.verifyCode(secret, cleanCode);
|
|
261
|
+
const isValid = await this.verifyCode(secret, cleanCode);
|
|
268
262
|
if (!isValid) {
|
|
269
263
|
return { valid: false, error: 'Invalid or expired code' };
|
|
270
264
|
}
|
|
@@ -285,12 +279,19 @@ class TOTPService {
|
|
|
285
279
|
* @example
|
|
286
280
|
* ```typescript
|
|
287
281
|
* // Testing only
|
|
288
|
-
* const code = totpService.generateCode(secret);
|
|
282
|
+
* const code = await totpService.generateCode(secret);
|
|
289
283
|
* // Returns: '123456'
|
|
290
284
|
* ```
|
|
291
285
|
*/
|
|
292
|
-
generateCode(secret) {
|
|
293
|
-
|
|
286
|
+
async generateCode(secret) {
|
|
287
|
+
const totpConfig = this.getTOTPConfig();
|
|
288
|
+
return await (0, otplib_1.generate)({
|
|
289
|
+
secret,
|
|
290
|
+
strategy: 'totp',
|
|
291
|
+
period: totpConfig.stepSeconds,
|
|
292
|
+
digits: totpConfig.digits,
|
|
293
|
+
algorithm: totpConfig.algorithm,
|
|
294
|
+
});
|
|
294
295
|
}
|
|
295
296
|
/**
|
|
296
297
|
* Validate secret format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totp.service.js","sourceRoot":"","sources":["../../src/totp.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"totp.service.js","sourceRoot":"","sources":["../../src/totp.service.ts"],"names":[],"mappings":"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"}
|