@cairs-npm/express-auth-2fa 0.1.4 → 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.
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -252
- package/dist/index.d.ts +28 -252
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts
CHANGED
|
@@ -161,150 +161,67 @@ interface Logger {
|
|
|
161
161
|
error: (obj: object, msg?: string) => void;
|
|
162
162
|
}
|
|
163
163
|
declare const configSchema: z.ZodObject<{
|
|
164
|
-
db: z.
|
|
164
|
+
db: z.ZodCustom<Db, Db>;
|
|
165
165
|
issuer: z.ZodString;
|
|
166
|
-
/** PEM PKCS8 private key (Ed25519 or RSA). Required, min 32 bytes. */
|
|
167
166
|
jwtPrivateKey: z.ZodString;
|
|
168
|
-
/** 32-byte AES key, raw string or base64. Required. */
|
|
169
167
|
encryptionKey: z.ZodString;
|
|
170
168
|
keyId: z.ZodDefault<z.ZodString>;
|
|
171
|
-
userAdapter: z.
|
|
172
|
-
smsProvider: z.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
hooks: z.ZodOptional<z.ZodType<Hooks, z.ZodTypeDef, Hooks>>;
|
|
179
|
-
clock: z.ZodOptional<z.ZodType<Clock, z.ZodTypeDef, Clock>>;
|
|
169
|
+
userAdapter: z.ZodCustom<UserAdapter, UserAdapter>;
|
|
170
|
+
smsProvider: z.ZodCustom<SmsProvider, SmsProvider>;
|
|
171
|
+
emailProvider: z.ZodOptional<z.ZodCustom<EmailProvider, EmailProvider>>;
|
|
172
|
+
client: z.ZodOptional<z.ZodCustom<MongoClient, MongoClient>>;
|
|
173
|
+
logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
|
|
174
|
+
hooks: z.ZodOptional<z.ZodCustom<Hooks, Hooks>>;
|
|
175
|
+
clock: z.ZodOptional<z.ZodCustom<Clock, Clock>>;
|
|
180
176
|
collectionPrefix: z.ZodDefault<z.ZodString>;
|
|
181
|
-
/**
|
|
182
|
-
* Passkeys (WebAuthn) as a second step. `rpID` is the site's domain (e.g. "childmatch.com",
|
|
183
|
-
* "localhost"); `origins` are the exact browser origins allowed (e.g. "https://app.childmatch.com").
|
|
184
|
-
* Omit to turn passkeys off.
|
|
185
|
-
*/
|
|
186
177
|
passkeys: z.ZodOptional<z.ZodObject<{
|
|
187
178
|
rpID: z.ZodString;
|
|
188
179
|
rpName: z.ZodString;
|
|
189
|
-
origins: z.ZodArray<z.ZodString
|
|
190
|
-
},
|
|
191
|
-
|
|
192
|
-
rpName: string;
|
|
193
|
-
origins: string[];
|
|
194
|
-
}, {
|
|
195
|
-
rpID: string;
|
|
196
|
-
rpName: string;
|
|
197
|
-
origins: string[];
|
|
198
|
-
}>>;
|
|
199
|
-
/**
|
|
200
|
-
* Allow POST /auth/login/start: sign in with the identifier and a verification method only
|
|
201
|
-
* (no password). Single-factor — enable only for apps that already sign in by code. Pass a
|
|
202
|
-
* function to allow it per request, e.g. only for `type: "badge"`.
|
|
203
|
-
*/
|
|
204
|
-
passwordlessLogin: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
|
|
180
|
+
origins: z.ZodArray<z.ZodString>;
|
|
181
|
+
}, z.core.$strip>>;
|
|
182
|
+
passwordlessLogin: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
205
183
|
username: string;
|
|
206
184
|
type?: string;
|
|
207
|
-
}) => boolean | Promise<boolean>,
|
|
185
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
208
186
|
username: string;
|
|
209
187
|
type?: string;
|
|
210
188
|
}) => boolean | Promise<boolean>>]>>;
|
|
211
|
-
|
|
212
|
-
* 2-Step Verification switch above each user's own choice. False: password sign-in never
|
|
213
|
-
* asks for a code and the two-step setting can't be turned on. Passwordless sign-in still
|
|
214
|
-
* sends a code — it's the only factor there. Pass a function to decide per user, e.g. from
|
|
215
|
-
* an organization setting.
|
|
216
|
-
*/
|
|
217
|
-
twoStepEnabled: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
|
|
189
|
+
twoStepEnabled: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
218
190
|
userId: string;
|
|
219
|
-
}) => boolean | Promise<boolean>,
|
|
191
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
220
192
|
userId: string;
|
|
221
193
|
}) => boolean | Promise<boolean>>]>>;
|
|
222
|
-
/** 2-Step Verification state for users who have not chosen one yet. */
|
|
223
194
|
twoStepDefault: z.ZodDefault<z.ZodBoolean>;
|
|
224
|
-
limits: z.
|
|
225
|
-
/** Failed passwords before lockout (BR-2). */
|
|
195
|
+
limits: z.ZodPrefault<z.ZodObject<{
|
|
226
196
|
loginMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
227
|
-
/** Window for failed-login counting, minutes (BR-2). */
|
|
228
197
|
loginWindowMin: z.ZodDefault<z.ZodNumber>;
|
|
229
|
-
/** Lockout duration, minutes (BR-2, BR-9). */
|
|
230
198
|
lockMinutes: z.ZodDefault<z.ZodNumber>;
|
|
231
|
-
/** Min seconds between SMS sends on one challenge (BR-6). */
|
|
232
199
|
smsResendSec: z.ZodDefault<z.ZodNumber>;
|
|
233
|
-
/** Max SMS sends per challenge (BR-6). */
|
|
234
200
|
smsMaxPerChallenge: z.ZodDefault<z.ZodNumber>;
|
|
235
|
-
/** Max SMS sends per user per hour (BR-6). */
|
|
236
201
|
smsMaxPerUserHour: z.ZodDefault<z.ZodNumber>;
|
|
237
|
-
/** Wrong codes per challenge before lockout (BR-9). */
|
|
238
202
|
mfaMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
239
|
-
/** Max verification methods per user (BR-16). */
|
|
240
203
|
maxMethods: z.ZodDefault<z.ZodNumber>;
|
|
241
|
-
/** Per-IP login requests per minute (NFR-B4). */
|
|
242
204
|
loginIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
243
|
-
/** Per-IP MFA verify requests per minute (NFR-B4). */
|
|
244
205
|
verifyIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
245
|
-
/** Per-IP step-up requests per minute (NFR-B4). */
|
|
246
206
|
stepUpIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
247
|
-
},
|
|
248
|
-
loginMaxAttempts: number;
|
|
249
|
-
loginWindowMin: number;
|
|
250
|
-
lockMinutes: number;
|
|
251
|
-
smsResendSec: number;
|
|
252
|
-
smsMaxPerChallenge: number;
|
|
253
|
-
smsMaxPerUserHour: number;
|
|
254
|
-
mfaMaxAttempts: number;
|
|
255
|
-
maxMethods: number;
|
|
256
|
-
loginIpPerMin: number;
|
|
257
|
-
verifyIpPerMin: number;
|
|
258
|
-
stepUpIpPerMin: number;
|
|
259
|
-
}, {
|
|
260
|
-
loginMaxAttempts?: number | undefined;
|
|
261
|
-
loginWindowMin?: number | undefined;
|
|
262
|
-
lockMinutes?: number | undefined;
|
|
263
|
-
smsResendSec?: number | undefined;
|
|
264
|
-
smsMaxPerChallenge?: number | undefined;
|
|
265
|
-
smsMaxPerUserHour?: number | undefined;
|
|
266
|
-
mfaMaxAttempts?: number | undefined;
|
|
267
|
-
maxMethods?: number | undefined;
|
|
268
|
-
loginIpPerMin?: number | undefined;
|
|
269
|
-
verifyIpPerMin?: number | undefined;
|
|
270
|
-
stepUpIpPerMin?: number | undefined;
|
|
271
|
-
}>>;
|
|
272
|
-
/**
|
|
273
|
-
* Set false to turn off every RATE_LIMITED check: the per-IP limits on login / code
|
|
274
|
-
* verify / send / step-up and the code-send cooldown and caps. Account lockouts after
|
|
275
|
-
* failed passwords or codes (LOCKED) still apply.
|
|
276
|
-
*/
|
|
207
|
+
}, z.core.$strip>>;
|
|
277
208
|
rateLimits: z.ZodDefault<z.ZodBoolean>;
|
|
278
|
-
argon2: z.
|
|
209
|
+
argon2: z.ZodPrefault<z.ZodObject<{
|
|
279
210
|
memoryKiB: z.ZodDefault<z.ZodNumber>;
|
|
280
211
|
iterations: z.ZodDefault<z.ZodNumber>;
|
|
281
212
|
parallelism: z.ZodDefault<z.ZodNumber>;
|
|
282
|
-
},
|
|
283
|
-
|
|
284
|
-
iterations: number;
|
|
285
|
-
parallelism: number;
|
|
286
|
-
}, {
|
|
287
|
-
memoryKiB?: number | undefined;
|
|
288
|
-
iterations?: number | undefined;
|
|
289
|
-
parallelism?: number | undefined;
|
|
290
|
-
}>>;
|
|
291
|
-
cookies: z.ZodDefault<z.ZodObject<{
|
|
213
|
+
}, z.core.$strip>>;
|
|
214
|
+
cookies: z.ZodPrefault<z.ZodObject<{
|
|
292
215
|
secure: z.ZodDefault<z.ZodBoolean>;
|
|
293
216
|
domain: z.ZodOptional<z.ZodString>;
|
|
294
|
-
sameSite: z.ZodDefault<z.ZodEnum<
|
|
217
|
+
sameSite: z.ZodDefault<z.ZodEnum<{
|
|
218
|
+
lax: "lax";
|
|
219
|
+
strict: "strict";
|
|
220
|
+
none: "none";
|
|
221
|
+
}>>;
|
|
295
222
|
path: z.ZodDefault<z.ZodString>;
|
|
296
|
-
},
|
|
297
|
-
|
|
298
|
-
secure: boolean;
|
|
299
|
-
sameSite: "lax" | "strict" | "none";
|
|
300
|
-
domain?: string | undefined;
|
|
301
|
-
}, {
|
|
302
|
-
path?: string | undefined;
|
|
303
|
-
secure?: boolean | undefined;
|
|
304
|
-
domain?: string | undefined;
|
|
305
|
-
sameSite?: "lax" | "strict" | "none" | undefined;
|
|
306
|
-
}>>;
|
|
307
|
-
ttl: z.ZodDefault<z.ZodObject<{
|
|
223
|
+
}, z.core.$strip>>;
|
|
224
|
+
ttl: z.ZodPrefault<z.ZodObject<{
|
|
308
225
|
accessTokenSec: z.ZodDefault<z.ZodNumber>;
|
|
309
226
|
refreshTokenDays: z.ZodDefault<z.ZodNumber>;
|
|
310
227
|
trustedDeviceDays: z.ZodDefault<z.ZodNumber>;
|
|
@@ -312,150 +229,9 @@ declare const configSchema: z.ZodObject<{
|
|
|
312
229
|
stepUpSec: z.ZodDefault<z.ZodNumber>;
|
|
313
230
|
pendingMethodMin: z.ZodDefault<z.ZodNumber>;
|
|
314
231
|
auditDays: z.ZodDefault<z.ZodNumber>;
|
|
315
|
-
},
|
|
316
|
-
accessTokenSec: number;
|
|
317
|
-
refreshTokenDays: number;
|
|
318
|
-
trustedDeviceDays: number;
|
|
319
|
-
challengeSec: number;
|
|
320
|
-
stepUpSec: number;
|
|
321
|
-
pendingMethodMin: number;
|
|
322
|
-
auditDays: number;
|
|
323
|
-
}, {
|
|
324
|
-
accessTokenSec?: number | undefined;
|
|
325
|
-
refreshTokenDays?: number | undefined;
|
|
326
|
-
trustedDeviceDays?: number | undefined;
|
|
327
|
-
challengeSec?: number | undefined;
|
|
328
|
-
stepUpSec?: number | undefined;
|
|
329
|
-
pendingMethodMin?: number | undefined;
|
|
330
|
-
auditDays?: number | undefined;
|
|
331
|
-
}>>;
|
|
332
|
-
/** Serve GET /auth/openapi.json (A.7 docs). */
|
|
232
|
+
}, z.core.$strip>>;
|
|
333
233
|
exposeDocs: z.ZodDefault<z.ZodBoolean>;
|
|
334
|
-
},
|
|
335
|
-
db: Db;
|
|
336
|
-
issuer: string;
|
|
337
|
-
jwtPrivateKey: string;
|
|
338
|
-
encryptionKey: string;
|
|
339
|
-
keyId: string;
|
|
340
|
-
userAdapter: UserAdapter;
|
|
341
|
-
smsProvider: SmsProvider;
|
|
342
|
-
collectionPrefix: string;
|
|
343
|
-
passwordlessLogin: boolean | ((input: {
|
|
344
|
-
username: string;
|
|
345
|
-
type?: string;
|
|
346
|
-
}) => boolean | Promise<boolean>);
|
|
347
|
-
twoStepEnabled: boolean | ((input: {
|
|
348
|
-
userId: string;
|
|
349
|
-
}) => boolean | Promise<boolean>);
|
|
350
|
-
twoStepDefault: boolean;
|
|
351
|
-
limits: {
|
|
352
|
-
loginMaxAttempts: number;
|
|
353
|
-
loginWindowMin: number;
|
|
354
|
-
lockMinutes: number;
|
|
355
|
-
smsResendSec: number;
|
|
356
|
-
smsMaxPerChallenge: number;
|
|
357
|
-
smsMaxPerUserHour: number;
|
|
358
|
-
mfaMaxAttempts: number;
|
|
359
|
-
maxMethods: number;
|
|
360
|
-
loginIpPerMin: number;
|
|
361
|
-
verifyIpPerMin: number;
|
|
362
|
-
stepUpIpPerMin: number;
|
|
363
|
-
};
|
|
364
|
-
rateLimits: boolean;
|
|
365
|
-
argon2: {
|
|
366
|
-
memoryKiB: number;
|
|
367
|
-
iterations: number;
|
|
368
|
-
parallelism: number;
|
|
369
|
-
};
|
|
370
|
-
cookies: {
|
|
371
|
-
path: string;
|
|
372
|
-
secure: boolean;
|
|
373
|
-
sameSite: "lax" | "strict" | "none";
|
|
374
|
-
domain?: string | undefined;
|
|
375
|
-
};
|
|
376
|
-
ttl: {
|
|
377
|
-
accessTokenSec: number;
|
|
378
|
-
refreshTokenDays: number;
|
|
379
|
-
trustedDeviceDays: number;
|
|
380
|
-
challengeSec: number;
|
|
381
|
-
stepUpSec: number;
|
|
382
|
-
pendingMethodMin: number;
|
|
383
|
-
auditDays: number;
|
|
384
|
-
};
|
|
385
|
-
exposeDocs: boolean;
|
|
386
|
-
emailProvider?: EmailProvider | undefined;
|
|
387
|
-
client?: MongoClient | undefined;
|
|
388
|
-
logger?: Logger | undefined;
|
|
389
|
-
hooks?: Hooks | undefined;
|
|
390
|
-
clock?: Clock | undefined;
|
|
391
|
-
passkeys?: {
|
|
392
|
-
rpID: string;
|
|
393
|
-
rpName: string;
|
|
394
|
-
origins: string[];
|
|
395
|
-
} | undefined;
|
|
396
|
-
}, {
|
|
397
|
-
db: Db;
|
|
398
|
-
issuer: string;
|
|
399
|
-
jwtPrivateKey: string;
|
|
400
|
-
encryptionKey: string;
|
|
401
|
-
userAdapter: UserAdapter;
|
|
402
|
-
smsProvider: SmsProvider;
|
|
403
|
-
keyId?: string | undefined;
|
|
404
|
-
emailProvider?: EmailProvider | undefined;
|
|
405
|
-
client?: MongoClient | undefined;
|
|
406
|
-
logger?: Logger | undefined;
|
|
407
|
-
hooks?: Hooks | undefined;
|
|
408
|
-
clock?: Clock | undefined;
|
|
409
|
-
collectionPrefix?: string | undefined;
|
|
410
|
-
passkeys?: {
|
|
411
|
-
rpID: string;
|
|
412
|
-
rpName: string;
|
|
413
|
-
origins: string[];
|
|
414
|
-
} | undefined;
|
|
415
|
-
passwordlessLogin?: boolean | ((input: {
|
|
416
|
-
username: string;
|
|
417
|
-
type?: string;
|
|
418
|
-
}) => boolean | Promise<boolean>) | undefined;
|
|
419
|
-
twoStepEnabled?: boolean | ((input: {
|
|
420
|
-
userId: string;
|
|
421
|
-
}) => boolean | Promise<boolean>) | undefined;
|
|
422
|
-
twoStepDefault?: boolean | undefined;
|
|
423
|
-
limits?: {
|
|
424
|
-
loginMaxAttempts?: number | undefined;
|
|
425
|
-
loginWindowMin?: number | undefined;
|
|
426
|
-
lockMinutes?: number | undefined;
|
|
427
|
-
smsResendSec?: number | undefined;
|
|
428
|
-
smsMaxPerChallenge?: number | undefined;
|
|
429
|
-
smsMaxPerUserHour?: number | undefined;
|
|
430
|
-
mfaMaxAttempts?: number | undefined;
|
|
431
|
-
maxMethods?: number | undefined;
|
|
432
|
-
loginIpPerMin?: number | undefined;
|
|
433
|
-
verifyIpPerMin?: number | undefined;
|
|
434
|
-
stepUpIpPerMin?: number | undefined;
|
|
435
|
-
} | undefined;
|
|
436
|
-
rateLimits?: boolean | undefined;
|
|
437
|
-
argon2?: {
|
|
438
|
-
memoryKiB?: number | undefined;
|
|
439
|
-
iterations?: number | undefined;
|
|
440
|
-
parallelism?: number | undefined;
|
|
441
|
-
} | undefined;
|
|
442
|
-
cookies?: {
|
|
443
|
-
path?: string | undefined;
|
|
444
|
-
secure?: boolean | undefined;
|
|
445
|
-
domain?: string | undefined;
|
|
446
|
-
sameSite?: "lax" | "strict" | "none" | undefined;
|
|
447
|
-
} | undefined;
|
|
448
|
-
ttl?: {
|
|
449
|
-
accessTokenSec?: number | undefined;
|
|
450
|
-
refreshTokenDays?: number | undefined;
|
|
451
|
-
trustedDeviceDays?: number | undefined;
|
|
452
|
-
challengeSec?: number | undefined;
|
|
453
|
-
stepUpSec?: number | undefined;
|
|
454
|
-
pendingMethodMin?: number | undefined;
|
|
455
|
-
auditDays?: number | undefined;
|
|
456
|
-
} | undefined;
|
|
457
|
-
exposeDocs?: boolean | undefined;
|
|
458
|
-
}>;
|
|
234
|
+
}, z.core.$strip>;
|
|
459
235
|
type AuthConfigInput = z.input<typeof configSchema>;
|
|
460
236
|
type AuthConfig = z.output<typeof configSchema> & {
|
|
461
237
|
clock: Clock;
|
package/dist/index.d.ts
CHANGED
|
@@ -161,150 +161,67 @@ interface Logger {
|
|
|
161
161
|
error: (obj: object, msg?: string) => void;
|
|
162
162
|
}
|
|
163
163
|
declare const configSchema: z.ZodObject<{
|
|
164
|
-
db: z.
|
|
164
|
+
db: z.ZodCustom<Db, Db>;
|
|
165
165
|
issuer: z.ZodString;
|
|
166
|
-
/** PEM PKCS8 private key (Ed25519 or RSA). Required, min 32 bytes. */
|
|
167
166
|
jwtPrivateKey: z.ZodString;
|
|
168
|
-
/** 32-byte AES key, raw string or base64. Required. */
|
|
169
167
|
encryptionKey: z.ZodString;
|
|
170
168
|
keyId: z.ZodDefault<z.ZodString>;
|
|
171
|
-
userAdapter: z.
|
|
172
|
-
smsProvider: z.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
hooks: z.ZodOptional<z.ZodType<Hooks, z.ZodTypeDef, Hooks>>;
|
|
179
|
-
clock: z.ZodOptional<z.ZodType<Clock, z.ZodTypeDef, Clock>>;
|
|
169
|
+
userAdapter: z.ZodCustom<UserAdapter, UserAdapter>;
|
|
170
|
+
smsProvider: z.ZodCustom<SmsProvider, SmsProvider>;
|
|
171
|
+
emailProvider: z.ZodOptional<z.ZodCustom<EmailProvider, EmailProvider>>;
|
|
172
|
+
client: z.ZodOptional<z.ZodCustom<MongoClient, MongoClient>>;
|
|
173
|
+
logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
|
|
174
|
+
hooks: z.ZodOptional<z.ZodCustom<Hooks, Hooks>>;
|
|
175
|
+
clock: z.ZodOptional<z.ZodCustom<Clock, Clock>>;
|
|
180
176
|
collectionPrefix: z.ZodDefault<z.ZodString>;
|
|
181
|
-
/**
|
|
182
|
-
* Passkeys (WebAuthn) as a second step. `rpID` is the site's domain (e.g. "childmatch.com",
|
|
183
|
-
* "localhost"); `origins` are the exact browser origins allowed (e.g. "https://app.childmatch.com").
|
|
184
|
-
* Omit to turn passkeys off.
|
|
185
|
-
*/
|
|
186
177
|
passkeys: z.ZodOptional<z.ZodObject<{
|
|
187
178
|
rpID: z.ZodString;
|
|
188
179
|
rpName: z.ZodString;
|
|
189
|
-
origins: z.ZodArray<z.ZodString
|
|
190
|
-
},
|
|
191
|
-
|
|
192
|
-
rpName: string;
|
|
193
|
-
origins: string[];
|
|
194
|
-
}, {
|
|
195
|
-
rpID: string;
|
|
196
|
-
rpName: string;
|
|
197
|
-
origins: string[];
|
|
198
|
-
}>>;
|
|
199
|
-
/**
|
|
200
|
-
* Allow POST /auth/login/start: sign in with the identifier and a verification method only
|
|
201
|
-
* (no password). Single-factor — enable only for apps that already sign in by code. Pass a
|
|
202
|
-
* function to allow it per request, e.g. only for `type: "badge"`.
|
|
203
|
-
*/
|
|
204
|
-
passwordlessLogin: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
|
|
180
|
+
origins: z.ZodArray<z.ZodString>;
|
|
181
|
+
}, z.core.$strip>>;
|
|
182
|
+
passwordlessLogin: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
205
183
|
username: string;
|
|
206
184
|
type?: string;
|
|
207
|
-
}) => boolean | Promise<boolean>,
|
|
185
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
208
186
|
username: string;
|
|
209
187
|
type?: string;
|
|
210
188
|
}) => boolean | Promise<boolean>>]>>;
|
|
211
|
-
|
|
212
|
-
* 2-Step Verification switch above each user's own choice. False: password sign-in never
|
|
213
|
-
* asks for a code and the two-step setting can't be turned on. Passwordless sign-in still
|
|
214
|
-
* sends a code — it's the only factor there. Pass a function to decide per user, e.g. from
|
|
215
|
-
* an organization setting.
|
|
216
|
-
*/
|
|
217
|
-
twoStepEnabled: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodType<(input: {
|
|
189
|
+
twoStepEnabled: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
218
190
|
userId: string;
|
|
219
|
-
}) => boolean | Promise<boolean>,
|
|
191
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
220
192
|
userId: string;
|
|
221
193
|
}) => boolean | Promise<boolean>>]>>;
|
|
222
|
-
/** 2-Step Verification state for users who have not chosen one yet. */
|
|
223
194
|
twoStepDefault: z.ZodDefault<z.ZodBoolean>;
|
|
224
|
-
limits: z.
|
|
225
|
-
/** Failed passwords before lockout (BR-2). */
|
|
195
|
+
limits: z.ZodPrefault<z.ZodObject<{
|
|
226
196
|
loginMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
227
|
-
/** Window for failed-login counting, minutes (BR-2). */
|
|
228
197
|
loginWindowMin: z.ZodDefault<z.ZodNumber>;
|
|
229
|
-
/** Lockout duration, minutes (BR-2, BR-9). */
|
|
230
198
|
lockMinutes: z.ZodDefault<z.ZodNumber>;
|
|
231
|
-
/** Min seconds between SMS sends on one challenge (BR-6). */
|
|
232
199
|
smsResendSec: z.ZodDefault<z.ZodNumber>;
|
|
233
|
-
/** Max SMS sends per challenge (BR-6). */
|
|
234
200
|
smsMaxPerChallenge: z.ZodDefault<z.ZodNumber>;
|
|
235
|
-
/** Max SMS sends per user per hour (BR-6). */
|
|
236
201
|
smsMaxPerUserHour: z.ZodDefault<z.ZodNumber>;
|
|
237
|
-
/** Wrong codes per challenge before lockout (BR-9). */
|
|
238
202
|
mfaMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
239
|
-
/** Max verification methods per user (BR-16). */
|
|
240
203
|
maxMethods: z.ZodDefault<z.ZodNumber>;
|
|
241
|
-
/** Per-IP login requests per minute (NFR-B4). */
|
|
242
204
|
loginIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
243
|
-
/** Per-IP MFA verify requests per minute (NFR-B4). */
|
|
244
205
|
verifyIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
245
|
-
/** Per-IP step-up requests per minute (NFR-B4). */
|
|
246
206
|
stepUpIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
247
|
-
},
|
|
248
|
-
loginMaxAttempts: number;
|
|
249
|
-
loginWindowMin: number;
|
|
250
|
-
lockMinutes: number;
|
|
251
|
-
smsResendSec: number;
|
|
252
|
-
smsMaxPerChallenge: number;
|
|
253
|
-
smsMaxPerUserHour: number;
|
|
254
|
-
mfaMaxAttempts: number;
|
|
255
|
-
maxMethods: number;
|
|
256
|
-
loginIpPerMin: number;
|
|
257
|
-
verifyIpPerMin: number;
|
|
258
|
-
stepUpIpPerMin: number;
|
|
259
|
-
}, {
|
|
260
|
-
loginMaxAttempts?: number | undefined;
|
|
261
|
-
loginWindowMin?: number | undefined;
|
|
262
|
-
lockMinutes?: number | undefined;
|
|
263
|
-
smsResendSec?: number | undefined;
|
|
264
|
-
smsMaxPerChallenge?: number | undefined;
|
|
265
|
-
smsMaxPerUserHour?: number | undefined;
|
|
266
|
-
mfaMaxAttempts?: number | undefined;
|
|
267
|
-
maxMethods?: number | undefined;
|
|
268
|
-
loginIpPerMin?: number | undefined;
|
|
269
|
-
verifyIpPerMin?: number | undefined;
|
|
270
|
-
stepUpIpPerMin?: number | undefined;
|
|
271
|
-
}>>;
|
|
272
|
-
/**
|
|
273
|
-
* Set false to turn off every RATE_LIMITED check: the per-IP limits on login / code
|
|
274
|
-
* verify / send / step-up and the code-send cooldown and caps. Account lockouts after
|
|
275
|
-
* failed passwords or codes (LOCKED) still apply.
|
|
276
|
-
*/
|
|
207
|
+
}, z.core.$strip>>;
|
|
277
208
|
rateLimits: z.ZodDefault<z.ZodBoolean>;
|
|
278
|
-
argon2: z.
|
|
209
|
+
argon2: z.ZodPrefault<z.ZodObject<{
|
|
279
210
|
memoryKiB: z.ZodDefault<z.ZodNumber>;
|
|
280
211
|
iterations: z.ZodDefault<z.ZodNumber>;
|
|
281
212
|
parallelism: z.ZodDefault<z.ZodNumber>;
|
|
282
|
-
},
|
|
283
|
-
|
|
284
|
-
iterations: number;
|
|
285
|
-
parallelism: number;
|
|
286
|
-
}, {
|
|
287
|
-
memoryKiB?: number | undefined;
|
|
288
|
-
iterations?: number | undefined;
|
|
289
|
-
parallelism?: number | undefined;
|
|
290
|
-
}>>;
|
|
291
|
-
cookies: z.ZodDefault<z.ZodObject<{
|
|
213
|
+
}, z.core.$strip>>;
|
|
214
|
+
cookies: z.ZodPrefault<z.ZodObject<{
|
|
292
215
|
secure: z.ZodDefault<z.ZodBoolean>;
|
|
293
216
|
domain: z.ZodOptional<z.ZodString>;
|
|
294
|
-
sameSite: z.ZodDefault<z.ZodEnum<
|
|
217
|
+
sameSite: z.ZodDefault<z.ZodEnum<{
|
|
218
|
+
lax: "lax";
|
|
219
|
+
strict: "strict";
|
|
220
|
+
none: "none";
|
|
221
|
+
}>>;
|
|
295
222
|
path: z.ZodDefault<z.ZodString>;
|
|
296
|
-
},
|
|
297
|
-
|
|
298
|
-
secure: boolean;
|
|
299
|
-
sameSite: "lax" | "strict" | "none";
|
|
300
|
-
domain?: string | undefined;
|
|
301
|
-
}, {
|
|
302
|
-
path?: string | undefined;
|
|
303
|
-
secure?: boolean | undefined;
|
|
304
|
-
domain?: string | undefined;
|
|
305
|
-
sameSite?: "lax" | "strict" | "none" | undefined;
|
|
306
|
-
}>>;
|
|
307
|
-
ttl: z.ZodDefault<z.ZodObject<{
|
|
223
|
+
}, z.core.$strip>>;
|
|
224
|
+
ttl: z.ZodPrefault<z.ZodObject<{
|
|
308
225
|
accessTokenSec: z.ZodDefault<z.ZodNumber>;
|
|
309
226
|
refreshTokenDays: z.ZodDefault<z.ZodNumber>;
|
|
310
227
|
trustedDeviceDays: z.ZodDefault<z.ZodNumber>;
|
|
@@ -312,150 +229,9 @@ declare const configSchema: z.ZodObject<{
|
|
|
312
229
|
stepUpSec: z.ZodDefault<z.ZodNumber>;
|
|
313
230
|
pendingMethodMin: z.ZodDefault<z.ZodNumber>;
|
|
314
231
|
auditDays: z.ZodDefault<z.ZodNumber>;
|
|
315
|
-
},
|
|
316
|
-
accessTokenSec: number;
|
|
317
|
-
refreshTokenDays: number;
|
|
318
|
-
trustedDeviceDays: number;
|
|
319
|
-
challengeSec: number;
|
|
320
|
-
stepUpSec: number;
|
|
321
|
-
pendingMethodMin: number;
|
|
322
|
-
auditDays: number;
|
|
323
|
-
}, {
|
|
324
|
-
accessTokenSec?: number | undefined;
|
|
325
|
-
refreshTokenDays?: number | undefined;
|
|
326
|
-
trustedDeviceDays?: number | undefined;
|
|
327
|
-
challengeSec?: number | undefined;
|
|
328
|
-
stepUpSec?: number | undefined;
|
|
329
|
-
pendingMethodMin?: number | undefined;
|
|
330
|
-
auditDays?: number | undefined;
|
|
331
|
-
}>>;
|
|
332
|
-
/** Serve GET /auth/openapi.json (A.7 docs). */
|
|
232
|
+
}, z.core.$strip>>;
|
|
333
233
|
exposeDocs: z.ZodDefault<z.ZodBoolean>;
|
|
334
|
-
},
|
|
335
|
-
db: Db;
|
|
336
|
-
issuer: string;
|
|
337
|
-
jwtPrivateKey: string;
|
|
338
|
-
encryptionKey: string;
|
|
339
|
-
keyId: string;
|
|
340
|
-
userAdapter: UserAdapter;
|
|
341
|
-
smsProvider: SmsProvider;
|
|
342
|
-
collectionPrefix: string;
|
|
343
|
-
passwordlessLogin: boolean | ((input: {
|
|
344
|
-
username: string;
|
|
345
|
-
type?: string;
|
|
346
|
-
}) => boolean | Promise<boolean>);
|
|
347
|
-
twoStepEnabled: boolean | ((input: {
|
|
348
|
-
userId: string;
|
|
349
|
-
}) => boolean | Promise<boolean>);
|
|
350
|
-
twoStepDefault: boolean;
|
|
351
|
-
limits: {
|
|
352
|
-
loginMaxAttempts: number;
|
|
353
|
-
loginWindowMin: number;
|
|
354
|
-
lockMinutes: number;
|
|
355
|
-
smsResendSec: number;
|
|
356
|
-
smsMaxPerChallenge: number;
|
|
357
|
-
smsMaxPerUserHour: number;
|
|
358
|
-
mfaMaxAttempts: number;
|
|
359
|
-
maxMethods: number;
|
|
360
|
-
loginIpPerMin: number;
|
|
361
|
-
verifyIpPerMin: number;
|
|
362
|
-
stepUpIpPerMin: number;
|
|
363
|
-
};
|
|
364
|
-
rateLimits: boolean;
|
|
365
|
-
argon2: {
|
|
366
|
-
memoryKiB: number;
|
|
367
|
-
iterations: number;
|
|
368
|
-
parallelism: number;
|
|
369
|
-
};
|
|
370
|
-
cookies: {
|
|
371
|
-
path: string;
|
|
372
|
-
secure: boolean;
|
|
373
|
-
sameSite: "lax" | "strict" | "none";
|
|
374
|
-
domain?: string | undefined;
|
|
375
|
-
};
|
|
376
|
-
ttl: {
|
|
377
|
-
accessTokenSec: number;
|
|
378
|
-
refreshTokenDays: number;
|
|
379
|
-
trustedDeviceDays: number;
|
|
380
|
-
challengeSec: number;
|
|
381
|
-
stepUpSec: number;
|
|
382
|
-
pendingMethodMin: number;
|
|
383
|
-
auditDays: number;
|
|
384
|
-
};
|
|
385
|
-
exposeDocs: boolean;
|
|
386
|
-
emailProvider?: EmailProvider | undefined;
|
|
387
|
-
client?: MongoClient | undefined;
|
|
388
|
-
logger?: Logger | undefined;
|
|
389
|
-
hooks?: Hooks | undefined;
|
|
390
|
-
clock?: Clock | undefined;
|
|
391
|
-
passkeys?: {
|
|
392
|
-
rpID: string;
|
|
393
|
-
rpName: string;
|
|
394
|
-
origins: string[];
|
|
395
|
-
} | undefined;
|
|
396
|
-
}, {
|
|
397
|
-
db: Db;
|
|
398
|
-
issuer: string;
|
|
399
|
-
jwtPrivateKey: string;
|
|
400
|
-
encryptionKey: string;
|
|
401
|
-
userAdapter: UserAdapter;
|
|
402
|
-
smsProvider: SmsProvider;
|
|
403
|
-
keyId?: string | undefined;
|
|
404
|
-
emailProvider?: EmailProvider | undefined;
|
|
405
|
-
client?: MongoClient | undefined;
|
|
406
|
-
logger?: Logger | undefined;
|
|
407
|
-
hooks?: Hooks | undefined;
|
|
408
|
-
clock?: Clock | undefined;
|
|
409
|
-
collectionPrefix?: string | undefined;
|
|
410
|
-
passkeys?: {
|
|
411
|
-
rpID: string;
|
|
412
|
-
rpName: string;
|
|
413
|
-
origins: string[];
|
|
414
|
-
} | undefined;
|
|
415
|
-
passwordlessLogin?: boolean | ((input: {
|
|
416
|
-
username: string;
|
|
417
|
-
type?: string;
|
|
418
|
-
}) => boolean | Promise<boolean>) | undefined;
|
|
419
|
-
twoStepEnabled?: boolean | ((input: {
|
|
420
|
-
userId: string;
|
|
421
|
-
}) => boolean | Promise<boolean>) | undefined;
|
|
422
|
-
twoStepDefault?: boolean | undefined;
|
|
423
|
-
limits?: {
|
|
424
|
-
loginMaxAttempts?: number | undefined;
|
|
425
|
-
loginWindowMin?: number | undefined;
|
|
426
|
-
lockMinutes?: number | undefined;
|
|
427
|
-
smsResendSec?: number | undefined;
|
|
428
|
-
smsMaxPerChallenge?: number | undefined;
|
|
429
|
-
smsMaxPerUserHour?: number | undefined;
|
|
430
|
-
mfaMaxAttempts?: number | undefined;
|
|
431
|
-
maxMethods?: number | undefined;
|
|
432
|
-
loginIpPerMin?: number | undefined;
|
|
433
|
-
verifyIpPerMin?: number | undefined;
|
|
434
|
-
stepUpIpPerMin?: number | undefined;
|
|
435
|
-
} | undefined;
|
|
436
|
-
rateLimits?: boolean | undefined;
|
|
437
|
-
argon2?: {
|
|
438
|
-
memoryKiB?: number | undefined;
|
|
439
|
-
iterations?: number | undefined;
|
|
440
|
-
parallelism?: number | undefined;
|
|
441
|
-
} | undefined;
|
|
442
|
-
cookies?: {
|
|
443
|
-
path?: string | undefined;
|
|
444
|
-
secure?: boolean | undefined;
|
|
445
|
-
domain?: string | undefined;
|
|
446
|
-
sameSite?: "lax" | "strict" | "none" | undefined;
|
|
447
|
-
} | undefined;
|
|
448
|
-
ttl?: {
|
|
449
|
-
accessTokenSec?: number | undefined;
|
|
450
|
-
refreshTokenDays?: number | undefined;
|
|
451
|
-
trustedDeviceDays?: number | undefined;
|
|
452
|
-
challengeSec?: number | undefined;
|
|
453
|
-
stepUpSec?: number | undefined;
|
|
454
|
-
pendingMethodMin?: number | undefined;
|
|
455
|
-
auditDays?: number | undefined;
|
|
456
|
-
} | undefined;
|
|
457
|
-
exposeDocs?: boolean | undefined;
|
|
458
|
-
}>;
|
|
234
|
+
}, z.core.$strip>;
|
|
459
235
|
type AuthConfigInput = z.input<typeof configSchema>;
|
|
460
236
|
type AuthConfig = z.output<typeof configSchema> & {
|
|
461
237
|
clock: Clock;
|
package/dist/index.js
CHANGED
|
@@ -111,16 +111,16 @@ var configSchema = z.object({
|
|
|
111
111
|
]).default(true),
|
|
112
112
|
/** 2-Step Verification state for users who have not chosen one yet. */
|
|
113
113
|
twoStepDefault: z.boolean().default(false),
|
|
114
|
-
limits: limitSchema.
|
|
114
|
+
limits: limitSchema.prefault({}),
|
|
115
115
|
/**
|
|
116
116
|
* Set false to turn off every RATE_LIMITED check: the per-IP limits on login / code
|
|
117
117
|
* verify / send / step-up and the code-send cooldown and caps. Account lockouts after
|
|
118
118
|
* failed passwords or codes (LOCKED) still apply.
|
|
119
119
|
*/
|
|
120
120
|
rateLimits: z.boolean().default(true),
|
|
121
|
-
argon2: argon2Schema.
|
|
122
|
-
cookies: cookieSchema.
|
|
123
|
-
ttl: ttlSchema.
|
|
121
|
+
argon2: argon2Schema.prefault({}),
|
|
122
|
+
cookies: cookieSchema.prefault({}),
|
|
123
|
+
ttl: ttlSchema.prefault({}),
|
|
124
124
|
/** Serve GET /auth/openapi.json (A.7 docs). */
|
|
125
125
|
exposeDocs: z.boolean().default(false)
|
|
126
126
|
});
|