@estifanos-sh/convex-auth 0.0.2 → 0.0.3

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 (298) hide show
  1. package/README.md +5 -5
  2. package/dist/_generated/component.d.ts +130 -61
  3. package/dist/_generated/component.d.ts.map +1 -1
  4. package/dist/_generated/dataModel.d.ts +28 -0
  5. package/dist/_generated/dataModel.d.ts.map +1 -0
  6. package/dist/bin.js +1 -2
  7. package/dist/browser/index.d.ts +2 -2
  8. package/dist/browser/index.d.ts.map +1 -1
  9. package/dist/browser/index.js.map +1 -1
  10. package/dist/client/core/types.d.ts +40 -79
  11. package/dist/client/core/types.d.ts.map +1 -1
  12. package/dist/client/core/types.js.map +1 -1
  13. package/dist/client/errors.d.ts +15 -0
  14. package/dist/client/errors.d.ts.map +1 -0
  15. package/dist/client/errors.js +8 -1
  16. package/dist/client/errors.js.map +1 -1
  17. package/dist/client/index.d.ts +6 -3
  18. package/dist/client/index.d.ts.map +1 -1
  19. package/dist/client/index.js +3 -2
  20. package/dist/client/index.js.map +1 -1
  21. package/dist/component/_generated/component.d.ts +130 -61
  22. package/dist/component/_generated/component.d.ts.map +1 -1
  23. package/dist/component/_generated/dataModel.d.ts +1 -1
  24. package/dist/component/_generated/server.d.ts +1 -1
  25. package/dist/component/account.d.ts +43 -37
  26. package/dist/component/account.d.ts.map +1 -1
  27. package/dist/component/account.js +14 -16
  28. package/dist/component/account.js.map +1 -1
  29. package/dist/component/connection/audit.d.ts +29 -29
  30. package/dist/component/connection/audit.d.ts.map +1 -1
  31. package/dist/component/connection/audit.js +2 -1
  32. package/dist/component/connection/audit.js.map +1 -1
  33. package/dist/component/connection/cache.d.ts +6 -6
  34. package/dist/component/connection/domain/verification.d.ts +19 -19
  35. package/dist/component/connection/domain.d.ts +20 -20
  36. package/dist/component/connection/saml/assertion.d.ts +4 -4
  37. package/dist/component/connection/saml/request.d.ts +9 -9
  38. package/dist/component/connection/saml/request.d.ts.map +1 -1
  39. package/dist/component/connection/scim/config.d.ts +13 -13
  40. package/dist/component/connection/scim/identity.d.ts +102 -59
  41. package/dist/component/connection/scim/identity.d.ts.map +1 -1
  42. package/dist/component/connection/scim/identity.js +357 -56
  43. package/dist/component/connection/scim/identity.js.map +1 -1
  44. package/dist/component/connection/secret.d.ts +15 -15
  45. package/dist/component/connection/secret.d.ts.map +1 -1
  46. package/dist/component/connection/webhook/delivery.d.ts +69 -53
  47. package/dist/component/connection/webhook/delivery.d.ts.map +1 -1
  48. package/dist/component/connection/webhook/delivery.js +127 -170
  49. package/dist/component/connection/webhook/delivery.js.map +1 -1
  50. package/dist/component/connection/webhook/endpoint.d.ts +21 -21
  51. package/dist/component/connection/webhook/events.d.ts +26 -0
  52. package/dist/component/connection/webhook/events.d.ts.map +1 -0
  53. package/dist/component/connection/webhook/events.js +39 -0
  54. package/dist/component/connection/webhook/events.js.map +1 -0
  55. package/dist/component/connection.d.ts +38 -38
  56. package/dist/component/connection.d.ts.map +1 -1
  57. package/dist/component/context.d.ts +115 -0
  58. package/dist/component/context.d.ts.map +1 -0
  59. package/dist/component/context.js +50 -0
  60. package/dist/component/context.js.map +1 -0
  61. package/dist/component/convex.config.d.ts +2 -2
  62. package/dist/component/crons.d.ts +2 -2
  63. package/dist/component/event.d.ts +134 -138
  64. package/dist/component/event.d.ts.map +1 -1
  65. package/dist/component/event.js +88 -117
  66. package/dist/component/event.js.map +1 -1
  67. package/dist/component/eventstream.d.ts +30 -0
  68. package/dist/component/eventstream.d.ts.map +1 -0
  69. package/dist/component/eventstream.js +51 -0
  70. package/dist/component/eventstream.js.map +1 -0
  71. package/dist/component/factor/device.d.ts +25 -24
  72. package/dist/component/factor/device.d.ts.map +1 -1
  73. package/dist/component/factor/device.js +5 -2
  74. package/dist/component/factor/device.js.map +1 -1
  75. package/dist/component/factor/passkey.d.ts +84 -75
  76. package/dist/component/factor/passkey.d.ts.map +1 -1
  77. package/dist/component/factor/passkey.js +6 -6
  78. package/dist/component/factor/passkey.js.map +1 -1
  79. package/dist/component/factor/totp.d.ts +54 -49
  80. package/dist/component/factor/totp.d.ts.map +1 -1
  81. package/dist/component/factor/totp.js +3 -3
  82. package/dist/component/factor/totp.js.map +1 -1
  83. package/dist/component/group/active.d.ts +326 -22
  84. package/dist/component/group/active.d.ts.map +1 -1
  85. package/dist/component/group/active.js +21 -11
  86. package/dist/component/group/active.js.map +1 -1
  87. package/dist/component/group/invite.d.ts +28 -28
  88. package/dist/component/group/invite.d.ts.map +1 -1
  89. package/dist/component/group/member.d.ts +34 -34
  90. package/dist/component/group.d.ts +47 -62
  91. package/dist/component/group.d.ts.map +1 -1
  92. package/dist/component/http.d.ts +2 -2
  93. package/dist/component/limits.d.ts +4 -4
  94. package/dist/component/maintenance.d.ts +2 -2
  95. package/dist/component/model.d.ts +1362 -1027
  96. package/dist/component/model.d.ts.map +1 -1
  97. package/dist/component/model.js +23 -6
  98. package/dist/component/model.js.map +1 -1
  99. package/dist/component/modules.d.ts +8 -2
  100. package/dist/component/modules.d.ts.map +1 -1
  101. package/dist/component/modules.js +3 -0
  102. package/dist/component/modules.js.map +1 -1
  103. package/dist/component/oauth/client.d.ts +20 -20
  104. package/dist/component/oauth/code.d.ts +14 -14
  105. package/dist/component/oauth/refresh.d.ts +19 -19
  106. package/dist/component/schema.d.ts +1100 -611
  107. package/dist/component/schema.d.ts.map +1 -1
  108. package/dist/component/schema.js +17 -4
  109. package/dist/component/schema.js.map +1 -1
  110. package/dist/component/session.d.ts +72 -32
  111. package/dist/component/session.d.ts.map +1 -1
  112. package/dist/component/session.js +120 -32
  113. package/dist/component/session.js.map +1 -1
  114. package/dist/component/token/continuation.d.ts +40 -18
  115. package/dist/component/token/continuation.d.ts.map +1 -1
  116. package/dist/component/token/continuation.js +57 -11
  117. package/dist/component/token/continuation.js.map +1 -1
  118. package/dist/component/token/pkce.d.ts +22 -22
  119. package/dist/component/token/pkce.d.ts.map +1 -1
  120. package/dist/component/token/refresh.d.ts +39 -35
  121. package/dist/component/token/refresh.d.ts.map +1 -1
  122. package/dist/component/token/refresh.js +11 -6
  123. package/dist/component/token/refresh.js.map +1 -1
  124. package/dist/component/token/verification.d.ts +36 -32
  125. package/dist/component/token/verification.d.ts.map +1 -1
  126. package/dist/component/token/verification.js +3 -3
  127. package/dist/component/token/verification.js.map +1 -1
  128. package/dist/component/user/email.d.ts +21 -21
  129. package/dist/component/user/key.d.ts +35 -35
  130. package/dist/component/user/key.d.ts.map +1 -1
  131. package/dist/component/user.d.ts +51 -45
  132. package/dist/component/user.d.ts.map +1 -1
  133. package/dist/core/index.d.ts +54 -90
  134. package/dist/core/index.d.ts.map +1 -1
  135. package/dist/core/index.js +1 -4
  136. package/dist/core/index.js.map +1 -1
  137. package/dist/expo/index.d.ts +3 -3
  138. package/dist/expo/index.d.ts.map +1 -1
  139. package/dist/expo/index.js.map +1 -1
  140. package/dist/model.js.map +1 -1
  141. package/dist/providers/anonymous.d.ts +11 -5
  142. package/dist/providers/anonymous.d.ts.map +1 -1
  143. package/dist/providers/anonymous.js +4 -1
  144. package/dist/providers/anonymous.js.map +1 -1
  145. package/dist/providers/apple.d.ts +1 -1
  146. package/dist/providers/credentials.d.ts +21 -13
  147. package/dist/providers/credentials.d.ts.map +1 -1
  148. package/dist/providers/credentials.js +2 -0
  149. package/dist/providers/credentials.js.map +1 -1
  150. package/dist/providers/custom.d.ts +3 -3
  151. package/dist/providers/custom.d.ts.map +1 -1
  152. package/dist/providers/custom.js.map +1 -1
  153. package/dist/providers/email.d.ts +3 -3
  154. package/dist/providers/email.d.ts.map +1 -1
  155. package/dist/providers/email.js.map +1 -1
  156. package/dist/providers/github.d.ts +1 -1
  157. package/dist/providers/google.d.ts +1 -1
  158. package/dist/providers/microsoft.d.ts +1 -1
  159. package/dist/providers/password.d.ts +103 -8
  160. package/dist/providers/password.d.ts.map +1 -1
  161. package/dist/providers/password.js +71 -26
  162. package/dist/providers/password.js.map +1 -1
  163. package/dist/providers/phone.d.ts +4 -3
  164. package/dist/providers/phone.d.ts.map +1 -1
  165. package/dist/providers/phone.js.map +1 -1
  166. package/dist/react/index.d.ts +40 -41
  167. package/dist/react/index.d.ts.map +1 -1
  168. package/dist/react/index.js +27 -52
  169. package/dist/react/index.js.map +1 -1
  170. package/dist/server/auth.d.ts +157 -117
  171. package/dist/server/auth.d.ts.map +1 -1
  172. package/dist/server/auth.js +41 -22
  173. package/dist/server/auth.js.map +1 -1
  174. package/dist/server/component/factor/db.js +4 -4
  175. package/dist/server/component/factor/db.js.map +1 -1
  176. package/dist/server/config.d.ts +2 -1
  177. package/dist/server/connection/domain.d.ts +4 -66
  178. package/dist/server/connection/domain.d.ts.map +1 -1
  179. package/dist/server/connection/domain.js +22 -4
  180. package/dist/server/connection/domain.js.map +1 -1
  181. package/dist/server/connection/group/service.js +6 -4
  182. package/dist/server/connection/group/service.js.map +1 -1
  183. package/dist/server/connection/http.js +94 -261
  184. package/dist/server/connection/http.js.map +1 -1
  185. package/dist/server/connection/oidc.js +8 -17
  186. package/dist/server/connection/oidc.js.map +1 -1
  187. package/dist/server/connection/policy/domain.js +4 -1
  188. package/dist/server/connection/policy/domain.js.map +1 -1
  189. package/dist/server/connection/policy.js +14 -13
  190. package/dist/server/connection/policy.js.map +1 -1
  191. package/dist/server/connection/provision.js +5 -19
  192. package/dist/server/connection/provision.js.map +1 -1
  193. package/dist/server/connection/webhook.js +4 -36
  194. package/dist/server/connection/webhook.js.map +1 -1
  195. package/dist/server/context.d.ts +2 -2
  196. package/dist/server/context.d.ts.map +1 -1
  197. package/dist/server/context.js +35 -24
  198. package/dist/server/context.js.map +1 -1
  199. package/dist/server/contract.d.ts.map +1 -1
  200. package/dist/server/contract.js +6 -14
  201. package/dist/server/contract.js.map +1 -1
  202. package/dist/server/core.js +6 -0
  203. package/dist/server/core.js.map +1 -1
  204. package/dist/server/cors.d.ts +2 -2
  205. package/dist/server/cors.d.ts.map +1 -1
  206. package/dist/server/crypto.js.map +1 -1
  207. package/dist/server/db.js +2 -1
  208. package/dist/server/db.js.map +1 -1
  209. package/dist/server/domains/context.js +34 -0
  210. package/dist/server/domains/context.js.map +1 -0
  211. package/dist/server/domains/factor.d.ts +3 -2
  212. package/dist/server/domains/factor.d.ts.map +1 -1
  213. package/dist/server/domains/factor.js.map +1 -1
  214. package/dist/server/domains/group.js.map +1 -1
  215. package/dist/server/domains/invite.js.map +1 -1
  216. package/dist/server/domains/key.js.map +1 -1
  217. package/dist/server/domains/member.js.map +1 -1
  218. package/dist/server/domains/session.js.map +1 -1
  219. package/dist/server/domains/user.js.map +1 -1
  220. package/dist/server/env.js +2 -22
  221. package/dist/server/env.js.map +1 -1
  222. package/dist/server/events.d.ts +0 -1
  223. package/dist/server/events.d.ts.map +1 -1
  224. package/dist/server/events.js +6 -6
  225. package/dist/server/events.js.map +1 -1
  226. package/dist/server/http.d.ts +1 -0
  227. package/dist/server/http.d.ts.map +1 -1
  228. package/dist/server/http.js +4 -4
  229. package/dist/server/http.js.map +1 -1
  230. package/dist/server/identity/claims.js +1 -1
  231. package/dist/server/identity/convex.d.ts +2 -0
  232. package/dist/server/identity/convex.d.ts.map +1 -1
  233. package/dist/server/index.d.ts +2 -3
  234. package/dist/server/index.js +1 -2
  235. package/dist/server/limits.js +21 -1
  236. package/dist/server/limits.js.map +1 -1
  237. package/dist/server/mutations/credentials/signin.js +6 -3
  238. package/dist/server/mutations/credentials/signin.js.map +1 -1
  239. package/dist/server/mutations/invalidate.js +5 -10
  240. package/dist/server/mutations/invalidate.js.map +1 -1
  241. package/dist/server/mutations/oauth.js +1 -1
  242. package/dist/server/mutations/oauth.js.map +1 -1
  243. package/dist/server/mutations/retrieve.js +4 -1
  244. package/dist/server/mutations/retrieve.js.map +1 -1
  245. package/dist/server/mutations/signin.js +2 -2
  246. package/dist/server/mutations/signin.js.map +1 -1
  247. package/dist/server/mutations/verify.js +4 -3
  248. package/dist/server/mutations/verify.js.map +1 -1
  249. package/dist/server/oauth/factory.js.map +1 -1
  250. package/dist/server/runtime.d.ts +107 -127
  251. package/dist/server/runtime.d.ts.map +1 -1
  252. package/dist/server/runtime.js +43 -28
  253. package/dist/server/runtime.js.map +1 -1
  254. package/dist/server/session/lifecycle.d.ts.map +1 -1
  255. package/dist/server/session/lifecycle.js +18 -3
  256. package/dist/server/session/lifecycle.js.map +1 -1
  257. package/dist/server/signin/flow.js +1 -1
  258. package/dist/server/signin/flow.js.map +1 -1
  259. package/dist/server/tokens.js +1 -0
  260. package/dist/server/tokens.js.map +1 -1
  261. package/dist/server/totp.js +3 -3
  262. package/dist/server/totp.js.map +1 -1
  263. package/dist/server/types.d.ts +63 -43
  264. package/dist/server/types.d.ts.map +1 -1
  265. package/dist/server/user/account.js +0 -1
  266. package/dist/server/user/account.js.map +1 -1
  267. package/dist/server/validators.d.ts +874 -917
  268. package/dist/server/validators.d.ts.map +1 -1
  269. package/dist/server/validators.js +33 -32
  270. package/dist/server/validators.js.map +1 -1
  271. package/dist/server/webauthn.js +4 -4
  272. package/dist/server/webauthn.js.map +1 -1
  273. package/dist/shared/brand.d.ts +3 -7
  274. package/dist/shared/brand.d.ts.map +1 -1
  275. package/dist/shared/params.d.ts +78 -0
  276. package/dist/shared/params.d.ts.map +1 -0
  277. package/dist/shared/results.d.ts +7 -1
  278. package/dist/shared/results.d.ts.map +1 -1
  279. package/dist/svelte/context.svelte.d.ts +23 -12
  280. package/dist/svelte/context.svelte.d.ts.map +1 -1
  281. package/dist/svelte/context.svelte.js +20 -13
  282. package/dist/svelte/index.d.ts +1 -4
  283. package/dist/svelte/index.d.ts.map +1 -1
  284. package/dist/svelte/index.js +1 -4
  285. package/dist/test.d.ts +1105 -611
  286. package/dist/test.d.ts.map +1 -1
  287. package/package.json +2 -1
  288. package/dist/server/env.d.ts +0 -28
  289. package/dist/server/env.d.ts.map +0 -1
  290. package/dist/svelte/AuthLoading.svelte +0 -13
  291. package/dist/svelte/AuthLoading.svelte.d.ts +0 -8
  292. package/dist/svelte/AuthLoading.svelte.d.ts.map +0 -1
  293. package/dist/svelte/SignedIn.svelte +0 -14
  294. package/dist/svelte/SignedIn.svelte.d.ts +0 -8
  295. package/dist/svelte/SignedIn.svelte.d.ts.map +0 -1
  296. package/dist/svelte/SignedOut.svelte +0 -13
  297. package/dist/svelte/SignedOut.svelte.d.ts +0 -8
  298. package/dist/svelte/SignedOut.svelte.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","names":[],"sources":["../../src/server/tokens.ts"],"sourcesContent":["import { SignJWT, createLocalJWKSet, importPKCS8, jwtVerify } from \"jose\";\n\nimport type { AccessToken } from \"../shared/brand\";\nimport { envOptionalString, requireAuthKey } from \"./env\";\nimport { generateRandomString } from \"./random\";\nimport { ConvexAuthConfig } from \"./types\";\nimport type { SessionTokenIdentityClaims } from \"./types\";\nimport { authUrlFromEnv } from \"./url\";\nimport { withSpan } from \"./utils/span\";\n\nconst DEFAULT_JWT_DURATION_MS = 1000 * 60 * 60;\nconst TOKEN_JTI_LENGTH = 24;\nconst TOKEN_JTI_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\nlet cachedPrivateKeyPromise: Promise<Awaited<ReturnType<typeof importPKCS8>>> | null = null;\nconst cachedIssuers = new Map<string, string>();\n\nconst JWT_ALG = \"EdDSA\" as const;\n\nfunction normalizePkcs8Pem(value: string) {\n const trimmed = value.trim();\n if (!trimmed.includes(\"-----BEGIN PRIVATE KEY-----\")) {\n return trimmed;\n }\n\n const withEscapedNewlines = trimmed.replace(/\\\\n/g, \"\\n\");\n if (withEscapedNewlines.includes(\"\\n\")) {\n return withEscapedNewlines;\n }\n\n const beginMarker = \"-----BEGIN PRIVATE KEY-----\";\n const endMarker = \"-----END PRIVATE KEY-----\";\n const body = trimmed.replace(beginMarker, \"\").replace(endMarker, \"\").trim().replace(/\\s+/g, \"\");\n\n if (body.length === 0) {\n return trimmed;\n }\n\n const wrappedBody = body.match(/.{1,64}/g)?.join(\"\\n\") ?? body;\n return `${beginMarker}\\n${wrappedBody}\\n${endMarker}`;\n}\n\nconst getPrivateKey = () => {\n if (cachedPrivateKeyPromise === null) {\n try {\n const pem = normalizePkcs8Pem(requireAuthKey(\"jwtPrivateKey\"));\n cachedPrivateKeyPromise = importPKCS8(pem, JWT_ALG).catch((error) => {\n cachedPrivateKeyPromise = null;\n throw error;\n });\n } catch (error) {\n cachedPrivateKeyPromise = null;\n throw error;\n }\n }\n return cachedPrivateKeyPromise;\n};\n\nconst getIssuer = (path?: string) => {\n const key = path ?? \"\";\n let issuer = cachedIssuers.get(key);\n if (issuer === undefined) {\n issuer = authUrlFromEnv(path);\n cachedIssuers.set(key, issuer);\n }\n return issuer;\n};\n\nif (envOptionalString(\"AUTH_KEYS\")) {\n try {\n void getPrivateKey().catch((err) => {\n console.error(\"[auth] JWT private key pre-warm failed\", { err });\n });\n } catch (err) {\n console.error(\"[auth] JWT private key pre-warm threw synchronously\", { err });\n }\n}\nif (envOptionalString(\"CONVEX_SITE_URL\")) {\n try {\n getIssuer();\n } catch (err) {\n console.error(\"[auth] JWT issuer pre-warm threw\", { err });\n }\n}\n\n/** Lifetime of an issued OAuth access token, in seconds. Shared with the token endpoint's `expires_in`. */\nexport const OAUTH_ACCESS_TOKEN_DURATION_S = 900;\n\n/**\n * Sign an OAuth access token (EdDSA) for the given user, client, and scopes.\n *\n * The `aud` claim is `\"convex\"` so the token is a valid Convex identity\n * (`applicationID: \"convex\"`) — load-bearing: MCP tools run the user's queries\n * via `ctx.runQuery`, which requires Convex's identity layer to accept this\n * token. For that reason the access token must look like an ID-token-shaped JWT:\n * it carries NO `typ: \"at+jwt\"` header (Convex's validator rejects that RFC 9068\n * type), and is instead marked as an access token by a positive `token_use:\n * \"access\"` claim, which `verifyOAuthToken` checks (alongside the `client_id`\n * claim) to tell it apart from a session token. We don't issue OIDC ID tokens,\n * so there is no id-vs-access confusion for the `at+jwt` typ to guard against.\n *\n * When an RFC 8707 `resource` is supplied the token carries a `resource` claim\n * binding it to that protected resource; an MCP endpoint rejects tokens whose\n * `resource` does not match its own canonical resource.\n *\n * @internal\n */\nexport async function generateOAuthToken(args: {\n userId: string;\n clientId: string;\n scopes: string[];\n issuer?: string;\n resource?: string;\n}): Promise<string> {\n const privateKey = await withSpan(\"convex-auth.tokens.import-key\", { alg: JWT_ALG }, () =>\n getPrivateKey(),\n );\n const exp = new Date(Date.now() + OAUTH_ACCESS_TOKEN_DURATION_S * 1000);\n return await withSpan(\"convex-auth.tokens.sign-oauth\", { alg: JWT_ALG }, () =>\n new SignJWT({\n sub: args.userId,\n aud: \"convex\",\n token_use: \"access\",\n scope: args.scopes.join(\" \"),\n client_id: args.clientId,\n ...(args.resource !== undefined ? { resource: args.resource } : null),\n })\n .setProtectedHeader({ alg: JWT_ALG })\n .setIssuedAt()\n .setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET))\n .setIssuer(args.issuer ?? getIssuer())\n .setExpirationTime(exp)\n .sign(privateKey),\n );\n}\n\nlet cachedKeySet: ReturnType<typeof createLocalJWKSet> | null = null;\n\n/**\n * The local JWKS keyset, built once and reused. `AUTH_KEYS` is static per\n * deployment, so caching also preserves jose's internal imported-key cache\n * across requests rather than re-importing keys on every verification.\n */\nfunction getJwkSet(): ReturnType<typeof createLocalJWKSet> {\n if (cachedKeySet === null) {\n cachedKeySet = createLocalJWKSet(requireAuthKey(\"jwks\"));\n }\n return cachedKeySet;\n}\n\n/**\n * Verify an OAuth access token against the local JWKS and issuer.\n *\n * When `opts.resource` is supplied, the token's RFC 8707 `resource` claim must\n * equal it exactly — a token bound to a different (or no) resource is rejected.\n * This is how an MCP endpoint enforces that a token was issued for *it*.\n *\n * @returns The token's user, client, scopes, and bound `resource`, or `null` if\n * verification fails, the token is not an OAuth access token, or the resource\n * assertion does not hold.\n * @internal\n */\nexport async function verifyOAuthToken(\n token: string,\n opts?: { issuer?: string; resource?: string },\n): Promise<{ userId: string; clientId: string; scopes: string[]; resource: string | null } | null> {\n try {\n const { payload } = await jwtVerify(token, getJwkSet(), {\n issuer: opts?.issuer ?? getIssuer(),\n audience: \"convex\",\n // Defense-in-depth: pin the accepted JWS algorithm so a token can only be\n // verified under EdDSA, never coerced to a different `alg` (algorithm\n // substitution / confusion hardening).\n algorithms: [JWT_ALG],\n clockTolerance: 30,\n });\n if ((payload as { token_use?: string }).token_use !== \"access\") return null;\n const userId = payload.sub;\n const clientId = (payload as { client_id?: string }).client_id;\n const scope = (payload as { scope?: string }).scope ?? \"\";\n if (!userId || !clientId) return null;\n const resourceClaim = (payload as { resource?: unknown }).resource;\n const resource = typeof resourceClaim === \"string\" ? resourceClaim : null;\n if (opts?.resource !== undefined && resource !== opts.resource) return null;\n // NOTE: the returned `scopes` are ADVISORY, not a Convex-enforced capability\n // boundary. Because `aud` is \"convex\", Convex's identity layer accepts this\n // token as the user's full identity — any query/mutation the user could run,\n // a client bearing this token can run via `ctx.runQuery`/`ctx.runMutation`,\n // regardless of `scope`. Integrators MUST enforce these scopes app-side\n // (e.g. inside each MCP tool handler) for them to actually restrict access.\n return { userId, clientId, scopes: scope ? scope.split(\" \") : [], resource };\n } catch {\n return null;\n }\n}\n\n/**\n * Sign a session access token (EdDSA) carrying the identity claims, audienced to Convex.\n *\n * Expiry is `config.jwt.durationMs` from now, defaulting to one hour.\n *\n * @internal\n */\nexport async function generateToken(\n args: {\n identity: SessionTokenIdentityClaims;\n },\n config: ConvexAuthConfig,\n): Promise<AccessToken> {\n const privateKey = await withSpan(\"convex-auth.tokens.import-key\", { alg: JWT_ALG }, () =>\n getPrivateKey(),\n );\n const expirationTime = new Date(Date.now() + (config.jwt?.durationMs ?? DEFAULT_JWT_DURATION_MS));\n const claims = {\n sub: args.identity.subject,\n sid: args.identity.sessionId,\n ...(args.identity.name !== undefined ? { name: args.identity.name } : null),\n ...(args.identity.email !== undefined ? { email: args.identity.email } : null),\n ...(args.identity.emailVerified !== undefined\n ? { email_verified: args.identity.emailVerified }\n : null),\n ...(args.identity.picture !== undefined ? { picture: args.identity.picture } : null),\n ...(args.identity.phoneNumber !== undefined\n ? { phone_number: args.identity.phoneNumber }\n : null),\n ...(args.identity.phoneNumberVerified !== undefined\n ? { phone_number_verified: args.identity.phoneNumberVerified }\n : null),\n };\n return (await withSpan(\"convex-auth.tokens.sign\", { alg: JWT_ALG }, () =>\n new SignJWT(claims)\n .setProtectedHeader({ alg: JWT_ALG })\n .setIssuedAt()\n .setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET))\n .setIssuer(getIssuer(config.path))\n .setAudience(\"convex\")\n .setExpirationTime(expirationTime)\n .sign(privateKey),\n )) as AccessToken;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","names":[],"sources":["../../src/server/tokens.ts"],"sourcesContent":["import { SignJWT, createLocalJWKSet, importPKCS8, jwtVerify } from \"jose\";\n\nimport type { AccessToken } from \"../shared/brand\";\nimport { envOptionalString, requireAuthKey } from \"./env\";\nimport { generateRandomString } from \"./random\";\nimport { ConvexAuthConfig } from \"./types\";\nimport type { SessionTokenIdentityClaims } from \"./types\";\nimport { authUrlFromEnv } from \"./url\";\nimport { withSpan } from \"./utils/span\";\n\nconst DEFAULT_JWT_DURATION_MS = 1000 * 60 * 60;\nconst TOKEN_JTI_LENGTH = 24;\nconst TOKEN_JTI_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\nlet cachedPrivateKeyPromise: Promise<Awaited<ReturnType<typeof importPKCS8>>> | null = null;\nconst cachedIssuers = new Map<string, string>();\n\nconst JWT_ALG = \"EdDSA\" as const;\n\nfunction normalizePkcs8Pem(value: string) {\n const trimmed = value.trim();\n if (!trimmed.includes(\"-----BEGIN PRIVATE KEY-----\")) {\n return trimmed;\n }\n\n const withEscapedNewlines = trimmed.replace(/\\\\n/g, \"\\n\");\n if (withEscapedNewlines.includes(\"\\n\")) {\n return withEscapedNewlines;\n }\n\n const beginMarker = \"-----BEGIN PRIVATE KEY-----\";\n const endMarker = \"-----END PRIVATE KEY-----\";\n const body = trimmed.replace(beginMarker, \"\").replace(endMarker, \"\").trim().replace(/\\s+/g, \"\");\n\n if (body.length === 0) {\n return trimmed;\n }\n\n const wrappedBody = body.match(/.{1,64}/g)?.join(\"\\n\") ?? body;\n return `${beginMarker}\\n${wrappedBody}\\n${endMarker}`;\n}\n\nconst getPrivateKey = () => {\n if (cachedPrivateKeyPromise === null) {\n try {\n const pem = normalizePkcs8Pem(requireAuthKey(\"jwtPrivateKey\"));\n cachedPrivateKeyPromise = importPKCS8(pem, JWT_ALG).catch((error) => {\n cachedPrivateKeyPromise = null;\n throw error;\n });\n } catch (error) {\n cachedPrivateKeyPromise = null;\n throw error;\n }\n }\n return cachedPrivateKeyPromise;\n};\n\nconst getIssuer = (path?: string) => {\n const key = path ?? \"\";\n let issuer = cachedIssuers.get(key);\n if (issuer === undefined) {\n issuer = authUrlFromEnv(path);\n cachedIssuers.set(key, issuer);\n }\n return issuer;\n};\n\nif (envOptionalString(\"AUTH_KEYS\")) {\n try {\n void getPrivateKey().catch((err) => {\n console.error(\"[auth] JWT private key pre-warm failed\", { err });\n });\n } catch (err) {\n console.error(\"[auth] JWT private key pre-warm threw synchronously\", { err });\n }\n}\nif (envOptionalString(\"CONVEX_SITE_URL\")) {\n try {\n getIssuer();\n } catch (err) {\n console.error(\"[auth] JWT issuer pre-warm threw\", { err });\n }\n}\n\n/** Lifetime of an issued OAuth access token, in seconds. Shared with the token endpoint's `expires_in`. */\nexport const OAUTH_ACCESS_TOKEN_DURATION_S = 900;\n\n/**\n * Sign an OAuth access token (EdDSA) for the given user, client, and scopes.\n *\n * The `aud` claim is `\"convex\"` so the token is a valid Convex identity\n * (`applicationID: \"convex\"`) — load-bearing: MCP tools run the user's queries\n * via `ctx.runQuery`, which requires Convex's identity layer to accept this\n * token. For that reason the access token must look like an ID-token-shaped JWT:\n * it carries NO `typ: \"at+jwt\"` header (Convex's validator rejects that RFC 9068\n * type), and is instead marked as an access token by a positive `token_use:\n * \"access\"` claim, which `verifyOAuthToken` checks (alongside the `client_id`\n * claim) to tell it apart from a session token. We don't issue OIDC ID tokens,\n * so there is no id-vs-access confusion for the `at+jwt` typ to guard against.\n *\n * When an RFC 8707 `resource` is supplied the token carries a `resource` claim\n * binding it to that protected resource; an MCP endpoint rejects tokens whose\n * `resource` does not match its own canonical resource.\n *\n * @internal\n */\nexport async function generateOAuthToken(args: {\n userId: string;\n clientId: string;\n scopes: string[];\n issuer?: string;\n resource?: string;\n}): Promise<string> {\n const privateKey = await withSpan(\"convex-auth.tokens.import-key\", { alg: JWT_ALG }, () =>\n getPrivateKey(),\n );\n const exp = new Date(Date.now() + OAUTH_ACCESS_TOKEN_DURATION_S * 1000);\n return await withSpan(\"convex-auth.tokens.sign-oauth\", { alg: JWT_ALG }, () =>\n new SignJWT({\n sub: args.userId,\n aud: \"convex\",\n token_use: \"access\",\n scope: args.scopes.join(\" \"),\n client_id: args.clientId,\n ...(args.resource !== undefined ? { resource: args.resource } : null),\n })\n .setProtectedHeader({ alg: JWT_ALG })\n .setIssuedAt()\n .setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET))\n .setIssuer(args.issuer ?? getIssuer())\n .setExpirationTime(exp)\n .sign(privateKey),\n );\n}\n\nlet cachedKeySet: ReturnType<typeof createLocalJWKSet> | null = null;\n\n/**\n * The local JWKS keyset, built once and reused. `AUTH_KEYS` is static per\n * deployment, so caching also preserves jose's internal imported-key cache\n * across requests rather than re-importing keys on every verification.\n */\nfunction getJwkSet(): ReturnType<typeof createLocalJWKSet> {\n if (cachedKeySet === null) {\n cachedKeySet = createLocalJWKSet(requireAuthKey(\"jwks\"));\n }\n return cachedKeySet;\n}\n\n/**\n * Verify an OAuth access token against the local JWKS and issuer.\n *\n * When `opts.resource` is supplied, the token's RFC 8707 `resource` claim must\n * equal it exactly — a token bound to a different (or no) resource is rejected.\n * This is how an MCP endpoint enforces that a token was issued for *it*.\n *\n * @returns The token's user, client, scopes, and bound `resource`, or `null` if\n * verification fails, the token is not an OAuth access token, or the resource\n * assertion does not hold.\n * @internal\n */\nexport async function verifyOAuthToken(\n token: string,\n opts?: { issuer?: string; resource?: string },\n): Promise<{ userId: string; clientId: string; scopes: string[]; resource: string | null } | null> {\n try {\n const { payload } = await jwtVerify(token, getJwkSet(), {\n issuer: opts?.issuer ?? getIssuer(),\n audience: \"convex\",\n // Defense-in-depth: pin the accepted JWS algorithm so a token can only be\n // verified under EdDSA, never coerced to a different `alg` (algorithm\n // substitution / confusion hardening).\n algorithms: [JWT_ALG],\n clockTolerance: 30,\n });\n if ((payload as { token_use?: string }).token_use !== \"access\") return null;\n const userId = payload.sub;\n const clientId = (payload as { client_id?: string }).client_id;\n const scope = (payload as { scope?: string }).scope ?? \"\";\n if (!userId || !clientId) return null;\n const resourceClaim = (payload as { resource?: unknown }).resource;\n const resource = typeof resourceClaim === \"string\" ? resourceClaim : null;\n if (opts?.resource !== undefined && resource !== opts.resource) return null;\n // NOTE: the returned `scopes` are ADVISORY, not a Convex-enforced capability\n // boundary. Because `aud` is \"convex\", Convex's identity layer accepts this\n // token as the user's full identity — any query/mutation the user could run,\n // a client bearing this token can run via `ctx.runQuery`/`ctx.runMutation`,\n // regardless of `scope`. Integrators MUST enforce these scopes app-side\n // (e.g. inside each MCP tool handler) for them to actually restrict access.\n return { userId, clientId, scopes: scope ? scope.split(\" \") : [], resource };\n } catch {\n return null;\n }\n}\n\n/**\n * Sign a session access token (EdDSA) carrying the identity claims, audienced to Convex.\n *\n * Expiry is `config.jwt.durationMs` from now, defaulting to one hour.\n *\n * @internal\n */\nexport async function generateToken(\n args: {\n identity: SessionTokenIdentityClaims;\n },\n config: ConvexAuthConfig,\n): Promise<AccessToken> {\n const privateKey = await withSpan(\"convex-auth.tokens.import-key\", { alg: JWT_ALG }, () =>\n getPrivateKey(),\n );\n const expirationTime = new Date(Date.now() + (config.jwt?.durationMs ?? DEFAULT_JWT_DURATION_MS));\n const claims = {\n sub: args.identity.subject,\n sid: args.identity.sessionId,\n session_epoch: args.identity.sessionEpoch,\n ...(args.identity.name !== undefined ? { name: args.identity.name } : null),\n ...(args.identity.email !== undefined ? { email: args.identity.email } : null),\n ...(args.identity.emailVerified !== undefined\n ? { email_verified: args.identity.emailVerified }\n : null),\n ...(args.identity.picture !== undefined ? { picture: args.identity.picture } : null),\n ...(args.identity.phoneNumber !== undefined\n ? { phone_number: args.identity.phoneNumber }\n : null),\n ...(args.identity.phoneNumberVerified !== undefined\n ? { phone_number_verified: args.identity.phoneNumberVerified }\n : null),\n };\n return (await withSpan(\"convex-auth.tokens.sign\", { alg: JWT_ALG }, () =>\n new SignJWT(claims)\n .setProtectedHeader({ alg: JWT_ALG })\n .setIssuedAt()\n .setJti(generateRandomString(TOKEN_JTI_LENGTH, TOKEN_JTI_ALPHABET))\n .setIssuer(getIssuer(config.path))\n .setAudience(\"convex\")\n .setExpirationTime(expirationTime)\n .sign(privateKey),\n )) as AccessToken;\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { getAuthenticatedUserIdOrNull } from "./identity/claims.js";
3
3
  import { queueAuthEvent } from "./events.js";
4
4
  import { encodeRefreshToken, refreshTokenExpirationTime } from "./token/refresh.js";
5
5
  import { setActiveSpanAttributes } from "./utils/span.js";
6
- import { buildSessionIdentity, finalizeSessionIssuance, getAuthSessionId, sessionExpirationTime } from "./session/lifecycle.js";
6
+ import { buildSessionIdentity, finalizeSessionIssuance, getAuthSessionReplacement, sessionExpirationTime } from "./session/lifecycle.js";
7
7
  import { authFlowError } from "../shared/errors.js";
8
8
  import { toConvexError } from "./errors.js";
9
9
  import { maxSignInAttempts } from "./limits.js";
@@ -194,13 +194,13 @@ const handleTotp = async (ctx, provider, args) => {
194
194
  if (begun.status === "not_found") throw convexError(input.intent === "enrollment" ? ErrorCode.TOTP_NOT_FOUND : ErrorCode.TOTP_NO_ENROLLMENT, input.intent === "enrollment" ? "TOTP enrollment not found." : "No verified TOTP enrollment found.");
195
195
  if (begun.status !== "ready") throw convexError(ErrorCode.INTERNAL_ERROR, "Unexpected TOTP verification state.");
196
196
  if (!verifyTOTPWithGracePeriod(await decryptTotpSecret(begun.factor.secret), begun.factor.period, begun.factor.digits, input.code, 30)) throw convexError(ErrorCode.TOTP_INVALID_CODE, "Invalid TOTP code.");
197
- const replaceSessionId = await getAuthSessionId(ctx) ?? void 0;
197
+ const replaceSession = await getAuthSessionReplacement(ctx);
198
198
  const completed = await ctx.runMutation(ctx.auth.config.component.factor.totp.completeVerification, {
199
199
  verifierId: input.verifier,
200
200
  intent: input.intent,
201
201
  authenticatedUserId: input.authenticatedUserId,
202
202
  totpId: input.totpId,
203
- replaceSessionId,
203
+ replaceSession,
204
204
  sessionExpirationTime: sessionExpirationTime(ctx.auth.config),
205
205
  refreshTokenExpirationTime: refreshTokenExpirationTime(ctx.auth.config),
206
206
  now: Date.now()
@@ -1 +1 @@
1
- {"version":3,"file":"totp.js","names":[],"sources":["../../src/server/totp.ts"],"sourcesContent":["/**\n * Server-side TOTP ceremony logic for two-factor authentication.\n *\n * Two single-word flows:\n *\n * - `setup` — generate a TOTP secret and `otpauth://` URI for enrollment.\n * - `verify` — consume a TOTP code. Auto-detects:\n * - first-time enrollment confirmation (caller passes `totpId`), or\n * - 2FA sign-in challenge (no `totpId`).\n */\n\nimport {\n decodeBase64urlIgnorePadding,\n encodeBase32LowerCaseNoPadding,\n encodeBase64urlNoPadding,\n} from \"@oslojs/encoding\";\nimport { createTOTPKeyURI, verifyTOTPWithGracePeriod } from \"@oslojs/otp\";\nimport { ConvexError, GenericId } from \"convex/values\";\n\nimport { ErrorCode } from \"../shared/codes\";\nimport { authFlowError } from \"../shared/errors\";\nimport type { AuthTokens, SignInSessionResult, SignInTotpSetupResult } from \"../shared/results\";\nimport type { AuthErrorData } from \"./errors\";\nimport { toConvexError } from \"./errors\";\nimport { queueAuthEvent } from \"./events\";\nimport { getAuthenticatedUserIdOrNull } from \"./identity/claims\";\nimport { maxSignInAttempts } from \"./limits\";\nimport { decryptSecret, encryptSecret } from \"./secret\";\nimport {\n buildSessionIdentity,\n finalizeSessionIssuance,\n getAuthSessionId,\n sessionExpirationTime,\n} from \"./session/lifecycle\";\nimport { encodeRefreshToken, refreshTokenExpirationTime } from \"./token/refresh\";\nimport { buildKnownSignInIdentityAttributes } from \"./telemetry\";\nimport {\n AuthDataModel,\n type CrossComponentUserDoc,\n GenericActionCtxWithAuthConfig,\n SessionInfo,\n TotpProviderConfig,\n} from \"./types\";\nimport { setActiveSpanAttributes } from \"./utils/span\";\n\ntype EnrichedActionCtx = GenericActionCtxWithAuthConfig<AuthDataModel>;\n\ntype TotpResult =\n | SignInSessionResult<SessionInfo<AuthTokens | null> | null>\n | SignInTotpSetupResult;\n\nconst TOTP_FLOWS = { setup: true, verify: true } as const;\n\ntype TotpFlow = keyof typeof TOTP_FLOWS;\n\nfunction isTotpFlow(value: unknown): value is TotpFlow {\n return typeof value === \"string\" && Object.hasOwn(TOTP_FLOWS, value);\n}\n\ntype TotpDispatch =\n | { flow: \"setup\"; params: Record<string, unknown> }\n /** Enrollment confirmation — `totpId` distinguishes from a 2FA challenge. */\n | { flow: \"verify\"; code: string; verifier: string; totpId: string; intent: \"enrollment\" }\n /** 2FA challenge during sign-in. */\n | { flow: \"verify\"; code: string; verifier: string; totpId?: undefined; intent: \"challenge\" };\n\nconst convexError = (code: ErrorCode, message: string) =>\n toConvexError(authFlowError(code, message));\n\nconst asConvexError = (\n error: unknown,\n code: ErrorCode,\n message: string,\n): ConvexError<AuthErrorData> =>\n error instanceof ConvexError\n ? error\n : error instanceof Error\n ? toConvexError(authFlowError(code, error.message || message))\n : convexError(code, message);\n\n/**\n * Encrypt a raw TOTP secret for storage. The secret bytes are base64url-encoded\n * and sealed with the server's {@link encryptSecret} (AES-GCM); the resulting\n * ciphertext string is stored UTF-8-encoded in the `TotpFactor.secret` bytes\n * field. Runs server-side because component functions cannot read\n * the secret-encryption key from `AUTH_KEYS`.\n */\nasync function encryptTotpSecret(secret: Uint8Array): Promise<ArrayBuffer> {\n const ciphertext = await encryptSecret(encodeBase64urlNoPadding(secret));\n const encoded = new TextEncoder().encode(ciphertext);\n return encoded.buffer.slice(\n encoded.byteOffset,\n encoded.byteOffset + encoded.byteLength,\n ) as ArrayBuffer;\n}\n\n/**\n * Reverse {@link encryptTotpSecret}: decode the stored ciphertext bytes, decrypt\n * to the base64url secret, and return the raw secret bytes for verification.\n */\nasync function decryptTotpSecret(stored: ArrayBuffer): Promise<Uint8Array> {\n const ciphertext = new TextDecoder().decode(stored);\n const secretB64 = await decryptSecret(ciphertext);\n return decodeBase64urlIgnorePadding(secretB64);\n}\n\nfunction resolveTotpFlow(params: Record<string, unknown>): TotpFlow {\n const flow = params.flow;\n if (isTotpFlow(flow)) {\n return flow;\n }\n throw convexError(\n ErrorCode.TOTP_MISSING_FLOW,\n \"Missing `flow` parameter. Expected one of: \" + Object.keys(TOTP_FLOWS).join(\", \"),\n );\n}\n\nfunction requireTotpVerifier(verifier: string | undefined): string {\n if (verifier != null) {\n return verifier;\n }\n throw convexError(ErrorCode.TOTP_MISSING_VERIFIER, \"Missing verifier for TOTP operation.\");\n}\n\nfunction requireTotpCode(params: Record<string, unknown>): string {\n if (typeof params.code === \"string\") {\n return params.code;\n }\n throw convexError(ErrorCode.TOTP_MISSING_CODE, \"Missing TOTP code.\");\n}\n\nfunction resolveTotpDispatch(\n params: Record<string, unknown>,\n verifier: string | undefined,\n): TotpDispatch {\n const flow = resolveTotpFlow(params);\n if (flow === \"setup\") {\n return { flow, params };\n }\n const resolvedVerifier = requireTotpVerifier(verifier);\n const code = requireTotpCode(params);\n if (typeof params.totpId === \"string\" && params.totpId.length > 0) {\n return {\n flow,\n code,\n totpId: params.totpId,\n verifier: resolvedVerifier,\n intent: \"enrollment\",\n };\n }\n return {\n flow,\n code,\n verifier: resolvedVerifier,\n intent: \"challenge\",\n };\n}\n\nasync function requireAuthenticatedUserId(ctx: EnrichedActionCtx): Promise<string> {\n try {\n const userId = await getAuthenticatedUserIdOrNull(ctx);\n if (userId === null) {\n throw convexError(\n ErrorCode.TOTP_AUTH_REQUIRED,\n \"Sign in first, then set up two-factor authentication.\",\n );\n }\n return userId;\n } catch (error) {\n if (error instanceof ConvexError) {\n throw error;\n }\n throw asConvexError(error, ErrorCode.INTERNAL_ERROR, String(error));\n }\n}\n\n/**\n * Drive the TOTP provider's `setup` / `verify` flow.\n *\n * `setup` issues an enrollment secret and `otpauth://` URI; `verify` either\n * confirms a first-time enrollment (when `params.totpId` is present) or\n * completes a 2FA challenge during sign-in.\n *\n * @internal\n */\nexport const handleTotp = async (\n ctx: EnrichedActionCtx,\n provider: TotpProviderConfig,\n args: { params?: Record<string, unknown>; verifier?: string },\n): Promise<TotpResult> => {\n const params = args.params ?? {};\n const dispatch = resolveTotpDispatch(params, args.verifier);\n\n async function setup(setupParams: Record<string, unknown>): Promise<TotpResult> {\n const userId = await requireAuthenticatedUserId(ctx);\n const secret = new Uint8Array(20);\n crypto.getRandomValues(secret);\n const base32Secret = encodeBase32LowerCaseNoPadding(secret);\n let enrollment: { user: CrossComponentUserDoc; totpId: string; verifierId: string };\n try {\n enrollment = (await ctx.runMutation(ctx.auth.config.component.factor.totp.createEnrollment, {\n userId,\n secret: await encryptTotpSecret(secret),\n digits: provider.options.digits,\n period: provider.options.period,\n name: typeof setupParams.name === \"string\" ? setupParams.name : undefined,\n createdAt: Date.now(),\n })) as typeof enrollment;\n } catch (error) {\n throw asConvexError(error, ErrorCode.INTERNAL_ERROR, `TOTP setup failed: ${String(error)}`);\n }\n const accountName =\n typeof setupParams.accountName === \"string\" && setupParams.accountName.length > 0\n ? setupParams.accountName\n : (enrollment.user.email ?? \"user\");\n const uri = createTOTPKeyURI(\n provider.options.issuer,\n accountName,\n secret,\n provider.options.period,\n provider.options.digits,\n );\n\n return {\n kind: \"totpSetup\" as const,\n totpSetup: { uri, secret: base32Secret, totpId: enrollment.totpId },\n verifier: enrollment.verifierId,\n };\n }\n\n /**\n * `verify` with `totpId`: completes a first-time enrollment after `setup`.\n * Marks the TOTP factor as verified and signs the user in.\n */\n async function confirmEnrollment(\n code: string,\n totpId: string,\n verifier: string,\n ): Promise<TotpResult> {\n const userId = await requireAuthenticatedUserId(ctx);\n const result = await verifyTotp({\n code,\n verifier,\n intent: \"enrollment\",\n authenticatedUserId: userId,\n totpId,\n });\n await queueAuthEvent(ctx, ctx.auth.config, {\n kind: \"totp.enrolled\",\n actor: { type: \"user\", id: userId },\n subject: { type: \"totp\", id: totpId },\n targets: [{ kind: \"user\", id: userId }],\n outcome: \"success\",\n data: { totpId },\n });\n return result;\n }\n\n /**\n * `verify` without `totpId`: completes a 2FA challenge during sign-in.\n * Looks up the user's verified TOTP factor, validates the code, signs in.\n */\n async function verifyChallenge(code: string, verifier: string): Promise<TotpResult> {\n return await verifyTotp({ code, verifier, intent: \"challenge\" });\n }\n\n async function verifyTotp(input: {\n code: string;\n verifier: string;\n intent: \"enrollment\" | \"challenge\";\n authenticatedUserId?: string;\n totpId?: string;\n }): Promise<TotpResult> {\n const begun = (await ctx.runMutation(ctx.auth.config.component.factor.totp.beginVerification, {\n verifierId: input.verifier,\n intent: input.intent,\n authenticatedUserId: input.authenticatedUserId,\n totpId: input.totpId,\n maxAttemptsPerHour: maxSignInAttempts(ctx.auth.config),\n })) as\n | { status: \"invalid_verifier\" | \"limited\" | \"not_found\" | \"already_verified\" }\n | {\n status: \"ready\";\n userId: string;\n factor: {\n _id: string;\n secret: ArrayBuffer;\n period: number;\n digits: number;\n };\n };\n\n if (begun.status === \"invalid_verifier\") {\n throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, \"Invalid or expired TOTP verifier.\");\n }\n if (begun.status === \"limited\") {\n throw convexError(ErrorCode.RATE_LIMITED, \"Too many TOTP attempts. Try again later.\");\n }\n if (begun.status === \"already_verified\") {\n throw convexError(ErrorCode.TOTP_ALREADY_VERIFIED, \"TOTP enrollment is already verified.\");\n }\n if (begun.status === \"not_found\") {\n throw convexError(\n input.intent === \"enrollment\" ? ErrorCode.TOTP_NOT_FOUND : ErrorCode.TOTP_NO_ENROLLMENT,\n input.intent === \"enrollment\"\n ? \"TOTP enrollment not found.\"\n : \"No verified TOTP enrollment found.\",\n );\n }\n if (begun.status !== \"ready\") {\n throw convexError(ErrorCode.INTERNAL_ERROR, \"Unexpected TOTP verification state.\");\n }\n\n const secret = await decryptTotpSecret(begun.factor.secret);\n if (\n !verifyTOTPWithGracePeriod(secret, begun.factor.period, begun.factor.digits, input.code, 30)\n ) {\n throw convexError(ErrorCode.TOTP_INVALID_CODE, \"Invalid TOTP code.\");\n }\n\n const replaceSessionId = (await getAuthSessionId(ctx)) ?? undefined;\n const completed = (await ctx.runMutation(\n ctx.auth.config.component.factor.totp.completeVerification,\n {\n verifierId: input.verifier,\n intent: input.intent,\n authenticatedUserId: input.authenticatedUserId,\n totpId: input.totpId,\n replaceSessionId,\n sessionExpirationTime: sessionExpirationTime(ctx.auth.config),\n refreshTokenExpirationTime: refreshTokenExpirationTime(ctx.auth.config),\n now: Date.now(),\n },\n )) as\n | { status: \"rejected\" }\n | {\n status: \"accepted\";\n user: CrossComponentUserDoc;\n factorId: string;\n sessionId: string;\n refreshTokenId: string;\n replacedSessionId?: string;\n };\n if (completed.status !== \"accepted\") {\n throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, \"Invalid or expired TOTP verifier.\");\n }\n\n const userId = completed.user._id as GenericId<\"User\">;\n const sessionId = completed.sessionId as GenericId<\"Session\">;\n setActiveSpanAttributes({\n \"auth.signin.result\": \"success\",\n ...buildKnownSignInIdentityAttributes(\n ctx.auth.config,\n { userId, sessionId },\n completed.user.email,\n ),\n });\n if (completed.replacedSessionId !== undefined) {\n const replacedSessionId = completed.replacedSessionId as GenericId<\"Session\">;\n await queueAuthEvent(ctx, ctx.auth.config, {\n kind: \"session.invalidated\",\n actor: { type: \"system\" },\n subject: { type: \"session\", id: replacedSessionId },\n targets: [\n { kind: \"user\", id: userId },\n { kind: \"session\", id: replacedSessionId },\n ],\n outcome: \"success\",\n data: { userId, reason: \"replaced\" },\n });\n }\n await queueAuthEvent(ctx, ctx.auth.config, {\n kind: \"session.signed_in\",\n actor: { type: \"user\", id: userId },\n subject: { type: \"session\", id: sessionId },\n targets: [\n { kind: \"user\", id: userId },\n { kind: \"session\", id: sessionId },\n ],\n outcome: \"success\",\n data: { provider: \"session\", method: provider.id },\n });\n const session = await finalizeSessionIssuance(ctx.auth.config, {\n userId,\n sessionId,\n identity: buildSessionIdentity(userId, sessionId, completed.user),\n refreshToken: encodeRefreshToken(\n completed.refreshTokenId as GenericId<\"RefreshToken\">,\n sessionId,\n ),\n });\n return { kind: \"signedIn\" as const, session };\n }\n\n if (dispatch.flow === \"setup\") {\n return await setup(dispatch.params);\n }\n if (dispatch.intent === \"enrollment\") {\n return await confirmEnrollment(dispatch.code, dispatch.totpId, dispatch.verifier);\n }\n return await verifyChallenge(dispatch.code, dispatch.verifier);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"totp.js","names":[],"sources":["../../src/server/totp.ts"],"sourcesContent":["/**\n * Server-side TOTP ceremony logic for two-factor authentication.\n *\n * Two single-word flows:\n *\n * - `setup` — generate a TOTP secret and `otpauth://` URI for enrollment.\n * - `verify` — consume a TOTP code. Auto-detects:\n * - first-time enrollment confirmation (caller passes `totpId`), or\n * - 2FA sign-in challenge (no `totpId`).\n */\n\nimport {\n decodeBase64urlIgnorePadding,\n encodeBase32LowerCaseNoPadding,\n encodeBase64urlNoPadding,\n} from \"@oslojs/encoding\";\nimport { createTOTPKeyURI, verifyTOTPWithGracePeriod } from \"@oslojs/otp\";\nimport { ConvexError, GenericId } from \"convex/values\";\n\nimport { ErrorCode } from \"../shared/codes\";\nimport { authFlowError } from \"../shared/errors\";\nimport type { AuthTokens, SignInSessionResult, SignInTotpSetupResult } from \"../shared/results\";\nimport type { AuthErrorData } from \"./errors\";\nimport { toConvexError } from \"./errors\";\nimport { queueAuthEvent } from \"./events\";\nimport { getAuthenticatedUserIdOrNull } from \"./identity/claims\";\nimport { maxSignInAttempts } from \"./limits\";\nimport { decryptSecret, encryptSecret } from \"./secret\";\nimport {\n buildSessionIdentity,\n finalizeSessionIssuance,\n getAuthSessionReplacement,\n sessionExpirationTime,\n} from \"./session/lifecycle\";\nimport { encodeRefreshToken, refreshTokenExpirationTime } from \"./token/refresh\";\nimport { buildKnownSignInIdentityAttributes } from \"./telemetry\";\nimport {\n AuthDataModel,\n type CrossComponentUserDoc,\n GenericActionCtxWithAuthConfig,\n SessionInfo,\n TotpProviderConfig,\n} from \"./types\";\nimport { setActiveSpanAttributes } from \"./utils/span\";\n\ntype EnrichedActionCtx = GenericActionCtxWithAuthConfig<AuthDataModel>;\n\ntype TotpResult =\n | SignInSessionResult<SessionInfo<AuthTokens | null> | null>\n | SignInTotpSetupResult;\n\nconst TOTP_FLOWS = { setup: true, verify: true } as const;\n\ntype TotpFlow = keyof typeof TOTP_FLOWS;\n\nfunction isTotpFlow(value: unknown): value is TotpFlow {\n return typeof value === \"string\" && Object.hasOwn(TOTP_FLOWS, value);\n}\n\ntype TotpDispatch =\n | { flow: \"setup\"; params: Record<string, unknown> }\n /** Enrollment confirmation — `totpId` distinguishes from a 2FA challenge. */\n | { flow: \"verify\"; code: string; verifier: string; totpId: string; intent: \"enrollment\" }\n /** 2FA challenge during sign-in. */\n | { flow: \"verify\"; code: string; verifier: string; totpId?: undefined; intent: \"challenge\" };\n\nconst convexError = (code: ErrorCode, message: string) =>\n toConvexError(authFlowError(code, message));\n\nconst asConvexError = (\n error: unknown,\n code: ErrorCode,\n message: string,\n): ConvexError<AuthErrorData> =>\n error instanceof ConvexError\n ? error\n : error instanceof Error\n ? toConvexError(authFlowError(code, error.message || message))\n : convexError(code, message);\n\n/**\n * Encrypt a raw TOTP secret for storage. The secret bytes are base64url-encoded\n * and sealed with the server's {@link encryptSecret} (AES-GCM); the resulting\n * ciphertext string is stored UTF-8-encoded in the `TotpFactor.secret` bytes\n * field. Runs server-side because component functions cannot read\n * the secret-encryption key from `AUTH_KEYS`.\n */\nasync function encryptTotpSecret(secret: Uint8Array): Promise<ArrayBuffer> {\n const ciphertext = await encryptSecret(encodeBase64urlNoPadding(secret));\n const encoded = new TextEncoder().encode(ciphertext);\n return encoded.buffer.slice(\n encoded.byteOffset,\n encoded.byteOffset + encoded.byteLength,\n ) as ArrayBuffer;\n}\n\n/**\n * Reverse {@link encryptTotpSecret}: decode the stored ciphertext bytes, decrypt\n * to the base64url secret, and return the raw secret bytes for verification.\n */\nasync function decryptTotpSecret(stored: ArrayBuffer): Promise<Uint8Array> {\n const ciphertext = new TextDecoder().decode(stored);\n const secretB64 = await decryptSecret(ciphertext);\n return decodeBase64urlIgnorePadding(secretB64);\n}\n\nfunction resolveTotpFlow(params: Record<string, unknown>): TotpFlow {\n const flow = params.flow;\n if (isTotpFlow(flow)) {\n return flow;\n }\n throw convexError(\n ErrorCode.TOTP_MISSING_FLOW,\n \"Missing `flow` parameter. Expected one of: \" + Object.keys(TOTP_FLOWS).join(\", \"),\n );\n}\n\nfunction requireTotpVerifier(verifier: string | undefined): string {\n if (verifier != null) {\n return verifier;\n }\n throw convexError(ErrorCode.TOTP_MISSING_VERIFIER, \"Missing verifier for TOTP operation.\");\n}\n\nfunction requireTotpCode(params: Record<string, unknown>): string {\n if (typeof params.code === \"string\") {\n return params.code;\n }\n throw convexError(ErrorCode.TOTP_MISSING_CODE, \"Missing TOTP code.\");\n}\n\nfunction resolveTotpDispatch(\n params: Record<string, unknown>,\n verifier: string | undefined,\n): TotpDispatch {\n const flow = resolveTotpFlow(params);\n if (flow === \"setup\") {\n return { flow, params };\n }\n const resolvedVerifier = requireTotpVerifier(verifier);\n const code = requireTotpCode(params);\n if (typeof params.totpId === \"string\" && params.totpId.length > 0) {\n return {\n flow,\n code,\n totpId: params.totpId,\n verifier: resolvedVerifier,\n intent: \"enrollment\",\n };\n }\n return {\n flow,\n code,\n verifier: resolvedVerifier,\n intent: \"challenge\",\n };\n}\n\nasync function requireAuthenticatedUserId(ctx: EnrichedActionCtx): Promise<string> {\n try {\n const userId = await getAuthenticatedUserIdOrNull(ctx);\n if (userId === null) {\n throw convexError(\n ErrorCode.TOTP_AUTH_REQUIRED,\n \"Sign in first, then set up two-factor authentication.\",\n );\n }\n return userId;\n } catch (error) {\n if (error instanceof ConvexError) {\n throw error;\n }\n throw asConvexError(error, ErrorCode.INTERNAL_ERROR, String(error));\n }\n}\n\n/**\n * Drive the TOTP provider's `setup` / `verify` flow.\n *\n * `setup` issues an enrollment secret and `otpauth://` URI; `verify` either\n * confirms a first-time enrollment (when `params.totpId` is present) or\n * completes a 2FA challenge during sign-in.\n *\n * @internal\n */\nexport const handleTotp = async (\n ctx: EnrichedActionCtx,\n provider: TotpProviderConfig,\n args: { params?: Record<string, unknown>; verifier?: string },\n): Promise<TotpResult> => {\n const params = args.params ?? {};\n const dispatch = resolveTotpDispatch(params, args.verifier);\n\n async function setup(setupParams: Record<string, unknown>): Promise<TotpResult> {\n const userId = await requireAuthenticatedUserId(ctx);\n const secret = new Uint8Array(20);\n crypto.getRandomValues(secret);\n const base32Secret = encodeBase32LowerCaseNoPadding(secret);\n let enrollment: { user: CrossComponentUserDoc; totpId: string; verifierId: string };\n try {\n enrollment = (await ctx.runMutation(ctx.auth.config.component.factor.totp.createEnrollment, {\n userId,\n secret: await encryptTotpSecret(secret),\n digits: provider.options.digits,\n period: provider.options.period,\n name: typeof setupParams.name === \"string\" ? setupParams.name : undefined,\n createdAt: Date.now(),\n })) as typeof enrollment;\n } catch (error) {\n throw asConvexError(error, ErrorCode.INTERNAL_ERROR, `TOTP setup failed: ${String(error)}`);\n }\n const accountName =\n typeof setupParams.accountName === \"string\" && setupParams.accountName.length > 0\n ? setupParams.accountName\n : (enrollment.user.email ?? \"user\");\n const uri = createTOTPKeyURI(\n provider.options.issuer,\n accountName,\n secret,\n provider.options.period,\n provider.options.digits,\n );\n\n return {\n kind: \"totpSetup\" as const,\n totpSetup: { uri, secret: base32Secret, totpId: enrollment.totpId },\n verifier: enrollment.verifierId,\n };\n }\n\n /**\n * `verify` with `totpId`: completes a first-time enrollment after `setup`.\n * Marks the TOTP factor as verified and signs the user in.\n */\n async function confirmEnrollment(\n code: string,\n totpId: string,\n verifier: string,\n ): Promise<TotpResult> {\n const userId = await requireAuthenticatedUserId(ctx);\n const result = await verifyTotp({\n code,\n verifier,\n intent: \"enrollment\",\n authenticatedUserId: userId,\n totpId,\n });\n await queueAuthEvent(ctx, ctx.auth.config, {\n kind: \"totp.enrolled\",\n actor: { type: \"user\", id: userId },\n subject: { type: \"totp\", id: totpId },\n targets: [{ kind: \"user\", id: userId }],\n outcome: \"success\",\n data: { totpId },\n });\n return result;\n }\n\n /**\n * `verify` without `totpId`: completes a 2FA challenge during sign-in.\n * Looks up the user's verified TOTP factor, validates the code, signs in.\n */\n async function verifyChallenge(code: string, verifier: string): Promise<TotpResult> {\n return await verifyTotp({ code, verifier, intent: \"challenge\" });\n }\n\n async function verifyTotp(input: {\n code: string;\n verifier: string;\n intent: \"enrollment\" | \"challenge\";\n authenticatedUserId?: string;\n totpId?: string;\n }): Promise<TotpResult> {\n const begun = (await ctx.runMutation(ctx.auth.config.component.factor.totp.beginVerification, {\n verifierId: input.verifier,\n intent: input.intent,\n authenticatedUserId: input.authenticatedUserId,\n totpId: input.totpId,\n maxAttemptsPerHour: maxSignInAttempts(ctx.auth.config),\n })) as\n | { status: \"invalid_verifier\" | \"limited\" | \"not_found\" | \"already_verified\" }\n | {\n status: \"ready\";\n userId: string;\n factor: {\n _id: string;\n secret: ArrayBuffer;\n period: number;\n digits: number;\n };\n };\n\n if (begun.status === \"invalid_verifier\") {\n throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, \"Invalid or expired TOTP verifier.\");\n }\n if (begun.status === \"limited\") {\n throw convexError(ErrorCode.RATE_LIMITED, \"Too many TOTP attempts. Try again later.\");\n }\n if (begun.status === \"already_verified\") {\n throw convexError(ErrorCode.TOTP_ALREADY_VERIFIED, \"TOTP enrollment is already verified.\");\n }\n if (begun.status === \"not_found\") {\n throw convexError(\n input.intent === \"enrollment\" ? ErrorCode.TOTP_NOT_FOUND : ErrorCode.TOTP_NO_ENROLLMENT,\n input.intent === \"enrollment\"\n ? \"TOTP enrollment not found.\"\n : \"No verified TOTP enrollment found.\",\n );\n }\n if (begun.status !== \"ready\") {\n throw convexError(ErrorCode.INTERNAL_ERROR, \"Unexpected TOTP verification state.\");\n }\n\n const secret = await decryptTotpSecret(begun.factor.secret);\n if (\n !verifyTOTPWithGracePeriod(secret, begun.factor.period, begun.factor.digits, input.code, 30)\n ) {\n throw convexError(ErrorCode.TOTP_INVALID_CODE, \"Invalid TOTP code.\");\n }\n\n const replaceSession = await getAuthSessionReplacement(ctx);\n const completed = (await ctx.runMutation(\n ctx.auth.config.component.factor.totp.completeVerification,\n {\n verifierId: input.verifier,\n intent: input.intent,\n authenticatedUserId: input.authenticatedUserId,\n totpId: input.totpId,\n replaceSession,\n sessionExpirationTime: sessionExpirationTime(ctx.auth.config),\n refreshTokenExpirationTime: refreshTokenExpirationTime(ctx.auth.config),\n now: Date.now(),\n },\n )) as\n | { status: \"rejected\" }\n | {\n status: \"accepted\";\n user: CrossComponentUserDoc;\n factorId: string;\n sessionId: string;\n refreshTokenId: string;\n replacedSessionId?: string;\n };\n if (completed.status !== \"accepted\") {\n throw convexError(ErrorCode.TOTP_INVALID_VERIFIER, \"Invalid or expired TOTP verifier.\");\n }\n\n const userId = completed.user._id as GenericId<\"User\">;\n const sessionId = completed.sessionId as GenericId<\"Session\">;\n setActiveSpanAttributes({\n \"auth.signin.result\": \"success\",\n ...buildKnownSignInIdentityAttributes(\n ctx.auth.config,\n { userId, sessionId },\n completed.user.email,\n ),\n });\n if (completed.replacedSessionId !== undefined) {\n const replacedSessionId = completed.replacedSessionId as GenericId<\"Session\">;\n await queueAuthEvent(ctx, ctx.auth.config, {\n kind: \"session.invalidated\",\n actor: { type: \"system\" },\n subject: { type: \"session\", id: replacedSessionId },\n targets: [\n { kind: \"user\", id: userId },\n { kind: \"session\", id: replacedSessionId },\n ],\n outcome: \"success\",\n data: { userId, reason: \"replaced\" },\n });\n }\n await queueAuthEvent(ctx, ctx.auth.config, {\n kind: \"session.signed_in\",\n actor: { type: \"user\", id: userId },\n subject: { type: \"session\", id: sessionId },\n targets: [\n { kind: \"user\", id: userId },\n { kind: \"session\", id: sessionId },\n ],\n outcome: \"success\",\n data: { provider: \"session\", method: provider.id },\n });\n const session = await finalizeSessionIssuance(ctx.auth.config, {\n userId,\n sessionId,\n identity: buildSessionIdentity(userId, sessionId, completed.user),\n refreshToken: encodeRefreshToken(\n completed.refreshTokenId as GenericId<\"RefreshToken\">,\n sessionId,\n ),\n });\n return { kind: \"signedIn\" as const, session };\n }\n\n if (dispatch.flow === \"setup\") {\n return await setup(dispatch.params);\n }\n if (dispatch.intent === \"enrollment\") {\n return await confirmEnrollment(dispatch.code, dispatch.totpId, dispatch.verifier);\n }\n return await verifyChallenge(dispatch.code, dispatch.verifier);\n};\n"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
+ import { EmailParams, OAuthParams, PhoneParams, ProviderParams } from "../shared/params.js";
1
2
  import { SignInFlowResult } from "../shared/results.js";
2
- import "../component/model.js";
3
3
  import { _default } from "../component/schema.js";
4
+ import "../component/model.js";
4
5
  import { AuthComponentApi } from "./component/api.js";
5
6
  import { CredentialsConfig } from "../providers/credentials.js";
6
7
  import { AuthEventHandlerMap, OidcClaims, SamlClaims, ScimRawAttributes } from "./events.js";
7
- import { GenericId, Infer, Value } from "convex/values";
8
- import { AnyDataModel, DataModelFromSchemaDefinition, DocumentByName, GenericActionCtx, GenericDataModel, GenericMutationCtx, TableNamesInDataModel } from "convex/server";
8
+ import { GenericId, GenericValidator, Infer, Value } from "convex/values";
9
+ import { AnyDataModel, DataModelFromSchemaDefinition, DocumentByName, GenericActionCtx, GenericDataModel, GenericMutationCtx, RegisteredAction, TableNamesInDataModel } from "convex/server";
9
10
 
10
11
  //#region src/server/types.d.ts
11
12
  /**
@@ -146,7 +147,7 @@ type ConvexAuthConfig<TExtend = {}> = {
146
147
  protocol: ConnectionHookProtocol;
147
148
  connectionId?: string;
148
149
  profile: ConnectionHookProfile;
149
- userId: string;
150
+ userId: GenericId<"User">;
150
151
  }) => Awaitable<void>;
151
152
  /**
152
153
  * Gate linking a sign-in onto an EXISTING user. Called when an SSO
@@ -161,7 +162,7 @@ type ConvexAuthConfig<TExtend = {}> = {
161
162
  protocol: ConnectionHookProtocol | "credentials";
162
163
  connectionId?: string;
163
164
  profile: ConnectionHookProfile;
164
- userId: string;
165
+ userId: GenericId<"User">;
165
166
  }) => Awaitable<boolean | void>;
166
167
  };
167
168
  };
@@ -273,13 +274,13 @@ type ConvexAuthConfig<TExtend = {}> = {
273
274
  *
274
275
  * Includes materialized provider configs plus optional config factories.
275
276
  */
276
- type AuthProviderConfig = OAuthMaterializedConfig | ConvexCredentialsConfig | (() => ConvexCredentialsConfig) | EmailConfig | (() => EmailConfig) | PhoneConfig | (() => PhoneConfig) | WebAuthnProviderConfig | (() => WebAuthnProviderConfig) | TotpProviderConfig | (() => TotpProviderConfig) | DeviceProviderConfig | (() => DeviceProviderConfig) | ConnectionProviderConfig;
277
+ type AuthProviderConfig = OAuthMaterializedConfig | ConvexCredentialsConfig<GenericDataModel, GenericValidator, string> | (() => ConvexCredentialsConfig<GenericDataModel, GenericValidator, string>) | EmailConfig<any, string> | (() => EmailConfig<any, string>) | PhoneConfig<any, string> | (() => PhoneConfig<any, string>) | WebAuthnProviderConfig | (() => WebAuthnProviderConfig) | TotpProviderConfig | (() => TotpProviderConfig) | DeviceProviderConfig | (() => DeviceProviderConfig) | ConnectionProviderConfig;
277
278
  /**
278
279
  * Minimal config stored for the Connection provider at runtime.
279
280
  * No options — connection configuration is entirely per-tenant runtime state.
280
281
  */
281
282
  interface ConnectionProviderConfig {
282
- id: string;
283
+ id: "connection";
283
284
  type: "connection";
284
285
  /**
285
286
  * Optional shared callback URI for all OIDC group connections.
@@ -305,7 +306,6 @@ type GroupConnectionAccountLinkingPolicy = "verifiedEmail" | "none" | "sameConne
305
306
  * - `"externalId"` — match by the SCIM `externalId` to reuse a previously provisioned user.
306
307
  * - `"none"` — always create a new user for each SCIM provision request.
307
308
  */
308
- type GroupConnectionScimReuseUserPolicy = "externalId" | "none";
309
309
  /**
310
310
  * Just-in-time provisioning mode for group Connection.
311
311
  *
@@ -322,13 +322,14 @@ type GroupConnectionJitProvisioningMode = "off" | "createUser" | "createUserAndM
322
322
  */
323
323
  type GroupConnectionDeprovisionMode = "soft" | "hard";
324
324
  type GroupConnectionProfileUpdateMode = "never" | "missing" | "always";
325
- type GroupConnectionProvisioningAuthority = "app" | "connection" | "scim";
325
+ /** The authority allowed to create and maintain identities for a connection. */
326
+ type GroupConnectionProvisioningAuthority = "app" | "scim";
326
327
  type GroupConnectionGroupSyncMode = "ignore" | "sync";
327
328
  type GroupConnectionRoleSyncMode = "ignore" | "map";
328
329
  /**
329
330
  * Effective group policy document stored for an Connection/SCIM tenant.
330
331
  *
331
- * Controls account linking, JIT provisioning, SCIM reuse behavior,
332
+ * Controls account linking, JIT provisioning, directory-managed identity lifecycle,
332
333
  * deprovisioning, and any app-defined extension metadata.
333
334
  *
334
335
  * @see {@link GroupConnectionPolicyPatch}
@@ -348,9 +349,6 @@ interface GroupConnectionPolicy {
348
349
  updateProfileFromScim: GroupConnectionProfileUpdateMode;
349
350
  authority: GroupConnectionProvisioningAuthority;
350
351
  };
351
- scimReuse: {
352
- user: GroupConnectionScimReuseUserPolicy;
353
- };
354
352
  jit: {
355
353
  mode: GroupConnectionJitProvisioningMode;
356
354
  defaultRoleIds: string[];
@@ -391,9 +389,6 @@ interface GroupConnectionPolicyPatch {
391
389
  updateProfileFromScim?: GroupConnectionProfileUpdateMode;
392
390
  authority?: GroupConnectionProvisioningAuthority;
393
391
  };
394
- scimReuse?: {
395
- user?: GroupConnectionScimReuseUserPolicy;
396
- };
397
392
  jit?: {
398
393
  mode?: GroupConnectionJitProvisioningMode;
399
394
  defaultRoleIds?: string[];
@@ -419,9 +414,9 @@ interface GroupConnectionPolicyPatch {
419
414
  *
420
415
  * @typeParam DataModel - The Convex data model for typed action contexts.
421
416
  */
422
- interface EmailConfig<DataModel extends GenericDataModel = GenericDataModel> {
417
+ interface EmailConfig<DataModel extends GenericDataModel = GenericDataModel, Id extends string = string> {
423
418
  /** Provider identifier (e.g. `"email"`, `"resend"`). */
424
- id: string;
419
+ id: Id;
425
420
  /** Discriminant for provider type routing. */
426
421
  type: "email";
427
422
  /** Display name for this provider. */
@@ -489,8 +484,8 @@ type EmailUserConfig<DataModel extends GenericDataModel = GenericDataModel> = Om
489
484
  *
490
485
  * @typeParam DataModel - The Convex data model for typed action contexts.
491
486
  */
492
- interface PhoneConfig<DataModel extends GenericDataModel = GenericDataModel> {
493
- id: string;
487
+ interface PhoneConfig<DataModel extends GenericDataModel = GenericDataModel, Id extends string = string> {
488
+ id: Id;
494
489
  type: "phone";
495
490
  /**
496
491
  * Token expiration in seconds.
@@ -553,9 +548,9 @@ type PhoneUserConfig<DataModel extends GenericDataModel = GenericDataModel> = Om
553
548
  *
554
549
  * @typeParam DataModel - The Convex data model used by the auth context.
555
550
  */
556
- type ConvexCredentialsConfig<DataModel extends GenericDataModel = GenericDataModel> = CredentialsConfig<DataModel> & {
551
+ type ConvexCredentialsConfig<DataModel extends GenericDataModel = GenericDataModel, ParamsValidator extends GenericValidator = GenericValidator, Id extends string = string> = CredentialsConfig<ParamsValidator, DataModel, Id> & {
557
552
  type: "credentials";
558
- id: string;
553
+ id: Id;
559
554
  };
560
555
  /** Persisted proof that a WebAuthn credential passed a trusted attestation policy. */
561
556
  interface WebAuthnAttestationEvidence {
@@ -581,7 +576,7 @@ interface WebAuthnAttestationPolicy {
581
576
  * Normalized configuration for the WebAuthn provider.
582
577
  */
583
578
  interface WebAuthnProviderConfig {
584
- id: string;
579
+ id: "webauthn";
585
580
  type: "webauthn";
586
581
  /**
587
582
  * Create a typed operation that replaces a user's passkeys during a provider
@@ -630,7 +625,7 @@ type WebAuthnRotateOperation = Readonly<{
630
625
  * Configuration for the TOTP two-factor authentication provider.
631
626
  */
632
627
  interface TotpProviderConfig {
633
- id: string;
628
+ id: "totp";
634
629
  type: "totp";
635
630
  options: {
636
631
  /** Issuer name shown in authenticator apps (e.g. "My App"). */issuer: string;
@@ -943,12 +938,12 @@ interface OIDCClaimMapping extends Pick<ConnectionProfileMapping, "subject" | "e
943
938
  /**
944
939
  * Materialized OAuth provider config.
945
940
  */
946
- interface OAuthMaterializedConfig {
941
+ interface OAuthMaterializedConfig<Id extends string = string> {
947
942
  /**
948
943
  * Provider identifier (e.g. `"google"`, `"github"`).
949
944
  * @readonly
950
945
  */
951
- readonly id: string;
946
+ readonly id: Id;
952
947
  /**
953
948
  * Discriminant for provider type routing.
954
949
  * @readonly
@@ -999,7 +994,7 @@ interface OAuthMaterializedConfig {
999
994
  * by displaying a short code that the user enters on a secondary device.
1000
995
  */
1001
996
  interface DeviceProviderConfig {
1002
- id: string;
997
+ id: "device";
1003
998
  type: "device";
1004
999
  /** User code character set. Default: `"BCDFGHJKLMNPQRSTVWXZ"` (base-20, no vowels). */
1005
1000
  charset: string;
@@ -1020,16 +1015,40 @@ interface DeviceProviderConfig {
1020
1015
  /**
1021
1016
  * Materialized auth provider config — the fully resolved form stored at runtime.
1022
1017
  */
1023
- type AuthProviderMaterializedConfig = OAuthMaterializedConfig | EmailConfig | PhoneConfig | ConvexCredentialsConfig | WebAuthnProviderConfig | TotpProviderConfig | DeviceProviderConfig | ConnectionProviderConfig;
1024
- type HasWebAuthnProvider<P extends AuthProviderConfig[]> = Extract<P[number], {
1025
- type: "webauthn";
1026
- }> extends never ? false : true;
1027
- type HasTotpProvider<P extends AuthProviderConfig[]> = Extract<P[number], {
1028
- type: "totp";
1029
- }> extends never ? false : true;
1030
- type HasDeviceProvider<P extends AuthProviderConfig[]> = Extract<P[number], {
1031
- type: "device";
1032
- }> extends never ? false : true;
1018
+ type AuthProviderMaterializedConfig = OAuthMaterializedConfig | EmailConfig<any, string> | PhoneConfig<any, string> | ConvexCredentialsConfig<GenericDataModel, GenericValidator, string> | WebAuthnProviderConfig | TotpProviderConfig | DeviceProviderConfig | ConnectionProviderConfig;
1019
+ type MaterializedProvider<P> = P extends (() => infer Provider) ? Provider : P;
1020
+ /** Parameters accepted by one configured provider at the public sign-in boundary. */
1021
+ type ProviderSignInParams<P> = MaterializedProvider<P> extends infer Provider ? Provider extends {
1022
+ type: "credentials";
1023
+ params: infer Params extends GenericValidator;
1024
+ } ? Infer<Params> : Provider extends EmailConfig<any, any> ? EmailParams : Provider extends PhoneConfig<any, any> ? PhoneParams : Provider extends OAuthMaterializedConfig ? OAuthParams | undefined : Provider extends ConnectionProviderConfig ? ProviderParams | undefined : Provider extends DeviceProviderConfig ? ProviderParams | undefined : Provider extends WebAuthnProviderConfig | TotpProviderConfig ? ProviderParams | undefined : never : never;
1025
+ type ProviderSignInEntry<P> = P extends unknown ? MaterializedProvider<P> extends infer Provider extends {
1026
+ id: string;
1027
+ } ? ProviderSignInParams<Provider> extends infer Params ? [Params] extends [never] ? {
1028
+ provider: Provider["id"];
1029
+ params: never;
1030
+ } : undefined extends Params ? {
1031
+ provider: Provider["id"];
1032
+ params?: Exclude<Params, undefined>;
1033
+ verifier?: string;
1034
+ continuation?: string;
1035
+ calledBy?: string;
1036
+ } : {
1037
+ provider: Provider["id"];
1038
+ params: Params;
1039
+ verifier?: string;
1040
+ continuation?: string;
1041
+ calledBy?: string;
1042
+ } : never : never : never;
1043
+ /** Provider-derived arguments exported by the configured `signIn` action. */
1044
+ type AuthSignInArgs<P extends readonly AuthProviderConfig[]> = ProviderSignInEntry<P[number]> | {
1045
+ provider?: undefined;
1046
+ params?: ProviderParams;
1047
+ verifier?: string;
1048
+ continuation?: string;
1049
+ refreshToken?: string;
1050
+ calledBy?: string;
1051
+ };
1033
1052
  /**
1034
1053
  * A single scope entry stored per API key.
1035
1054
  * Uses a resource:action pattern for structured permissions.
@@ -1072,9 +1091,9 @@ interface ScopeChecker {
1072
1091
  */
1073
1092
  interface KeyRecord {
1074
1093
  /** Document ID. */
1075
- _id: string;
1094
+ _id: GenericId<"ApiKey">;
1076
1095
  /** Owner user ID. */
1077
- userId: string;
1096
+ userId: GenericId<"User">;
1078
1097
  /** Display prefix (e.g. `"sk_abc1"`). Safe to show in UIs. */
1079
1098
  prefix: string;
1080
1099
  /** Human-readable name (e.g. "CI Pipeline"). */
@@ -1131,8 +1150,8 @@ type UserOrderBy = "_creationTime" | "email" | "phone";
1131
1150
  */
1132
1151
  interface HttpKeyContext {
1133
1152
  key: {
1134
- /** The user ID that owns the verified API key. */userId: string; /** The API key document ID. */
1135
- keyId: string; /** Scope checker for the verified key's permissions. */
1153
+ /** The user ID that owns the verified API key. */userId: GenericId<"User">; /** The API key document ID. */
1154
+ keyId: GenericId<"ApiKey">; /** Scope checker for the verified key's permissions. */
1136
1155
  scopes: ScopeChecker;
1137
1156
  };
1138
1157
  }
@@ -1163,7 +1182,8 @@ type Doc<T extends TableNamesInDataModel<AuthDataModel>> = GenericDoc<AuthDataMo
1163
1182
  /** Canonical identity claims mirrored into access tokens for Convex auth. */
1164
1183
  type SessionTokenIdentityClaims = {
1165
1184
  subject: GenericId<"User">;
1166
- sessionId: GenericId<"Session">;
1185
+ sessionId: GenericId<"Session">; /** Session epoch captured when this access token was issued. */
1186
+ sessionEpoch: number;
1167
1187
  name?: string;
1168
1188
  email?: string;
1169
1189
  emailVerified?: boolean;
@@ -1172,5 +1192,5 @@ type SessionTokenIdentityClaims = {
1172
1192
  phoneNumberVerified?: boolean;
1173
1193
  };
1174
1194
  //#endregion
1175
- export { AuthDataModel, AuthProviderConfig, AuthProviderContinueArgs, ConnectionProviderConfig, ConvexAuthConfig, ConvexAuthMaterializedConfig, ConvexCredentialsConfig, CorsConfig, DeviceProviderConfig, Doc, EmailConfig, EmailUserConfig, GenericActionCtxWithAuthConfig, GenericDoc, Grant, GroupConnectionPolicy, GroupConnectionPolicyPatch, HasDeviceProvider, HasTotpProvider, HasWebAuthnProvider, HttpKeyContext, KeyRecord, KeyScope, OAuthMaterializedConfig, OAuthProfile, OAuthTokens, OIDCClaimMapping, PermissionsConfig, PhoneConfig, PhoneUserConfig, RoleId, SAMLAttributeMapping, ScopeChecker, SessionTokenIdentityClaims, TotpProviderConfig, UserOrderBy, UserWhere, WebAuthnAttestationEvidence, WebAuthnAttestationPolicy, WebAuthnProviderConfig, WebAuthnRotateOperation };
1195
+ export { AuthDataModel, AuthProviderConfig, AuthProviderContinueArgs, AuthSignInArgs, ConnectionProviderConfig, ConvexAuthConfig, ConvexAuthMaterializedConfig, ConvexCredentialsConfig, CorsConfig, DeviceProviderConfig, Doc, EmailConfig, EmailUserConfig, GenericActionCtxWithAuthConfig, GenericDoc, Grant, GroupConnectionPolicy, GroupConnectionPolicyPatch, HttpKeyContext, KeyRecord, KeyScope, OAuthMaterializedConfig, OAuthProfile, OAuthTokens, OIDCClaimMapping, PermissionsConfig, PhoneConfig, PhoneUserConfig, RoleId, SAMLAttributeMapping, ScopeChecker, SessionTokenIdentityClaims, TotpProviderConfig, UserOrderBy, UserWhere, WebAuthnAttestationEvidence, WebAuthnAttestationPolicy, WebAuthnProviderConfig, WebAuthnRotateOperation };
1176
1196
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/server/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/server/types.ts"],"mappings":"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"}
@@ -21,7 +21,6 @@ function effectiveUserUpdateMode(source, policy, providerUpdateProfileOnLogin) {
21
21
  let mode = source === "login" ? policy?.updateProfileOnLogin ?? "missing" : policy?.updateProfileFromScim ?? "always";
22
22
  if (source === "login" && policy === void 0 && providerUpdateProfileOnLogin !== void 0) mode = providerUpdateProfileOnLogin === false ? "never" : "always";
23
23
  if (authority === "app") return mode === "never" ? "never" : "missing";
24
- if (authority === "connection" && source === "scim") return mode === "never" ? "never" : "missing";
25
24
  if (authority === "scim" && source === "login") return mode === "never" ? "never" : "missing";
26
25
  return mode;
27
26
  }