@robelest/convex-auth 0.0.2-preview.2 → 0.0.3-preview

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/dist/bin.cjs +467 -64
  2. package/dist/client/index.d.ts +127 -0
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +424 -1
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/component/_generated/api.d.ts +56 -1
  7. package/dist/component/_generated/api.d.ts.map +1 -1
  8. package/dist/component/_generated/api.js.map +1 -1
  9. package/dist/component/_generated/component.d.ts +141 -3
  10. package/dist/component/_generated/component.d.ts.map +1 -1
  11. package/dist/component/convex.config.d.ts.map +1 -1
  12. package/dist/component/convex.config.js +2 -0
  13. package/dist/component/convex.config.js.map +1 -1
  14. package/dist/component/index.d.ts +5 -4
  15. package/dist/component/index.d.ts.map +1 -1
  16. package/dist/component/index.js +4 -3
  17. package/dist/component/index.js.map +1 -1
  18. package/dist/component/portalBridge.d.ts +80 -0
  19. package/dist/component/portalBridge.d.ts.map +1 -0
  20. package/dist/component/portalBridge.js +102 -0
  21. package/dist/component/portalBridge.js.map +1 -0
  22. package/dist/component/public.d.ts +353 -9
  23. package/dist/component/public.d.ts.map +1 -1
  24. package/dist/component/public.js +328 -33
  25. package/dist/component/public.js.map +1 -1
  26. package/dist/component/schema.d.ts +168 -9
  27. package/dist/component/schema.d.ts.map +1 -1
  28. package/dist/component/schema.js +113 -7
  29. package/dist/component/schema.js.map +1 -1
  30. package/dist/providers/passkey.d.ts +20 -0
  31. package/dist/providers/passkey.d.ts.map +1 -0
  32. package/dist/providers/passkey.js +32 -0
  33. package/dist/providers/passkey.js.map +1 -0
  34. package/dist/providers/totp.d.ts +14 -0
  35. package/dist/providers/totp.d.ts.map +1 -0
  36. package/dist/providers/totp.js +23 -0
  37. package/dist/providers/totp.js.map +1 -0
  38. package/dist/server/convex-auth.d.ts +296 -0
  39. package/dist/server/convex-auth.d.ts.map +1 -0
  40. package/dist/server/convex-auth.js +480 -0
  41. package/dist/server/convex-auth.js.map +1 -0
  42. package/dist/server/email-templates.d.ts +18 -0
  43. package/dist/server/email-templates.d.ts.map +1 -0
  44. package/dist/server/email-templates.js +74 -0
  45. package/dist/server/email-templates.js.map +1 -0
  46. package/dist/server/implementation/apiKey.d.ts +74 -0
  47. package/dist/server/implementation/apiKey.d.ts.map +1 -0
  48. package/dist/server/implementation/apiKey.js +140 -0
  49. package/dist/server/implementation/apiKey.js.map +1 -0
  50. package/dist/server/implementation/index.d.ts +169 -7
  51. package/dist/server/implementation/index.d.ts.map +1 -1
  52. package/dist/server/implementation/index.js +220 -5
  53. package/dist/server/implementation/index.js.map +1 -1
  54. package/dist/server/implementation/passkey.d.ts +33 -0
  55. package/dist/server/implementation/passkey.d.ts.map +1 -0
  56. package/dist/server/implementation/passkey.js +450 -0
  57. package/dist/server/implementation/passkey.js.map +1 -0
  58. package/dist/server/implementation/redirects.d.ts.map +1 -1
  59. package/dist/server/implementation/redirects.js +4 -9
  60. package/dist/server/implementation/redirects.js.map +1 -1
  61. package/dist/server/implementation/signIn.d.ts +13 -0
  62. package/dist/server/implementation/signIn.d.ts.map +1 -1
  63. package/dist/server/implementation/signIn.js +29 -15
  64. package/dist/server/implementation/signIn.js.map +1 -1
  65. package/dist/server/implementation/totp.d.ts +40 -0
  66. package/dist/server/implementation/totp.d.ts.map +1 -0
  67. package/dist/server/implementation/totp.js +211 -0
  68. package/dist/server/implementation/totp.js.map +1 -0
  69. package/dist/server/index.d.ts +26 -2
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +63 -16
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/server/portal-email.d.ts +19 -0
  74. package/dist/server/portal-email.d.ts.map +1 -0
  75. package/dist/server/portal-email.js +89 -0
  76. package/dist/server/portal-email.js.map +1 -0
  77. package/dist/server/provider_utils.d.ts +3 -1
  78. package/dist/server/provider_utils.d.ts.map +1 -1
  79. package/dist/server/provider_utils.js +39 -1
  80. package/dist/server/provider_utils.js.map +1 -1
  81. package/dist/server/types.d.ts +263 -4
  82. package/dist/server/types.d.ts.map +1 -1
  83. package/dist/server/version.d.ts +2 -0
  84. package/dist/server/version.d.ts.map +1 -0
  85. package/dist/server/version.js +3 -0
  86. package/dist/server/version.js.map +1 -0
  87. package/package.json +7 -3
  88. package/src/cli/index.ts +49 -7
  89. package/src/cli/portal-link.ts +112 -0
  90. package/src/cli/portal-upload.ts +411 -0
  91. package/src/cli/utils.ts +248 -0
  92. package/src/client/index.ts +489 -1
  93. package/src/component/_generated/api.ts +72 -1
  94. package/src/component/_generated/component.ts +241 -4
  95. package/src/component/convex.config.ts +3 -0
  96. package/src/component/index.ts +8 -3
  97. package/src/component/portalBridge.ts +116 -0
  98. package/src/component/public.ts +373 -37
  99. package/src/component/schema.ts +122 -7
  100. package/src/providers/passkey.ts +35 -0
  101. package/src/providers/totp.ts +26 -0
  102. package/src/server/convex-auth.ts +602 -0
  103. package/src/server/email-templates.ts +77 -0
  104. package/src/server/implementation/apiKey.ts +185 -0
  105. package/src/server/implementation/index.ts +301 -8
  106. package/src/server/implementation/passkey.ts +650 -0
  107. package/src/server/implementation/redirects.ts +4 -11
  108. package/src/server/implementation/signIn.ts +41 -13
  109. package/src/server/implementation/totp.ts +366 -0
  110. package/src/server/index.ts +98 -34
  111. package/src/server/portal-email.ts +95 -0
  112. package/src/server/provider_utils.ts +42 -1
  113. package/src/server/types.ts +285 -4
  114. package/src/server/version.ts +2 -0
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Server-side WebAuthn ceremony logic for passkey authentication.
3
+ *
4
+ * Handles the four phases of the WebAuthn flow:
5
+ * 1. register-options — generate PublicKeyCredentialCreationOptions
6
+ * 2. register-verify — verify attestation and store credential
7
+ * 3. auth-options — generate PublicKeyCredentialRequestOptions
8
+ * 4. auth-verify — verify assertion signature and sign in
9
+ *
10
+ * Uses `@oslojs/webauthn` for attestation/assertion parsing and
11
+ * `@oslojs/crypto` for signature verification.
12
+ */
13
+ import { parseAttestationObject, parseClientDataJSON, parseAuthenticatorData, createAssertionSignatureMessage, ClientDataType, coseAlgorithmES256, coseAlgorithmRS256, COSEKeyType, } from "@oslojs/webauthn";
14
+ import { p256, verifyECDSASignature, decodeSEC1PublicKey, decodePKIXECDSASignature, } from "@oslojs/crypto/ecdsa";
15
+ import { RSAPublicKey, sha256ObjectIdentifier, verifyRSASSAPKCS1v15Signature, } from "@oslojs/crypto/rsa";
16
+ import { sha256 } from "@oslojs/crypto/sha2";
17
+ import { encodeBase64urlNoPadding, decodeBase64urlIgnorePadding, } from "@oslojs/encoding";
18
+ import { callSignIn, callVerifier } from "./mutations/index.js";
19
+ import { callVerifierSignature } from "./mutations/verifierSignature.js";
20
+ import { authDb } from "./db.js";
21
+ /**
22
+ * Resolve passkey relying party options from provider config and environment.
23
+ */
24
+ function resolveRpOptions(provider) {
25
+ // WebAuthn RP ID and origin must match the *frontend* domain, not the
26
+ // Convex backend. SITE_URL is the canonical frontend URL
27
+ // (e.g. "http://localhost:3000" in dev, "https://myapp.com" in prod).
28
+ // CONVEX_SITE_URL points to the Convex cloud HTTP actions endpoint and
29
+ // must NOT be used here — the browser would reject the credential
30
+ // because the RP ID wouldn't match the page origin.
31
+ const siteUrl = process.env.SITE_URL;
32
+ if (!siteUrl && !provider.options.rpId) {
33
+ throw new Error("Passkey provider requires SITE_URL env var (your frontend URL) " +
34
+ "or explicit rpId / origin in the provider config. " +
35
+ "CONVEX_SITE_URL cannot be used because WebAuthn RP ID must match the frontend domain.");
36
+ }
37
+ const siteHostname = siteUrl ? new URL(siteUrl).hostname : undefined;
38
+ return {
39
+ rpName: provider.options.rpName ?? siteHostname ?? "localhost",
40
+ rpId: provider.options.rpId ?? siteHostname ?? "localhost",
41
+ origin: provider.options.origin ?? siteUrl ?? "http://localhost",
42
+ attestation: provider.options.attestation ?? "none",
43
+ userVerification: provider.options.userVerification ?? "required",
44
+ residentKey: provider.options.residentKey ?? "preferred",
45
+ authenticatorAttachment: provider.options.authenticatorAttachment,
46
+ algorithms: provider.options.algorithms ?? [coseAlgorithmES256, coseAlgorithmRS256],
47
+ challengeExpirationMs: provider.options.challengeExpirationMs ?? 300_000,
48
+ };
49
+ }
50
+ /**
51
+ * Generate a cryptographically random challenge.
52
+ */
53
+ function generateChallenge() {
54
+ const challenge = new Uint8Array(32);
55
+ crypto.getRandomValues(challenge);
56
+ return challenge;
57
+ }
58
+ /**
59
+ * Hash a challenge for storage in the verifier table's `signature` field.
60
+ */
61
+ function hashChallenge(challenge) {
62
+ return encodeBase64urlNoPadding(new Uint8Array(sha256(challenge)));
63
+ }
64
+ // ============================================================================
65
+ // Registration flow
66
+ // ============================================================================
67
+ /**
68
+ * Phase 1: Generate registration options.
69
+ *
70
+ * Requires an authenticated user — passkey registration always adds a
71
+ * credential to an existing account. The userId is taken from the
72
+ * current session identity.
73
+ */
74
+ async function handleRegisterOptions(ctx, provider, params) {
75
+ // Passkey registration requires an authenticated user
76
+ const identity = await ctx.auth.getUserIdentity();
77
+ if (identity === null) {
78
+ throw new Error("Passkey registration requires an authenticated user. " +
79
+ "Sign in first, then add a passkey to your account.");
80
+ }
81
+ const [userId] = identity.subject.split("|");
82
+ const rp = resolveRpOptions(provider);
83
+ const challenge = generateChallenge();
84
+ const challengeHash = hashChallenge(challenge);
85
+ // Store the challenge hash in the verifier table
86
+ const verifier = await callVerifier(ctx);
87
+ await callVerifierSignature(ctx, {
88
+ verifier,
89
+ signature: challengeHash,
90
+ });
91
+ // Get the user's profile for credential metadata
92
+ const user = await ctx.runQuery(ctx.auth.config.component.public.userGetById, { userId: userId });
93
+ const userName = params.userName ?? user?.email ?? "user";
94
+ const userDisplayName = params.userDisplayName ?? user?.name ?? userName;
95
+ // Collect existing credentials to prevent re-registration
96
+ let excludeCredentials = [];
97
+ const existing = await ctx.runQuery(ctx.auth.config.component.public.passkeyListByUserId, { userId: userId });
98
+ if (existing) {
99
+ excludeCredentials = existing.map((pk) => ({
100
+ id: pk.credentialId,
101
+ transports: pk.transports,
102
+ }));
103
+ }
104
+ // User handle is derived from the Convex userId
105
+ const userHandle = encodeBase64urlNoPadding(new TextEncoder().encode(userId));
106
+ const options = {
107
+ rp: {
108
+ name: rp.rpName,
109
+ id: rp.rpId,
110
+ },
111
+ user: {
112
+ id: userHandle,
113
+ name: userName,
114
+ displayName: userDisplayName,
115
+ },
116
+ challenge: encodeBase64urlNoPadding(challenge),
117
+ pubKeyCredParams: rp.algorithms.map((alg) => ({
118
+ type: "public-key",
119
+ alg,
120
+ })),
121
+ timeout: rp.challengeExpirationMs,
122
+ attestation: rp.attestation,
123
+ authenticatorSelection: {
124
+ residentKey: rp.residentKey,
125
+ requireResidentKey: rp.residentKey === "required",
126
+ userVerification: rp.userVerification,
127
+ ...(rp.authenticatorAttachment
128
+ ? { authenticatorAttachment: rp.authenticatorAttachment }
129
+ : {}),
130
+ },
131
+ excludeCredentials,
132
+ };
133
+ return { kind: "passkeyOptions", options, verifier };
134
+ }
135
+ /**
136
+ * Phase 2: Verify registration attestation and store the credential.
137
+ *
138
+ * Requires an authenticated user. Parses the attestation, verifies the
139
+ * challenge, extracts the public key, creates an account + passkey record
140
+ * linked to the current user, and returns auth tokens.
141
+ */
142
+ async function handleRegisterVerify(ctx, provider, params, verifierValue) {
143
+ // Passkey registration requires an authenticated user
144
+ const identity = await ctx.auth.getUserIdentity();
145
+ if (identity === null) {
146
+ throw new Error("Passkey registration requires an authenticated user. " +
147
+ "Sign in first, then add a passkey to your account.");
148
+ }
149
+ const [userId] = identity.subject.split("|");
150
+ const rp = resolveRpOptions(provider);
151
+ if (!verifierValue) {
152
+ throw new Error("Missing verifier for passkey registration");
153
+ }
154
+ // Decode client data
155
+ const clientDataJSON = decodeBase64urlIgnorePadding(params.clientDataJSON);
156
+ const clientData = parseClientDataJSON(clientDataJSON);
157
+ // Verify client data type is "webauthn.create"
158
+ if (clientData.type !== ClientDataType.Create) {
159
+ throw new Error("Invalid client data type: expected webauthn.create");
160
+ }
161
+ // Verify origin
162
+ const allowedOrigins = Array.isArray(rp.origin) ? rp.origin : [rp.origin];
163
+ if (!allowedOrigins.includes(clientData.origin)) {
164
+ throw new Error(`Invalid origin: ${clientData.origin}, expected one of: ${allowedOrigins.join(", ")}`);
165
+ }
166
+ // Verify challenge matches the stored verifier
167
+ const challengeHash = encodeBase64urlNoPadding(new Uint8Array(sha256(clientData.challenge)));
168
+ const verifierDoc = await ctx.runQuery(ctx.auth.config.component.public.verifierGetById, { verifierId: verifierValue });
169
+ if (!verifierDoc || verifierDoc.signature !== challengeHash) {
170
+ throw new Error("Invalid or expired challenge");
171
+ }
172
+ // Clean up the verifier
173
+ await ctx.runMutation(ctx.auth.config.component.public.verifierDelete, { verifierId: verifierValue });
174
+ // Parse attestation object
175
+ const attestationObjectBytes = decodeBase64urlIgnorePadding(params.attestationObject);
176
+ const attestation = parseAttestationObject(attestationObjectBytes);
177
+ const authenticatorData = attestation.authenticatorData;
178
+ // Verify RP ID hash
179
+ if (!authenticatorData.verifyRelyingPartyIdHash(rp.rpId)) {
180
+ throw new Error("Relying party ID mismatch");
181
+ }
182
+ // Verify user presence and verification flags
183
+ if (!authenticatorData.userPresent) {
184
+ throw new Error("User presence flag not set");
185
+ }
186
+ if (rp.userVerification === "required" && !authenticatorData.userVerified) {
187
+ throw new Error("User verification required but not performed");
188
+ }
189
+ // Extract credential
190
+ const credential = authenticatorData.credential;
191
+ if (!credential) {
192
+ throw new Error("No credential in attestation");
193
+ }
194
+ const credentialId = encodeBase64urlNoPadding(credential.id);
195
+ const publicKey = credential.publicKey;
196
+ // Determine algorithm and encode the public key for storage
197
+ let algorithm;
198
+ let publicKeyBytes;
199
+ if (publicKey.isAlgorithmDefined()) {
200
+ algorithm = publicKey.algorithm();
201
+ }
202
+ else {
203
+ const keyType = publicKey.type();
204
+ algorithm =
205
+ keyType === COSEKeyType.EC2
206
+ ? coseAlgorithmES256
207
+ : keyType === COSEKeyType.RSA
208
+ ? coseAlgorithmRS256
209
+ : coseAlgorithmES256;
210
+ }
211
+ if (algorithm === coseAlgorithmES256) {
212
+ const ec2 = publicKey.ec2();
213
+ // Encode as SEC1 uncompressed point (0x04 || x || y)
214
+ const xBytes = bigintToBytes(ec2.x, 32);
215
+ const yBytes = bigintToBytes(ec2.y, 32);
216
+ publicKeyBytes = new Uint8Array(65);
217
+ publicKeyBytes[0] = 0x04;
218
+ publicKeyBytes.set(xBytes, 1);
219
+ publicKeyBytes.set(yBytes, 33);
220
+ }
221
+ else if (algorithm === coseAlgorithmRS256) {
222
+ const rsa = publicKey.rsa();
223
+ const rsaPubKey = new RSAPublicKey(rsa.n, rsa.e);
224
+ publicKeyBytes = rsaPubKey.encodePKCS1();
225
+ }
226
+ else {
227
+ throw new Error(`Unsupported algorithm: ${algorithm}`);
228
+ }
229
+ const deviceType = params.deviceType ?? "single-device";
230
+ const backedUp = params.backedUp ?? false;
231
+ // Create an account record linking the passkey to the current user.
232
+ // Unlike unauthenticated flows, we don't create a new user — we
233
+ // attach the passkey credential to the existing authenticated user.
234
+ const db = authDb(ctx, ctx.auth.config);
235
+ await db.accounts.create({
236
+ userId: userId,
237
+ provider: provider.id,
238
+ providerAccountId: credentialId,
239
+ });
240
+ // Store the passkey credential
241
+ await ctx.runMutation(ctx.auth.config.component.public.passkeyInsert, {
242
+ userId: userId,
243
+ credentialId,
244
+ publicKey: publicKeyBytes.buffer.slice(publicKeyBytes.byteOffset, publicKeyBytes.byteOffset + publicKeyBytes.byteLength),
245
+ algorithm,
246
+ counter: authenticatorData.signatureCounter,
247
+ transports: params.transports,
248
+ deviceType,
249
+ backedUp,
250
+ name: params.passkeyName,
251
+ createdAt: Date.now(),
252
+ });
253
+ // Return tokens for the existing session
254
+ const signInResult = await callSignIn(ctx, {
255
+ userId: userId,
256
+ generateTokens: true,
257
+ });
258
+ return { kind: "signedIn", signedIn: signInResult };
259
+ }
260
+ // ============================================================================
261
+ // Authentication flow
262
+ // ============================================================================
263
+ /**
264
+ * Phase 3: Generate authentication options.
265
+ *
266
+ * Creates a challenge and returns PublicKeyCredentialRequestOptions.
267
+ * If an email is provided, scopes allowCredentials to that user's passkeys.
268
+ */
269
+ async function handleAuthOptions(ctx, provider, params) {
270
+ const rp = resolveRpOptions(provider);
271
+ const challenge = generateChallenge();
272
+ const challengeHash = hashChallenge(challenge);
273
+ // Store the challenge hash in the verifier table
274
+ const verifier = await callVerifier(ctx);
275
+ await callVerifierSignature(ctx, {
276
+ verifier,
277
+ signature: challengeHash,
278
+ });
279
+ // Build allowCredentials if email is provided
280
+ let allowCredentials;
281
+ if (params.email) {
282
+ // Look up user by email, then find their passkeys
283
+ const user = await ctx.runQuery(ctx.auth.config.component.public.userFindByVerifiedEmail, { email: params.email });
284
+ if (user) {
285
+ const passkeys = await ctx.runQuery(ctx.auth.config.component.public.passkeyListByUserId, { userId: user._id });
286
+ if (passkeys && passkeys.length > 0) {
287
+ allowCredentials = passkeys.map((pk) => ({
288
+ type: "public-key",
289
+ id: pk.credentialId,
290
+ transports: pk.transports,
291
+ }));
292
+ }
293
+ }
294
+ }
295
+ const options = {
296
+ challenge: encodeBase64urlNoPadding(challenge),
297
+ timeout: rp.challengeExpirationMs,
298
+ rpId: rp.rpId,
299
+ userVerification: rp.userVerification,
300
+ };
301
+ if (allowCredentials) {
302
+ options.allowCredentials = allowCredentials;
303
+ }
304
+ return { kind: "passkeyOptions", options, verifier };
305
+ }
306
+ /**
307
+ * Phase 4: Verify authentication assertion and sign in.
308
+ *
309
+ * Verifies the signature against the stored public key, checks the counter,
310
+ * and creates a session.
311
+ */
312
+ async function handleAuthVerify(ctx, provider, params, verifierValue) {
313
+ const rp = resolveRpOptions(provider);
314
+ if (!verifierValue) {
315
+ throw new Error("Missing verifier for passkey authentication");
316
+ }
317
+ // Decode client data
318
+ const clientDataJSON = decodeBase64urlIgnorePadding(params.clientDataJSON);
319
+ const clientData = parseClientDataJSON(clientDataJSON);
320
+ // Verify client data type is "webauthn.get"
321
+ if (clientData.type !== ClientDataType.Get) {
322
+ throw new Error("Invalid client data type: expected webauthn.get");
323
+ }
324
+ // Verify origin
325
+ const allowedOrigins = Array.isArray(rp.origin) ? rp.origin : [rp.origin];
326
+ if (!allowedOrigins.includes(clientData.origin)) {
327
+ throw new Error(`Invalid origin: ${clientData.origin}, expected one of: ${allowedOrigins.join(", ")}`);
328
+ }
329
+ // Verify challenge matches the stored verifier
330
+ const challengeHash = encodeBase64urlNoPadding(new Uint8Array(sha256(clientData.challenge)));
331
+ const verifierDoc = await ctx.runQuery(ctx.auth.config.component.public.verifierGetById, { verifierId: verifierValue });
332
+ if (!verifierDoc || verifierDoc.signature !== challengeHash) {
333
+ throw new Error("Invalid or expired challenge");
334
+ }
335
+ // Clean up the verifier
336
+ await ctx.runMutation(ctx.auth.config.component.public.verifierDelete, { verifierId: verifierValue });
337
+ // Look up the credential
338
+ const credentialId = params.credentialId;
339
+ if (!credentialId) {
340
+ throw new Error("Missing credential ID");
341
+ }
342
+ const passkeyDoc = await ctx.runQuery(ctx.auth.config.component.public.passkeyGetByCredentialId, { credentialId });
343
+ if (!passkeyDoc) {
344
+ throw new Error("Unknown credential");
345
+ }
346
+ const passkey = passkeyDoc;
347
+ // Parse authenticator data
348
+ const authenticatorDataBytes = decodeBase64urlIgnorePadding(params.authenticatorData);
349
+ const authenticatorData = parseAuthenticatorData(authenticatorDataBytes);
350
+ // Verify RP ID hash
351
+ if (!authenticatorData.verifyRelyingPartyIdHash(rp.rpId)) {
352
+ throw new Error("Relying party ID mismatch");
353
+ }
354
+ // Verify user presence
355
+ if (!authenticatorData.userPresent) {
356
+ throw new Error("User presence flag not set");
357
+ }
358
+ if (rp.userVerification === "required" && !authenticatorData.userVerified) {
359
+ throw new Error("User verification required but not performed");
360
+ }
361
+ // Verify signature
362
+ const signature = decodeBase64urlIgnorePadding(params.signature);
363
+ const signatureMessage = createAssertionSignatureMessage(authenticatorDataBytes, clientDataJSON);
364
+ const messageHash = sha256(signatureMessage);
365
+ const storedPublicKeyBytes = new Uint8Array(passkey.publicKey);
366
+ if (passkey.algorithm === coseAlgorithmES256) {
367
+ // EC P-256 verification
368
+ const ecPublicKey = decodeSEC1PublicKey(p256, storedPublicKeyBytes);
369
+ // WebAuthn signatures for EC keys are DER/ASN.1 (PKIX) encoded
370
+ const ecdsaSignature = decodePKIXECDSASignature(signature);
371
+ const valid = verifyECDSASignature(ecPublicKey, messageHash, ecdsaSignature);
372
+ if (!valid) {
373
+ throw new Error("Invalid signature");
374
+ }
375
+ }
376
+ else if (passkey.algorithm === coseAlgorithmRS256) {
377
+ // RSA PKCS#1 v1.5 with SHA-256 verification
378
+ // Decode the stored PKCS#1 public key
379
+ const { decodePKCS1RSAPublicKey } = await import("@oslojs/crypto/rsa");
380
+ const rsaPublicKey = decodePKCS1RSAPublicKey(storedPublicKeyBytes);
381
+ const valid = verifyRSASSAPKCS1v15Signature(rsaPublicKey, sha256ObjectIdentifier, messageHash, signature);
382
+ if (!valid) {
383
+ throw new Error("Invalid signature");
384
+ }
385
+ }
386
+ else {
387
+ throw new Error(`Unsupported algorithm: ${passkey.algorithm}`);
388
+ }
389
+ // Verify counter (clone detection)
390
+ // Counter of 0 means the authenticator doesn't support counters
391
+ if (passkey.counter !== 0 &&
392
+ authenticatorData.signatureCounter !== 0 &&
393
+ authenticatorData.signatureCounter <= passkey.counter) {
394
+ throw new Error("Authenticator counter did not increase — possible credential cloning detected");
395
+ }
396
+ // Update counter and last used timestamp
397
+ await ctx.runMutation(ctx.auth.config.component.public.passkeyUpdateCounter, {
398
+ passkeyId: passkey._id,
399
+ counter: authenticatorData.signatureCounter,
400
+ lastUsedAt: Date.now(),
401
+ });
402
+ // Sign in the user
403
+ const signInResult = await callSignIn(ctx, {
404
+ userId: passkey.userId,
405
+ generateTokens: true,
406
+ });
407
+ return { kind: "signedIn", signedIn: signInResult };
408
+ }
409
+ // ============================================================================
410
+ // Main dispatch
411
+ // ============================================================================
412
+ /**
413
+ * Main passkey handler dispatched from signIn.ts.
414
+ *
415
+ * Routes to the appropriate phase based on `params.flow`.
416
+ */
417
+ export async function handlePasskey(ctx, provider, args) {
418
+ const flow = args.params?.flow;
419
+ if (!flow) {
420
+ throw new Error("Missing `flow` parameter. Expected one of: register-options, register-verify, auth-options, auth-verify");
421
+ }
422
+ switch (flow) {
423
+ case "register-options":
424
+ return handleRegisterOptions(ctx, provider, args.params ?? {});
425
+ case "register-verify":
426
+ return handleRegisterVerify(ctx, provider, args.params ?? {}, args.verifier);
427
+ case "auth-options":
428
+ return handleAuthOptions(ctx, provider, args.params ?? {});
429
+ case "auth-verify":
430
+ return handleAuthVerify(ctx, provider, args.params ?? {}, args.verifier);
431
+ default:
432
+ throw new Error(`Unknown passkey flow: ${flow}. Expected one of: register-options, register-verify, auth-options, auth-verify`);
433
+ }
434
+ }
435
+ // ============================================================================
436
+ // Helpers
437
+ // ============================================================================
438
+ /**
439
+ * Convert a bigint to a fixed-size big-endian byte array.
440
+ */
441
+ function bigintToBytes(value, length) {
442
+ const bytes = new Uint8Array(length);
443
+ let v = value;
444
+ for (let i = length - 1; i >= 0; i--) {
445
+ bytes[i] = Number(v & 0xffn);
446
+ v >>= 8n;
447
+ }
448
+ return bytes;
449
+ }
450
+ //# sourceMappingURL=passkey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../../src/server/implementation/passkey.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/redirects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAG3D,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,4BAA4B,EACpC,MAAM,EAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,mBAahC;AAoBD,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,UAYd"}
1
+ {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/redirects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAG3D,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,4BAA4B,EACpC,MAAM,EAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,mBAahC;AAaD,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,UAYd"}
@@ -10,17 +10,12 @@ export async function redirectAbsoluteUrl(config, params) {
10
10
  return siteUrl();
11
11
  }
12
12
  async function defaultRedirectCallback({ redirectTo }) {
13
- const baseUrl = siteUrl();
13
+ // Resolve relative paths against SITE_URL; absolute URLs are passed through
14
+ // as-is. The developer is trusted to provide valid redirect targets.
14
15
  if (redirectTo.startsWith("?") || redirectTo.startsWith("/")) {
15
- return `${baseUrl}${redirectTo}`;
16
+ return `${siteUrl()}${redirectTo}`;
16
17
  }
17
- if (redirectTo.startsWith(baseUrl)) {
18
- const after = redirectTo[baseUrl.length];
19
- if (after === undefined || after === "?" || after === "/") {
20
- return redirectTo;
21
- }
22
- }
23
- throw new Error(`Invalid \`redirectTo\` ${redirectTo} for configured SITE_URL: ${baseUrl.toString()}`);
18
+ return redirectTo;
24
19
  }
25
20
  // Temporary work-around because Convex doesn't support
26
21
  // schemes other than http and https.
@@ -1 +1 @@
1
- {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../../src/server/implementation/redirects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoC,EACpC,MAA+B;IAE/B,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,+CAA+C,MAAM,CAAC,UAAiB,EAAE,CAC1E,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,GACpB,MAAM,CAAC,SAAS,EAAE,QAAQ,IAAI,uBAAuB,CAAC;QACxD,OAAO,MAAM,gBAAgB,CAAC,MAAgC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,EAAE,UAAU,EAA0B;IAC3E,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;IAC1B,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC1D,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,0BAA0B,UAAU,6BAA6B,OAAO,CAAC,QAAQ,EAAE,EAAE,CACtF,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,qCAAqC;AACrC,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,KAAa,EACb,KAAa;IAEb,MAAM,OAAO,GAAG,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC;IACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,QAAQ,WAAW,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAC9D,CAAC;IACF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,AAAD,EAAG,SAAS,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC;IACvD,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC3G,CAAC;AAED,SAAS,OAAO;IACd,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../../src/server/implementation/redirects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAoC,EACpC,MAA+B;IAE/B,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,+CAA+C,MAAM,CAAC,UAAiB,EAAE,CAC1E,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,GACpB,MAAM,CAAC,SAAS,EAAE,QAAQ,IAAI,uBAAuB,CAAC;QACxD,OAAO,MAAM,gBAAgB,CAAC,MAAgC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,EAAE,UAAU,EAA0B;IAC3E,4EAA4E;IAC5E,qEAAqE;IACrE,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,GAAG,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,uDAAuD;AACvD,qCAAqC;AACrC,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,KAAa,EACb,KAAa;IAEb,MAAM,OAAO,GAAG,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC;IACrD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,QAAQ,WAAW,CAAC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAC9D,CAAC;IACF,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,AAAD,EAAG,SAAS,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC;IACvD,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC3G,CAAC;AAED,SAAS,OAAO;IACd,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -26,6 +26,19 @@ export declare function signInImpl(ctx: EnrichedActionCtx, provider: AuthProvide
26
26
  kind: "redirect";
27
27
  redirect: string;
28
28
  verifier: string;
29
+ } | {
30
+ kind: "passkeyOptions";
31
+ options: Record<string, any>;
32
+ verifier: string;
33
+ } | {
34
+ kind: "totpRequired";
35
+ verifier: string;
36
+ } | {
37
+ kind: "totpSetup";
38
+ uri: string;
39
+ secret: string;
40
+ verifier: string;
41
+ totpId: string;
29
42
  }>;
30
43
  export {};
31
44
  //# sourceMappingURL=signIn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signIn.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/signIn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAG9B,8BAA8B,EAE/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,WAAW,EAEX,MAAM,EACP,MAAM,YAAY,CAAC;AAepB,KAAK,iBAAiB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;AAEvE,wBAAsB,UAAU,CAC9B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,8BAA8B,GAAG,IAAI,EAC/C,IAAI,EAAE;IACJ,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,EAAE;IACP,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GACA,OAAO,CACN;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GAElD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAEvD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAElC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAC3D,CAsCA"}
1
+ {"version":3,"file":"signIn.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/signIn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAG9B,8BAA8B,EAI/B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,WAAW,EAEX,MAAM,EACP,MAAM,YAAY,CAAC;AAkBpB,KAAK,iBAAiB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;AAEvE,wBAAsB,UAAU,CAC9B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,8BAA8B,GAAG,IAAI,EAC/C,IAAI,EAAE;IACJ,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,EAAE;IACP,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GACA,OAAO,CACN;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GAElD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAEvD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAElC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAExD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAE1E;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAE1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CACvF,CA4CA"}
@@ -1,7 +1,9 @@
1
- import { callCreateVerificationCode, callRefreshSession, callSignIn, callVerifier, callVerifyCodeAndSignIn, } from "./mutations/index.js";
1
+ import { callCreateVerificationCode, callRefreshSession, callSignIn, callVerifier, callVerifierSignature, callVerifyCodeAndSignIn, } from "./mutations/index.js";
2
2
  import { redirectAbsoluteUrl, setURLSearchParam } from "./redirects.js";
3
3
  import { requireEnv } from "../utils.js";
4
4
  import { generateRandomString } from "./utils.js";
5
+ import { handlePasskey } from "./passkey.js";
6
+ import { handleTotp, checkTotpRequired } from "./totp.js";
5
7
  const DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S = 60 * 60 * 24; // 24 hours
6
8
  export async function signInImpl(ctx, provider, args, options) {
7
9
  if (provider === null && args.refreshToken) {
@@ -34,6 +36,12 @@ export async function signInImpl(ctx, provider, args, options) {
34
36
  if (provider.type === "oauth" || provider.type === "oidc") {
35
37
  return handleOAuthProvider(ctx, provider, args, options);
36
38
  }
39
+ if (provider.type === "passkey") {
40
+ return handlePasskey(ctx, provider, args);
41
+ }
42
+ if (provider.type === "totp") {
43
+ return handleTotp(ctx, provider, args);
44
+ }
37
45
  const _typecheck = provider;
38
46
  throw new Error(`Provider type ${provider.type} is not supported yet`);
39
47
  }
@@ -78,21 +86,10 @@ async function handleEmailAndPhoneProvider(ctx, provider, args, options) {
78
86
  if (provider.type === "email") {
79
87
  await provider.sendVerificationRequest({
80
88
  ...verificationArgs,
81
- provider: {
82
- ...provider,
83
- from:
84
- // Simplifies demo configuration of Resend
85
- provider.from === "Auth.js <no-reply@authjs.dev>" &&
86
- provider.id === "resend"
87
- ? "My App <onboarding@resend.dev>"
88
- : provider.from,
89
- },
90
- request: new Request("http://localhost"), // TODO: Document
89
+ provider,
90
+ request: new Request("http://localhost"),
91
91
  theme: ctx.auth.config.theme,
92
- },
93
- // @ts-expect-error Figure out typing for email providers so they can
94
- // access ctx.
95
- ctx);
92
+ }, ctx);
96
93
  }
97
94
  else if (provider.type === "phone") {
98
95
  await provider.sendVerificationRequest({ ...verificationArgs, provider }, ctx);
@@ -104,6 +101,23 @@ async function handleCredentials(ctx, provider, args, options) {
104
101
  if (result === null) {
105
102
  return { kind: "signedIn", signedIn: null };
106
103
  }
104
+ // Check if user has TOTP 2FA enrolled before issuing tokens
105
+ const hasTotpEnrolled = await checkTotpRequired(ctx, result.userId);
106
+ if (hasTotpEnrolled) {
107
+ // Create session but withhold tokens — TOTP verification needed
108
+ const idsWithoutTokens = await callSignIn(ctx, {
109
+ userId: result.userId,
110
+ sessionId: result.sessionId,
111
+ generateTokens: false,
112
+ });
113
+ // Store userId in verifier so the TOTP verify flow can complete sign-in
114
+ const verifier = await callVerifier(ctx);
115
+ await callVerifierSignature(ctx, {
116
+ verifier,
117
+ signature: JSON.stringify({ userId: result.userId }),
118
+ });
119
+ return { kind: "totpRequired", verifier };
120
+ }
107
121
  const idsAndTokens = await callSignIn(ctx, {
108
122
  userId: result.userId,
109
123
  sessionId: result.sessionId,
@@ -1 +1 @@
1
- {"version":3,"file":"signIn.js","sourceRoot":"","sources":["../../../src/server/implementation/signIn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signIn.js","sourceRoot":"","sources":["../../../src/server/implementation/signIn.ts"],"names":[],"mappings":"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"}