@cairs-npm/express-auth-2fa 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/index.cjs +124 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -252
- package/dist/index.d.ts +31 -252
- package/dist/index.js +126 -60
- package/dist/index.js.map +1 -1
- package/package.json +7 -5
package/dist/index.d.cts
CHANGED
|
@@ -35,6 +35,9 @@ interface MethodDoc {
|
|
|
35
35
|
lastUsedStep?: number;
|
|
36
36
|
/** SMS confirm-code hash while pending. */
|
|
37
37
|
pendingCodeHash?: string;
|
|
38
|
+
/** When the pending SMS code was last sent, and how many were sent (resend cooldown + cap). */
|
|
39
|
+
pendingCodeSentAt?: Date;
|
|
40
|
+
pendingSendCount?: number;
|
|
38
41
|
/** Expiry for pending methods (TTL). */
|
|
39
42
|
pendingExpiresAt?: Date;
|
|
40
43
|
/** Passkey: WebAuthn credential id (base64url). */
|
|
@@ -161,150 +164,67 @@ interface Logger {
|
|
|
161
164
|
error: (obj: object, msg?: string) => void;
|
|
162
165
|
}
|
|
163
166
|
declare const configSchema: z.ZodObject<{
|
|
164
|
-
db: z.
|
|
167
|
+
db: z.ZodCustom<Db, Db>;
|
|
165
168
|
issuer: z.ZodString;
|
|
166
|
-
/** PEM PKCS8 private key (Ed25519 or RSA). Required, min 32 bytes. */
|
|
167
169
|
jwtPrivateKey: z.ZodString;
|
|
168
|
-
/** 32-byte AES key, raw string or base64. Required. */
|
|
169
170
|
encryptionKey: z.ZodString;
|
|
170
171
|
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>>;
|
|
172
|
+
userAdapter: z.ZodCustom<UserAdapter, UserAdapter>;
|
|
173
|
+
smsProvider: z.ZodCustom<SmsProvider, SmsProvider>;
|
|
174
|
+
emailProvider: z.ZodOptional<z.ZodCustom<EmailProvider, EmailProvider>>;
|
|
175
|
+
client: z.ZodOptional<z.ZodCustom<MongoClient, MongoClient>>;
|
|
176
|
+
logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
|
|
177
|
+
hooks: z.ZodOptional<z.ZodCustom<Hooks, Hooks>>;
|
|
178
|
+
clock: z.ZodOptional<z.ZodCustom<Clock, Clock>>;
|
|
180
179
|
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
180
|
passkeys: z.ZodOptional<z.ZodObject<{
|
|
187
181
|
rpID: z.ZodString;
|
|
188
182
|
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: {
|
|
183
|
+
origins: z.ZodArray<z.ZodString>;
|
|
184
|
+
}, z.core.$strip>>;
|
|
185
|
+
passwordlessLogin: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
205
186
|
username: string;
|
|
206
187
|
type?: string;
|
|
207
|
-
}) => boolean | Promise<boolean>,
|
|
188
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
208
189
|
username: string;
|
|
209
190
|
type?: string;
|
|
210
191
|
}) => 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: {
|
|
192
|
+
twoStepEnabled: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
218
193
|
userId: string;
|
|
219
|
-
}) => boolean | Promise<boolean>,
|
|
194
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
220
195
|
userId: string;
|
|
221
196
|
}) => boolean | Promise<boolean>>]>>;
|
|
222
|
-
/** 2-Step Verification state for users who have not chosen one yet. */
|
|
223
197
|
twoStepDefault: z.ZodDefault<z.ZodBoolean>;
|
|
224
|
-
limits: z.
|
|
225
|
-
/** Failed passwords before lockout (BR-2). */
|
|
198
|
+
limits: z.ZodPrefault<z.ZodObject<{
|
|
226
199
|
loginMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
227
|
-
/** Window for failed-login counting, minutes (BR-2). */
|
|
228
200
|
loginWindowMin: z.ZodDefault<z.ZodNumber>;
|
|
229
|
-
/** Lockout duration, minutes (BR-2, BR-9). */
|
|
230
201
|
lockMinutes: z.ZodDefault<z.ZodNumber>;
|
|
231
|
-
/** Min seconds between SMS sends on one challenge (BR-6). */
|
|
232
202
|
smsResendSec: z.ZodDefault<z.ZodNumber>;
|
|
233
|
-
/** Max SMS sends per challenge (BR-6). */
|
|
234
203
|
smsMaxPerChallenge: z.ZodDefault<z.ZodNumber>;
|
|
235
|
-
/** Max SMS sends per user per hour (BR-6). */
|
|
236
204
|
smsMaxPerUserHour: z.ZodDefault<z.ZodNumber>;
|
|
237
|
-
/** Wrong codes per challenge before lockout (BR-9). */
|
|
238
205
|
mfaMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
239
|
-
/** Max verification methods per user (BR-16). */
|
|
240
206
|
maxMethods: z.ZodDefault<z.ZodNumber>;
|
|
241
|
-
/** Per-IP login requests per minute (NFR-B4). */
|
|
242
207
|
loginIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
243
|
-
/** Per-IP MFA verify requests per minute (NFR-B4). */
|
|
244
208
|
verifyIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
245
|
-
/** Per-IP step-up requests per minute (NFR-B4). */
|
|
246
209
|
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
|
-
*/
|
|
210
|
+
}, z.core.$strip>>;
|
|
277
211
|
rateLimits: z.ZodDefault<z.ZodBoolean>;
|
|
278
|
-
argon2: z.
|
|
212
|
+
argon2: z.ZodPrefault<z.ZodObject<{
|
|
279
213
|
memoryKiB: z.ZodDefault<z.ZodNumber>;
|
|
280
214
|
iterations: z.ZodDefault<z.ZodNumber>;
|
|
281
215
|
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<{
|
|
216
|
+
}, z.core.$strip>>;
|
|
217
|
+
cookies: z.ZodPrefault<z.ZodObject<{
|
|
292
218
|
secure: z.ZodDefault<z.ZodBoolean>;
|
|
293
219
|
domain: z.ZodOptional<z.ZodString>;
|
|
294
|
-
sameSite: z.ZodDefault<z.ZodEnum<
|
|
220
|
+
sameSite: z.ZodDefault<z.ZodEnum<{
|
|
221
|
+
lax: "lax";
|
|
222
|
+
strict: "strict";
|
|
223
|
+
none: "none";
|
|
224
|
+
}>>;
|
|
295
225
|
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<{
|
|
226
|
+
}, z.core.$strip>>;
|
|
227
|
+
ttl: z.ZodPrefault<z.ZodObject<{
|
|
308
228
|
accessTokenSec: z.ZodDefault<z.ZodNumber>;
|
|
309
229
|
refreshTokenDays: z.ZodDefault<z.ZodNumber>;
|
|
310
230
|
trustedDeviceDays: z.ZodDefault<z.ZodNumber>;
|
|
@@ -312,150 +232,9 @@ declare const configSchema: z.ZodObject<{
|
|
|
312
232
|
stepUpSec: z.ZodDefault<z.ZodNumber>;
|
|
313
233
|
pendingMethodMin: z.ZodDefault<z.ZodNumber>;
|
|
314
234
|
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). */
|
|
235
|
+
}, z.core.$strip>>;
|
|
333
236
|
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
|
-
}>;
|
|
237
|
+
}, z.core.$strip>;
|
|
459
238
|
type AuthConfigInput = z.input<typeof configSchema>;
|
|
460
239
|
type AuthConfig = z.output<typeof configSchema> & {
|
|
461
240
|
clock: Clock;
|
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,9 @@ interface MethodDoc {
|
|
|
35
35
|
lastUsedStep?: number;
|
|
36
36
|
/** SMS confirm-code hash while pending. */
|
|
37
37
|
pendingCodeHash?: string;
|
|
38
|
+
/** When the pending SMS code was last sent, and how many were sent (resend cooldown + cap). */
|
|
39
|
+
pendingCodeSentAt?: Date;
|
|
40
|
+
pendingSendCount?: number;
|
|
38
41
|
/** Expiry for pending methods (TTL). */
|
|
39
42
|
pendingExpiresAt?: Date;
|
|
40
43
|
/** Passkey: WebAuthn credential id (base64url). */
|
|
@@ -161,150 +164,67 @@ interface Logger {
|
|
|
161
164
|
error: (obj: object, msg?: string) => void;
|
|
162
165
|
}
|
|
163
166
|
declare const configSchema: z.ZodObject<{
|
|
164
|
-
db: z.
|
|
167
|
+
db: z.ZodCustom<Db, Db>;
|
|
165
168
|
issuer: z.ZodString;
|
|
166
|
-
/** PEM PKCS8 private key (Ed25519 or RSA). Required, min 32 bytes. */
|
|
167
169
|
jwtPrivateKey: z.ZodString;
|
|
168
|
-
/** 32-byte AES key, raw string or base64. Required. */
|
|
169
170
|
encryptionKey: z.ZodString;
|
|
170
171
|
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>>;
|
|
172
|
+
userAdapter: z.ZodCustom<UserAdapter, UserAdapter>;
|
|
173
|
+
smsProvider: z.ZodCustom<SmsProvider, SmsProvider>;
|
|
174
|
+
emailProvider: z.ZodOptional<z.ZodCustom<EmailProvider, EmailProvider>>;
|
|
175
|
+
client: z.ZodOptional<z.ZodCustom<MongoClient, MongoClient>>;
|
|
176
|
+
logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
|
|
177
|
+
hooks: z.ZodOptional<z.ZodCustom<Hooks, Hooks>>;
|
|
178
|
+
clock: z.ZodOptional<z.ZodCustom<Clock, Clock>>;
|
|
180
179
|
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
180
|
passkeys: z.ZodOptional<z.ZodObject<{
|
|
187
181
|
rpID: z.ZodString;
|
|
188
182
|
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: {
|
|
183
|
+
origins: z.ZodArray<z.ZodString>;
|
|
184
|
+
}, z.core.$strip>>;
|
|
185
|
+
passwordlessLogin: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
205
186
|
username: string;
|
|
206
187
|
type?: string;
|
|
207
|
-
}) => boolean | Promise<boolean>,
|
|
188
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
208
189
|
username: string;
|
|
209
190
|
type?: string;
|
|
210
191
|
}) => 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: {
|
|
192
|
+
twoStepEnabled: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<(input: {
|
|
218
193
|
userId: string;
|
|
219
|
-
}) => boolean | Promise<boolean>,
|
|
194
|
+
}) => boolean | Promise<boolean>, (input: {
|
|
220
195
|
userId: string;
|
|
221
196
|
}) => boolean | Promise<boolean>>]>>;
|
|
222
|
-
/** 2-Step Verification state for users who have not chosen one yet. */
|
|
223
197
|
twoStepDefault: z.ZodDefault<z.ZodBoolean>;
|
|
224
|
-
limits: z.
|
|
225
|
-
/** Failed passwords before lockout (BR-2). */
|
|
198
|
+
limits: z.ZodPrefault<z.ZodObject<{
|
|
226
199
|
loginMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
227
|
-
/** Window for failed-login counting, minutes (BR-2). */
|
|
228
200
|
loginWindowMin: z.ZodDefault<z.ZodNumber>;
|
|
229
|
-
/** Lockout duration, minutes (BR-2, BR-9). */
|
|
230
201
|
lockMinutes: z.ZodDefault<z.ZodNumber>;
|
|
231
|
-
/** Min seconds between SMS sends on one challenge (BR-6). */
|
|
232
202
|
smsResendSec: z.ZodDefault<z.ZodNumber>;
|
|
233
|
-
/** Max SMS sends per challenge (BR-6). */
|
|
234
203
|
smsMaxPerChallenge: z.ZodDefault<z.ZodNumber>;
|
|
235
|
-
/** Max SMS sends per user per hour (BR-6). */
|
|
236
204
|
smsMaxPerUserHour: z.ZodDefault<z.ZodNumber>;
|
|
237
|
-
/** Wrong codes per challenge before lockout (BR-9). */
|
|
238
205
|
mfaMaxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
239
|
-
/** Max verification methods per user (BR-16). */
|
|
240
206
|
maxMethods: z.ZodDefault<z.ZodNumber>;
|
|
241
|
-
/** Per-IP login requests per minute (NFR-B4). */
|
|
242
207
|
loginIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
243
|
-
/** Per-IP MFA verify requests per minute (NFR-B4). */
|
|
244
208
|
verifyIpPerMin: z.ZodDefault<z.ZodNumber>;
|
|
245
|
-
/** Per-IP step-up requests per minute (NFR-B4). */
|
|
246
209
|
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
|
-
*/
|
|
210
|
+
}, z.core.$strip>>;
|
|
277
211
|
rateLimits: z.ZodDefault<z.ZodBoolean>;
|
|
278
|
-
argon2: z.
|
|
212
|
+
argon2: z.ZodPrefault<z.ZodObject<{
|
|
279
213
|
memoryKiB: z.ZodDefault<z.ZodNumber>;
|
|
280
214
|
iterations: z.ZodDefault<z.ZodNumber>;
|
|
281
215
|
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<{
|
|
216
|
+
}, z.core.$strip>>;
|
|
217
|
+
cookies: z.ZodPrefault<z.ZodObject<{
|
|
292
218
|
secure: z.ZodDefault<z.ZodBoolean>;
|
|
293
219
|
domain: z.ZodOptional<z.ZodString>;
|
|
294
|
-
sameSite: z.ZodDefault<z.ZodEnum<
|
|
220
|
+
sameSite: z.ZodDefault<z.ZodEnum<{
|
|
221
|
+
lax: "lax";
|
|
222
|
+
strict: "strict";
|
|
223
|
+
none: "none";
|
|
224
|
+
}>>;
|
|
295
225
|
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<{
|
|
226
|
+
}, z.core.$strip>>;
|
|
227
|
+
ttl: z.ZodPrefault<z.ZodObject<{
|
|
308
228
|
accessTokenSec: z.ZodDefault<z.ZodNumber>;
|
|
309
229
|
refreshTokenDays: z.ZodDefault<z.ZodNumber>;
|
|
310
230
|
trustedDeviceDays: z.ZodDefault<z.ZodNumber>;
|
|
@@ -312,150 +232,9 @@ declare const configSchema: z.ZodObject<{
|
|
|
312
232
|
stepUpSec: z.ZodDefault<z.ZodNumber>;
|
|
313
233
|
pendingMethodMin: z.ZodDefault<z.ZodNumber>;
|
|
314
234
|
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). */
|
|
235
|
+
}, z.core.$strip>>;
|
|
333
236
|
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
|
-
}>;
|
|
237
|
+
}, z.core.$strip>;
|
|
459
238
|
type AuthConfigInput = z.input<typeof configSchema>;
|
|
460
239
|
type AuthConfig = z.output<typeof configSchema> & {
|
|
461
240
|
clock: Clock;
|