@robelest/convex-auth 0.0.1

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 (280) hide show
  1. package/README.md +6 -0
  2. package/dist/bin.cjs +27733 -0
  3. package/dist/client/index.d.ts +49 -0
  4. package/dist/client/index.d.ts.map +1 -0
  5. package/dist/client/index.js +283 -0
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/component/_generated/api.d.ts +36 -0
  8. package/dist/component/_generated/api.d.ts.map +1 -0
  9. package/dist/component/_generated/api.js +31 -0
  10. package/dist/component/_generated/api.js.map +1 -0
  11. package/dist/component/_generated/component.d.ts +295 -0
  12. package/dist/component/_generated/component.d.ts.map +1 -0
  13. package/dist/component/_generated/component.js +11 -0
  14. package/dist/component/_generated/component.js.map +1 -0
  15. package/dist/component/_generated/dataModel.d.ts +46 -0
  16. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  17. package/dist/component/_generated/dataModel.js +11 -0
  18. package/dist/component/_generated/dataModel.js.map +1 -0
  19. package/dist/component/_generated/server.d.ts +121 -0
  20. package/dist/component/_generated/server.d.ts.map +1 -0
  21. package/dist/component/_generated/server.js +78 -0
  22. package/dist/component/_generated/server.js.map +1 -0
  23. package/dist/component/convex.config.d.ts +3 -0
  24. package/dist/component/convex.config.d.ts.map +1 -0
  25. package/dist/component/convex.config.js +4 -0
  26. package/dist/component/convex.config.js.map +1 -0
  27. package/dist/component/index.d.ts +15 -0
  28. package/dist/component/index.d.ts.map +1 -0
  29. package/dist/component/index.js +13 -0
  30. package/dist/component/index.js.map +1 -0
  31. package/dist/component/public.d.ts +450 -0
  32. package/dist/component/public.d.ts.map +1 -0
  33. package/dist/component/public.js +528 -0
  34. package/dist/component/public.js.map +1 -0
  35. package/dist/component/schema.d.ts +107 -0
  36. package/dist/component/schema.d.ts.map +1 -0
  37. package/dist/component/schema.js +26 -0
  38. package/dist/component/schema.js.map +1 -0
  39. package/dist/providers/Anonymous.d.ts +50 -0
  40. package/dist/providers/Anonymous.d.ts.map +1 -0
  41. package/dist/providers/Anonymous.js +39 -0
  42. package/dist/providers/Anonymous.js.map +1 -0
  43. package/dist/providers/ConvexCredentials.d.ts +88 -0
  44. package/dist/providers/ConvexCredentials.d.ts.map +1 -0
  45. package/dist/providers/ConvexCredentials.js +37 -0
  46. package/dist/providers/ConvexCredentials.js.map +1 -0
  47. package/dist/providers/Email.d.ts +33 -0
  48. package/dist/providers/Email.d.ts.map +1 -0
  49. package/dist/providers/Email.js +50 -0
  50. package/dist/providers/Email.js.map +1 -0
  51. package/dist/providers/Password.d.ts +95 -0
  52. package/dist/providers/Password.d.ts.map +1 -0
  53. package/dist/providers/Password.js +174 -0
  54. package/dist/providers/Password.js.map +1 -0
  55. package/dist/providers/Phone.d.ts +22 -0
  56. package/dist/providers/Phone.d.ts.map +1 -0
  57. package/dist/providers/Phone.js +37 -0
  58. package/dist/providers/Phone.js.map +1 -0
  59. package/dist/server/convex_types.d.ts +17 -0
  60. package/dist/server/convex_types.d.ts.map +1 -0
  61. package/dist/server/convex_types.js +2 -0
  62. package/dist/server/convex_types.js.map +1 -0
  63. package/dist/server/cookies.d.ts +35 -0
  64. package/dist/server/cookies.d.ts.map +1 -0
  65. package/dist/server/cookies.js +34 -0
  66. package/dist/server/cookies.js.map +1 -0
  67. package/dist/server/implementation/db.d.ts +80 -0
  68. package/dist/server/implementation/db.d.ts.map +1 -0
  69. package/dist/server/implementation/db.js +59 -0
  70. package/dist/server/implementation/db.js.map +1 -0
  71. package/dist/server/implementation/index.d.ts +370 -0
  72. package/dist/server/implementation/index.d.ts.map +1 -0
  73. package/dist/server/implementation/index.js +521 -0
  74. package/dist/server/implementation/index.js.map +1 -0
  75. package/dist/server/implementation/mutations/createAccountFromCredentials.d.ts +33 -0
  76. package/dist/server/implementation/mutations/createAccountFromCredentials.d.ts.map +1 -0
  77. package/dist/server/implementation/mutations/createAccountFromCredentials.js +71 -0
  78. package/dist/server/implementation/mutations/createAccountFromCredentials.js.map +1 -0
  79. package/dist/server/implementation/mutations/createVerificationCode.d.ts +25 -0
  80. package/dist/server/implementation/mutations/createVerificationCode.d.ts.map +1 -0
  81. package/dist/server/implementation/mutations/createVerificationCode.js +84 -0
  82. package/dist/server/implementation/mutations/createVerificationCode.js.map +1 -0
  83. package/dist/server/implementation/mutations/index.d.ts +304 -0
  84. package/dist/server/implementation/mutations/index.d.ts.map +1 -0
  85. package/dist/server/implementation/mutations/index.js +108 -0
  86. package/dist/server/implementation/mutations/index.js.map +1 -0
  87. package/dist/server/implementation/mutations/invalidateSessions.d.ts +13 -0
  88. package/dist/server/implementation/mutations/invalidateSessions.d.ts.map +1 -0
  89. package/dist/server/implementation/mutations/invalidateSessions.js +35 -0
  90. package/dist/server/implementation/mutations/invalidateSessions.js.map +1 -0
  91. package/dist/server/implementation/mutations/modifyAccount.d.ts +23 -0
  92. package/dist/server/implementation/mutations/modifyAccount.d.ts.map +1 -0
  93. package/dist/server/implementation/mutations/modifyAccount.js +48 -0
  94. package/dist/server/implementation/mutations/modifyAccount.js.map +1 -0
  95. package/dist/server/implementation/mutations/refreshSession.d.ts +16 -0
  96. package/dist/server/implementation/mutations/refreshSession.d.ts.map +1 -0
  97. package/dist/server/implementation/mutations/refreshSession.js +116 -0
  98. package/dist/server/implementation/mutations/refreshSession.js.map +1 -0
  99. package/dist/server/implementation/mutations/retrieveAccountWithCredentials.d.ts +27 -0
  100. package/dist/server/implementation/mutations/retrieveAccountWithCredentials.d.ts.map +1 -0
  101. package/dist/server/implementation/mutations/retrieveAccountWithCredentials.js +55 -0
  102. package/dist/server/implementation/mutations/retrieveAccountWithCredentials.js.map +1 -0
  103. package/dist/server/implementation/mutations/signIn.d.ts +17 -0
  104. package/dist/server/implementation/mutations/signIn.d.ts.map +1 -0
  105. package/dist/server/implementation/mutations/signIn.js +26 -0
  106. package/dist/server/implementation/mutations/signIn.js.map +1 -0
  107. package/dist/server/implementation/mutations/signOut.d.ts +11 -0
  108. package/dist/server/implementation/mutations/signOut.d.ts.map +1 -0
  109. package/dist/server/implementation/mutations/signOut.js +24 -0
  110. package/dist/server/implementation/mutations/signOut.js.map +1 -0
  111. package/dist/server/implementation/mutations/userOAuth.d.ts +19 -0
  112. package/dist/server/implementation/mutations/userOAuth.d.ts.map +1 -0
  113. package/dist/server/implementation/mutations/userOAuth.js +84 -0
  114. package/dist/server/implementation/mutations/userOAuth.js.map +1 -0
  115. package/dist/server/implementation/mutations/verifier.d.ts +8 -0
  116. package/dist/server/implementation/mutations/verifier.d.ts.map +1 -0
  117. package/dist/server/implementation/mutations/verifier.js +19 -0
  118. package/dist/server/implementation/mutations/verifier.js.map +1 -0
  119. package/dist/server/implementation/mutations/verifierSignature.d.ts +15 -0
  120. package/dist/server/implementation/mutations/verifierSignature.d.ts.map +1 -0
  121. package/dist/server/implementation/mutations/verifierSignature.js +29 -0
  122. package/dist/server/implementation/mutations/verifierSignature.js.map +1 -0
  123. package/dist/server/implementation/mutations/verifyCodeAndSignIn.d.ts +21 -0
  124. package/dist/server/implementation/mutations/verifyCodeAndSignIn.d.ts.map +1 -0
  125. package/dist/server/implementation/mutations/verifyCodeAndSignIn.js +127 -0
  126. package/dist/server/implementation/mutations/verifyCodeAndSignIn.js.map +1 -0
  127. package/dist/server/implementation/provider.d.ts +6 -0
  128. package/dist/server/implementation/provider.d.ts.map +1 -0
  129. package/dist/server/implementation/provider.js +21 -0
  130. package/dist/server/implementation/provider.js.map +1 -0
  131. package/dist/server/implementation/rateLimit.d.ts +6 -0
  132. package/dist/server/implementation/rateLimit.d.ts.map +1 -0
  133. package/dist/server/implementation/rateLimit.js +76 -0
  134. package/dist/server/implementation/rateLimit.js.map +1 -0
  135. package/dist/server/implementation/redirects.d.ts +6 -0
  136. package/dist/server/implementation/redirects.d.ts.map +1 -0
  137. package/dist/server/implementation/redirects.js +40 -0
  138. package/dist/server/implementation/redirects.js.map +1 -0
  139. package/dist/server/implementation/refreshTokens.d.ts +40 -0
  140. package/dist/server/implementation/refreshTokens.d.ts.map +1 -0
  141. package/dist/server/implementation/refreshTokens.js +160 -0
  142. package/dist/server/implementation/refreshTokens.js.map +1 -0
  143. package/dist/server/implementation/sessions.d.ts +43 -0
  144. package/dist/server/implementation/sessions.d.ts.map +1 -0
  145. package/dist/server/implementation/sessions.js +94 -0
  146. package/dist/server/implementation/sessions.js.map +1 -0
  147. package/dist/server/implementation/signIn.d.ts +31 -0
  148. package/dist/server/implementation/signIn.d.ts.map +1 -0
  149. package/dist/server/implementation/signIn.js +148 -0
  150. package/dist/server/implementation/signIn.js.map +1 -0
  151. package/dist/server/implementation/tokens.d.ts +7 -0
  152. package/dist/server/implementation/tokens.d.ts.map +1 -0
  153. package/dist/server/implementation/tokens.js +18 -0
  154. package/dist/server/implementation/tokens.js.map +1 -0
  155. package/dist/server/implementation/types.d.ts +288 -0
  156. package/dist/server/implementation/types.d.ts.map +1 -0
  157. package/dist/server/implementation/types.js +182 -0
  158. package/dist/server/implementation/types.js.map +1 -0
  159. package/dist/server/implementation/users.d.ts +27 -0
  160. package/dist/server/implementation/users.d.ts.map +1 -0
  161. package/dist/server/implementation/users.js +181 -0
  162. package/dist/server/implementation/users.js.map +1 -0
  163. package/dist/server/implementation/utils.d.ts +17 -0
  164. package/dist/server/implementation/utils.d.ts.map +1 -0
  165. package/dist/server/implementation/utils.js +72 -0
  166. package/dist/server/implementation/utils.js.map +1 -0
  167. package/dist/server/index.d.ts +17 -0
  168. package/dist/server/index.d.ts.map +1 -0
  169. package/dist/server/index.js +54 -0
  170. package/dist/server/index.js.map +1 -0
  171. package/dist/server/oauth/authorizationUrl.d.ts +13 -0
  172. package/dist/server/oauth/authorizationUrl.d.ts.map +1 -0
  173. package/dist/server/oauth/authorizationUrl.js +91 -0
  174. package/dist/server/oauth/authorizationUrl.js.map +1 -0
  175. package/dist/server/oauth/callback.d.ts +19 -0
  176. package/dist/server/oauth/callback.d.ts.map +1 -0
  177. package/dist/server/oauth/callback.js +173 -0
  178. package/dist/server/oauth/callback.js.map +1 -0
  179. package/dist/server/oauth/checks.d.ts +52 -0
  180. package/dist/server/oauth/checks.d.ts.map +1 -0
  181. package/dist/server/oauth/checks.js +106 -0
  182. package/dist/server/oauth/checks.js.map +1 -0
  183. package/dist/server/oauth/convexAuth.d.ts +12 -0
  184. package/dist/server/oauth/convexAuth.d.ts.map +1 -0
  185. package/dist/server/oauth/convexAuth.js +137 -0
  186. package/dist/server/oauth/convexAuth.js.map +1 -0
  187. package/dist/server/oauth/lib/utils/customFetch.d.ts +9 -0
  188. package/dist/server/oauth/lib/utils/customFetch.d.ts.map +1 -0
  189. package/dist/server/oauth/lib/utils/customFetch.js +11 -0
  190. package/dist/server/oauth/lib/utils/customFetch.js.map +1 -0
  191. package/dist/server/oauth/lib/utils/providers.d.ts +3 -0
  192. package/dist/server/oauth/lib/utils/providers.d.ts.map +1 -0
  193. package/dist/server/oauth/lib/utils/providers.js +7 -0
  194. package/dist/server/oauth/lib/utils/providers.js.map +1 -0
  195. package/dist/server/oauth/providers/oauth.d.ts +43 -0
  196. package/dist/server/oauth/providers/oauth.d.ts.map +1 -0
  197. package/dist/server/oauth/providers/oauth.js +3 -0
  198. package/dist/server/oauth/providers/oauth.js.map +1 -0
  199. package/dist/server/oauth/types.d.ts +24 -0
  200. package/dist/server/oauth/types.d.ts.map +1 -0
  201. package/dist/server/oauth/types.js +5 -0
  202. package/dist/server/oauth/types.js.map +1 -0
  203. package/dist/server/provider_utils.d.ts +76 -0
  204. package/dist/server/provider_utils.d.ts.map +1 -0
  205. package/dist/server/provider_utils.js +177 -0
  206. package/dist/server/provider_utils.js.map +1 -0
  207. package/dist/server/types.d.ts +412 -0
  208. package/dist/server/types.d.ts.map +1 -0
  209. package/dist/server/types.js +2 -0
  210. package/dist/server/types.js.map +1 -0
  211. package/dist/server/utils.d.ts +3 -0
  212. package/dist/server/utils.d.ts.map +1 -0
  213. package/dist/server/utils.js +11 -0
  214. package/dist/server/utils.js.map +1 -0
  215. package/package.json +126 -0
  216. package/providers/Anonymous/package.json +6 -0
  217. package/providers/ConvexCredentials/package.json +6 -0
  218. package/providers/Email/package.json +6 -0
  219. package/providers/Password/package.json +6 -0
  220. package/providers/Phone/package.json +6 -0
  221. package/server/package.json +6 -0
  222. package/src/cli/command.ts +69 -0
  223. package/src/cli/generateKeys.ts +20 -0
  224. package/src/cli/index.ts +840 -0
  225. package/src/client/index.ts +415 -0
  226. package/src/component/_generated/api.ts +52 -0
  227. package/src/component/_generated/component.ts +586 -0
  228. package/src/component/_generated/dataModel.ts +60 -0
  229. package/src/component/_generated/server.ts +156 -0
  230. package/src/component/convex.config.ts +5 -0
  231. package/src/component/index.ts +40 -0
  232. package/src/component/public.ts +607 -0
  233. package/src/component/schema.ts +35 -0
  234. package/src/providers/Anonymous.ts +79 -0
  235. package/src/providers/ConvexCredentials.ts +108 -0
  236. package/src/providers/Email.ts +60 -0
  237. package/src/providers/Password.ts +253 -0
  238. package/src/providers/Phone.ts +46 -0
  239. package/src/server/convex_types.ts +55 -0
  240. package/src/server/cookies.ts +42 -0
  241. package/src/server/implementation/db.ts +125 -0
  242. package/src/server/implementation/index.ts +815 -0
  243. package/src/server/implementation/mutations/createAccountFromCredentials.ts +113 -0
  244. package/src/server/implementation/mutations/createVerificationCode.ts +139 -0
  245. package/src/server/implementation/mutations/index.ts +157 -0
  246. package/src/server/implementation/mutations/invalidateSessions.ts +47 -0
  247. package/src/server/implementation/mutations/modifyAccount.ts +65 -0
  248. package/src/server/implementation/mutations/refreshSession.ts +188 -0
  249. package/src/server/implementation/mutations/retrieveAccountWithCredentials.ts +87 -0
  250. package/src/server/implementation/mutations/signIn.ts +51 -0
  251. package/src/server/implementation/mutations/signOut.ts +38 -0
  252. package/src/server/implementation/mutations/userOAuth.ts +112 -0
  253. package/src/server/implementation/mutations/verifier.ts +29 -0
  254. package/src/server/implementation/mutations/verifierSignature.ts +44 -0
  255. package/src/server/implementation/mutations/verifyCodeAndSignIn.ts +205 -0
  256. package/src/server/implementation/provider.ts +38 -0
  257. package/src/server/implementation/rateLimit.ts +105 -0
  258. package/src/server/implementation/redirects.ts +58 -0
  259. package/src/server/implementation/refreshTokens.ts +221 -0
  260. package/src/server/implementation/sessions.ts +155 -0
  261. package/src/server/implementation/signIn.ts +253 -0
  262. package/src/server/implementation/tokens.ts +29 -0
  263. package/src/server/implementation/types.ts +220 -0
  264. package/src/server/implementation/users.ts +286 -0
  265. package/src/server/implementation/utils.ts +91 -0
  266. package/src/server/index.ts +74 -0
  267. package/src/server/oauth/NOTICE.txt +21 -0
  268. package/src/server/oauth/README.md +7 -0
  269. package/src/server/oauth/authorizationUrl.ts +113 -0
  270. package/src/server/oauth/callback.ts +243 -0
  271. package/src/server/oauth/checks.ts +136 -0
  272. package/src/server/oauth/convexAuth.ts +168 -0
  273. package/src/server/oauth/lib/utils/customFetch.ts +18 -0
  274. package/src/server/oauth/lib/utils/providers.ts +12 -0
  275. package/src/server/oauth/providers/oauth.ts +56 -0
  276. package/src/server/oauth/types.ts +60 -0
  277. package/src/server/provider_utils.ts +222 -0
  278. package/src/server/types.ts +470 -0
  279. package/src/server/utils.ts +12 -0
  280. package/src/test.ts +24 -0
@@ -0,0 +1,21 @@
1
+ import { Infer } from "convex/values";
2
+ import { ActionCtx, MutationCtx, SessionInfo } from "../types.js";
3
+ import * as Provider from "../provider.js";
4
+ export declare const verifyCodeAndSignInArgs: import("convex/values").VObject<{
5
+ provider?: string | undefined;
6
+ verifier?: string | undefined;
7
+ generateTokens: boolean;
8
+ params: any;
9
+ allowExtraProviders: boolean;
10
+ }, {
11
+ params: import("convex/values").VAny<any, "required", string>;
12
+ provider: import("convex/values").VString<string | undefined, "optional">;
13
+ verifier: import("convex/values").VString<string | undefined, "optional">;
14
+ generateTokens: import("convex/values").VBoolean<boolean, "required">;
15
+ allowExtraProviders: import("convex/values").VBoolean<boolean, "required">;
16
+ }, "required", "provider" | "verifier" | "generateTokens" | "params" | "allowExtraProviders" | `params.${string}`>;
17
+ type ReturnType = null | SessionInfo;
18
+ export declare function verifyCodeAndSignInImpl(ctx: MutationCtx, args: Infer<typeof verifyCodeAndSignInArgs>, getProviderOrThrow: Provider.GetProviderOrThrowFunc, config: Provider.Config): Promise<ReturnType>;
19
+ export declare const callVerifyCodeAndSignIn: (ctx: ActionCtx, args: Infer<typeof verifyCodeAndSignInArgs>) => Promise<ReturnType>;
20
+ export {};
21
+ //# sourceMappingURL=verifyCodeAndSignIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyCodeAndSignIn.d.ts","sourceRoot":"","sources":["../../../../src/server/implementation/mutations/verifyCodeAndSignIn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,EAAK,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMlE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAW3C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;kHAMlC,CAAC;AAEH,KAAK,UAAU,GAAG,IAAI,GAAG,WAAW,CAAC;AAErC,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,KAAK,CAAC,OAAO,uBAAuB,CAAC,EAC3C,kBAAkB,EAAE,QAAQ,CAAC,sBAAsB,EACnD,MAAM,EAAE,QAAQ,CAAC,MAAM,GACtB,OAAO,CAAC,UAAU,CAAC,CAkDrB;AAED,eAAO,MAAM,uBAAuB,GAClC,KAAK,SAAS,EACd,MAAM,KAAK,CAAC,OAAO,uBAAuB,CAAC,KAC1C,OAAO,CAAC,UAAU,CAOpB,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { v } from "convex/values";
2
+ import { isSignInRateLimited, recordFailedSignIn, resetSignInRateLimit, } from "../rateLimit.js";
3
+ import { createNewAndDeleteExistingSession, getAuthSessionId, maybeGenerateTokensForSession, } from "../sessions.js";
4
+ import { LOG_LEVELS, logWithLevel, sha256 } from "../utils.js";
5
+ import { upsertUserAndAccount } from "../users.js";
6
+ import { createAuthDb } from "../db.js";
7
+ export const verifyCodeAndSignInArgs = v.object({
8
+ params: v.any(),
9
+ provider: v.optional(v.string()),
10
+ verifier: v.optional(v.string()),
11
+ generateTokens: v.boolean(),
12
+ allowExtraProviders: v.boolean(),
13
+ });
14
+ export async function verifyCodeAndSignInImpl(ctx, args, getProviderOrThrow, config) {
15
+ logWithLevel(LOG_LEVELS.DEBUG, "verifyCodeAndSignInImpl args:", {
16
+ params: { email: args.params.email, phone: args.params.phone },
17
+ provider: args.provider,
18
+ verifier: args.verifier,
19
+ generateTokens: args.generateTokens,
20
+ allowExtraProviders: args.allowExtraProviders,
21
+ });
22
+ const { generateTokens, provider, allowExtraProviders } = args;
23
+ const identifier = args.params.email ?? args.params.phone;
24
+ if (identifier !== undefined) {
25
+ if (await isSignInRateLimited(ctx, identifier, config)) {
26
+ logWithLevel(LOG_LEVELS.ERROR, "Too many failed attempts to verify code for this email");
27
+ return null;
28
+ }
29
+ }
30
+ const verifyResult = await verifyCodeOnly(ctx, args, provider ?? null, getProviderOrThrow, allowExtraProviders, config, await getAuthSessionId(ctx));
31
+ if (verifyResult === null) {
32
+ if (identifier !== undefined) {
33
+ await recordFailedSignIn(ctx, identifier, config);
34
+ }
35
+ return null;
36
+ }
37
+ if (identifier !== undefined) {
38
+ await resetSignInRateLimit(ctx, identifier, config);
39
+ }
40
+ const { userId } = verifyResult;
41
+ const sessionId = await createNewAndDeleteExistingSession(ctx, config, userId);
42
+ return await maybeGenerateTokensForSession(ctx, config, userId, sessionId, generateTokens);
43
+ }
44
+ export const callVerifyCodeAndSignIn = async (ctx, args) => {
45
+ return ctx.runMutation("auth:store", {
46
+ args: {
47
+ type: "verifyCodeAndSignIn",
48
+ ...args,
49
+ },
50
+ });
51
+ };
52
+ async function verifyCodeOnly(ctx, args,
53
+ /**
54
+ * There are two providers at play:
55
+ * 1. the provider that generated the code
56
+ * 2. the provider the account is tied to.
57
+ * This is because we allow signing into an account
58
+ * via another provider, see {@link signInViaProvider}.
59
+ * This is the first provider.
60
+ */
61
+ methodProviderId, getProviderOrThrow, allowExtraProviders, config, sessionId) {
62
+ const authDb = config.component !== undefined ? createAuthDb(ctx, config.component) : null;
63
+ const { params, verifier } = args;
64
+ const codeHash = await sha256(params.code);
65
+ const verificationCode = authDb !== null
66
+ ? await authDb.verificationCodes.getByCode(codeHash)
67
+ : await ctx.db
68
+ .query("verification")
69
+ .withIndex("code", (q) => q.eq("code", codeHash))
70
+ .unique();
71
+ if (verificationCode === null) {
72
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid verification code");
73
+ return null;
74
+ }
75
+ if (authDb !== null) {
76
+ await authDb.verificationCodes.delete(verificationCode._id);
77
+ }
78
+ else {
79
+ await ctx.db.delete(verificationCode._id);
80
+ }
81
+ if (verificationCode.verifier !== verifier) {
82
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid verifier");
83
+ return null;
84
+ }
85
+ if (verificationCode.expirationTime < Date.now()) {
86
+ logWithLevel(LOG_LEVELS.ERROR, "Expired verification code");
87
+ return null;
88
+ }
89
+ const { accountId, emailVerified, phoneVerified } = verificationCode;
90
+ const account = authDb !== null ? await authDb.accounts.getById(accountId) : await ctx.db.get(accountId);
91
+ if (account === null) {
92
+ logWithLevel(LOG_LEVELS.ERROR, "Account associated with this email has been deleted");
93
+ return null;
94
+ }
95
+ if (methodProviderId !== null &&
96
+ verificationCode.provider !== methodProviderId) {
97
+ logWithLevel(LOG_LEVELS.ERROR, `Invalid provider "${methodProviderId}" for given \`code\`, ` +
98
+ `which was generated by provider "${verificationCode.provider}"`);
99
+ return null;
100
+ }
101
+ // OTP providers perform an additional check against the provided
102
+ // params.
103
+ const methodProvider = getProviderOrThrow(verificationCode.provider, allowExtraProviders);
104
+ if (methodProvider !== null &&
105
+ (methodProvider.type === "email" || methodProvider.type === "phone") &&
106
+ methodProvider.authorize !== undefined) {
107
+ await methodProvider.authorize(args.params, account);
108
+ }
109
+ let userId = account.userId;
110
+ const provider = getProviderOrThrow(account.provider);
111
+ if (!(provider.type === "oauth" || provider.type === "oidc")) {
112
+ ({ userId } = await upsertUserAndAccount(ctx, sessionId, { existingAccount: account }, {
113
+ type: "verification",
114
+ provider,
115
+ profile: {
116
+ ...(emailVerified !== undefined
117
+ ? { email: emailVerified, emailVerified: true }
118
+ : {}),
119
+ ...(phoneVerified !== undefined
120
+ ? { phone: phoneVerified, phoneVerified: true }
121
+ : {}),
122
+ },
123
+ }, config));
124
+ }
125
+ return { providerAccountId: account.providerAccountId, userId };
126
+ }
127
+ //# sourceMappingURL=verifyCodeAndSignIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyCodeAndSignIn.js","sourceRoot":"","sources":["../../../../src/server/implementation/mutations/verifyCodeAndSignIn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AuthProviderMaterializedConfig } from "../types.js";
2
+ export declare function hash(provider: any, secret: string): Promise<any>;
3
+ export declare function verify(provider: AuthProviderMaterializedConfig, secret: string, hash: string): Promise<boolean>;
4
+ export type GetProviderOrThrowFunc = (provider: string, allowExtraProviders?: boolean) => AuthProviderMaterializedConfig;
5
+ export type Config = any;
6
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAsB,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAWvD;AAED,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,8BAA8B,EACxC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,oBAYb;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,CAAC,EAAE,OAAO,KAC1B,8BAA8B,CAAC;AAEpC,MAAM,MAAM,MAAM,GAAG,GAAG,CAAC"}
@@ -0,0 +1,21 @@
1
+ export async function hash(provider, secret) {
2
+ if (provider.type !== "credentials") {
3
+ throw new Error(`Provider ${provider.id} is not a credentials provider`);
4
+ }
5
+ const hashSecretFn = provider.crypto?.hashSecret;
6
+ if (hashSecretFn === undefined) {
7
+ throw new Error(`Provider ${provider.id} does not have a \`crypto.hashSecret\` function`);
8
+ }
9
+ return await hashSecretFn(secret);
10
+ }
11
+ export async function verify(provider, secret, hash) {
12
+ if (provider.type !== "credentials") {
13
+ throw new Error(`Provider ${provider.id} is not a credentials provider`);
14
+ }
15
+ const verifySecretFn = provider.crypto?.verifySecret;
16
+ if (verifySecretFn === undefined) {
17
+ throw new Error(`Provider ${provider.id} does not have a \`crypto.verifySecret\` function`);
18
+ }
19
+ return await verifySecretFn(secret, hash);
20
+ }
21
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/server/implementation/provider.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,QAAa,EAAE,MAAc;IACtD,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,EAAE,gCAAgC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IACjD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,YAAY,QAAQ,CAAC,EAAE,iDAAiD,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,QAAwC,EACxC,MAAc,EACd,IAAY;IAEZ,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,EAAE,gCAAgC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IACrD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,YAAY,QAAQ,CAAC,EAAE,mDAAmD,CAC3E,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { ConvexAuthConfig } from "../types.js";
2
+ import { MutationCtx } from "./types.js";
3
+ export declare function isSignInRateLimited(ctx: MutationCtx, identifier: string, config: ConvexAuthConfig): Promise<boolean>;
4
+ export declare function recordFailedSignIn(ctx: MutationCtx, identifier: string, config: ConvexAuthConfig): Promise<void>;
5
+ export declare function resetSignInRateLimit(ctx: MutationCtx, identifier: string, config: ConvexAuthConfig): Promise<void>;
6
+ //# sourceMappingURL=rateLimit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAO,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,oBAOzB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,iBA+BzB;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,iBAYzB"}
@@ -0,0 +1,76 @@
1
+ import { createAuthDb } from "./db.js";
2
+ const DEFAULT_MAX_SIGN_IN_ATTEMPTS_PER_HOUR = 10;
3
+ export async function isSignInRateLimited(ctx, identifier, config) {
4
+ const state = await getRateLimitState(ctx, identifier, config);
5
+ if (state === null) {
6
+ return false;
7
+ }
8
+ return state.attempsLeft < 1;
9
+ }
10
+ export async function recordFailedSignIn(ctx, identifier, config) {
11
+ const state = await getRateLimitState(ctx, identifier, config);
12
+ if (state !== null) {
13
+ if (config.component !== undefined) {
14
+ await createAuthDb(ctx, config.component).rateLimits.patch(state.limit._id, {
15
+ attemptsLeft: state.attempsLeft - 1,
16
+ lastAttemptTime: Date.now(),
17
+ });
18
+ }
19
+ else {
20
+ await ctx.db.patch(state.limit._id, {
21
+ attemptsLeft: state.attempsLeft - 1,
22
+ lastAttemptTime: Date.now(),
23
+ });
24
+ }
25
+ }
26
+ else {
27
+ const maxAttempsPerHour = configuredMaxAttempsPerHour(config);
28
+ if (config.component !== undefined) {
29
+ await createAuthDb(ctx, config.component).rateLimits.create({
30
+ identifier,
31
+ attemptsLeft: maxAttempsPerHour - 1,
32
+ lastAttemptTime: Date.now(),
33
+ });
34
+ }
35
+ else {
36
+ await ctx.db.insert("limit", {
37
+ identifier,
38
+ attemptsLeft: maxAttempsPerHour - 1,
39
+ lastAttemptTime: Date.now(),
40
+ });
41
+ }
42
+ }
43
+ }
44
+ export async function resetSignInRateLimit(ctx, identifier, config) {
45
+ const existingState = await getRateLimitState(ctx, identifier, config);
46
+ if (existingState !== null) {
47
+ if (config.component !== undefined) {
48
+ await createAuthDb(ctx, config.component).rateLimits.delete(existingState.limit._id);
49
+ }
50
+ else {
51
+ await ctx.db.delete(existingState.limit._id);
52
+ }
53
+ }
54
+ }
55
+ async function getRateLimitState(ctx, identifier, config) {
56
+ const now = Date.now();
57
+ const maxAttempsPerHour = configuredMaxAttempsPerHour(config);
58
+ const limit = config.component !== undefined
59
+ ? (await createAuthDb(ctx, config.component).rateLimits.get(identifier))
60
+ : await ctx.db
61
+ .query("limit")
62
+ .withIndex("identifier", (q) => q.eq("identifier", identifier))
63
+ .unique();
64
+ if (limit === null) {
65
+ return null;
66
+ }
67
+ const elapsed = now - limit.lastAttemptTime;
68
+ const maxAttempsPerMs = maxAttempsPerHour / (60 * 60 * 1000);
69
+ const attempsLeft = Math.min(maxAttempsPerHour, limit.attemptsLeft + elapsed * maxAttempsPerMs);
70
+ return { limit, attempsLeft };
71
+ }
72
+ function configuredMaxAttempsPerHour(config) {
73
+ return (config.signIn?.maxFailedAttempsPerHour ??
74
+ DEFAULT_MAX_SIGN_IN_ATTEMPTS_PER_HOUR);
75
+ }
76
+ //# sourceMappingURL=rateLimit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../../src/server/implementation/rateLimit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ConvexAuthMaterializedConfig } from "../types.js";
2
+ export declare function redirectAbsoluteUrl(config: ConvexAuthMaterializedConfig, params: {
3
+ redirectTo: unknown;
4
+ }): Promise<string>;
5
+ export declare function setURLSearchParam(absoluteUrl: string, param: string, value: string): string;
6
+ //# sourceMappingURL=redirects.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,40 @@
1
+ import { requireEnv } from "../utils.js";
2
+ export async function redirectAbsoluteUrl(config, params) {
3
+ if (params.redirectTo !== undefined) {
4
+ if (typeof params.redirectTo !== "string") {
5
+ throw new Error(`Expected \`redirectTo\` to be a string, got ${params.redirectTo}`);
6
+ }
7
+ const redirectCallback = config.callbacks?.redirect ?? defaultRedirectCallback;
8
+ return await redirectCallback(params);
9
+ }
10
+ return siteUrl();
11
+ }
12
+ async function defaultRedirectCallback({ redirectTo }) {
13
+ const baseUrl = siteUrl();
14
+ if (redirectTo.startsWith("?") || redirectTo.startsWith("/")) {
15
+ return `${baseUrl}${redirectTo}`;
16
+ }
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()}`);
24
+ }
25
+ // Temporary work-around because Convex doesn't support
26
+ // schemes other than http and https.
27
+ export function setURLSearchParam(absoluteUrl, param, value) {
28
+ const pattern = /([^:]+):(.*)/;
29
+ const [, scheme, rest] = absoluteUrl.match(pattern);
30
+ const hasNoDomain = /^\/\/(?:\/|$|\?)/.test(rest);
31
+ const startsWithPath = hasNoDomain && rest.startsWith("///");
32
+ const url = new URL(`http:${hasNoDomain ? "//googblibok" + rest.slice(2) : rest}`);
33
+ url.searchParams.set(param, value);
34
+ const [, , withParam] = url.toString().match(pattern);
35
+ return `${scheme}:${hasNoDomain ? (startsWithPath ? "/" : "") + "//" + withParam.slice(13) : withParam}`;
36
+ }
37
+ function siteUrl() {
38
+ return requireEnv("SITE_URL").replace(/\/$/, "");
39
+ }
40
+ //# sourceMappingURL=redirects.js.map
@@ -0,0 +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"}
@@ -0,0 +1,40 @@
1
+ import { GenericId } from "convex/values";
2
+ import { ConvexAuthConfig } from "../types.js";
3
+ import { Doc, MutationCtx } from "./types.js";
4
+ export declare const REFRESH_TOKEN_REUSE_WINDOW_MS: number;
5
+ export declare function createRefreshToken(ctx: MutationCtx, config: ConvexAuthConfig, sessionId: GenericId<"session">, parentRefreshTokenId: GenericId<"token"> | null): Promise<GenericId<"token">>;
6
+ export declare const formatRefreshToken: (refreshTokenId: GenericId<"token">, sessionId: GenericId<"session">) => string;
7
+ export declare const parseRefreshToken: (refreshToken: string) => {
8
+ refreshTokenId: GenericId<"token">;
9
+ sessionId: GenericId<"session">;
10
+ };
11
+ /**
12
+ * Mark all refresh tokens descending from the given refresh token as invalid immediately.
13
+ * This is used when we detect an invalid use of a refresh token, and want to revoke
14
+ * the entire tree.
15
+ *
16
+ * @param ctx
17
+ * @param refreshToken
18
+ */
19
+ export declare function invalidateRefreshTokensInSubtree(ctx: MutationCtx, refreshToken: Doc<"token">, config: ConvexAuthConfig): Promise<Doc<"token">[]>;
20
+ export declare function deleteAllRefreshTokens(ctx: MutationCtx, sessionId: GenericId<"session">, config: ConvexAuthConfig): Promise<void>;
21
+ export declare function refreshTokenIfValid(ctx: MutationCtx, refreshTokenId: string, tokenSessionId: string, config: ConvexAuthConfig): Promise<{
22
+ session: Doc<"session">;
23
+ refreshTokenDoc: Doc<"token">;
24
+ } | null>;
25
+ /**
26
+ * The active refresh token is the most recently created refresh token that has
27
+ * never been used.
28
+ *
29
+ * @param ctx
30
+ * @param sessionId
31
+ */
32
+ export declare function loadActiveRefreshToken(ctx: MutationCtx, sessionId: GenericId<"session">, config: ConvexAuthConfig): Promise<{
33
+ _id: GenericId<"token">;
34
+ _creationTime: number;
35
+ firstUsedTime?: number | undefined;
36
+ parentRefreshTokenId?: GenericId<"token"> | undefined;
37
+ expirationTime: number;
38
+ sessionId: GenericId<"session">;
39
+ } | null>;
40
+ //# sourceMappingURL=refreshTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshTokens.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/refreshTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW9C,eAAO,MAAM,6BAA6B,QAAY,CAAC;AACvD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,EAC/B,oBAAoB,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,+BAoBhD;AAED,eAAO,MAAM,kBAAkB,GAC7B,gBAAgB,SAAS,CAAC,OAAO,CAAC,EAClC,WAAW,SAAS,CAAC,SAAS,CAAC,WAGhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,cAAc,MAAM,KACnB;IACD,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAUjC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,EAC1B,MAAM,EAAE,gBAAgB,2BA8CzB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,EAC/B,MAAM,EAAE,gBAAgB,iBAezB;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,WAAW,EAChB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,gBAAgB;;;UAkDzB;AACD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,EAC/B,MAAM,EAAE,gBAAgB;;;;;;;UAazB"}
@@ -0,0 +1,160 @@
1
+ import { LOG_LEVELS, REFRESH_TOKEN_DIVIDER, logWithLevel, maybeRedact, stringToNumber, } from "./utils.js";
2
+ import { createAuthDb } from "./db.js";
3
+ const DEFAULT_SESSION_INACTIVE_DURATION_MS = 1000 * 60 * 60 * 24 * 30; // 30 days
4
+ export const REFRESH_TOKEN_REUSE_WINDOW_MS = 10 * 1000; // 10 seconds
5
+ export async function createRefreshToken(ctx, config, sessionId, parentRefreshTokenId) {
6
+ const expirationTime = Date.now() +
7
+ (config.session?.inactiveDurationMs ??
8
+ stringToNumber(process.env.AUTH_SESSION_INACTIVE_DURATION_MS) ??
9
+ DEFAULT_SESSION_INACTIVE_DURATION_MS);
10
+ if (config.component !== undefined) {
11
+ return (await createAuthDb(ctx, config.component).refreshTokens.create({
12
+ sessionId,
13
+ expirationTime,
14
+ parentRefreshTokenId: parentRefreshTokenId ?? undefined,
15
+ }));
16
+ }
17
+ const newRefreshTokenId = await ctx.db.insert("token", {
18
+ sessionId,
19
+ expirationTime,
20
+ parentRefreshTokenId: parentRefreshTokenId ?? undefined,
21
+ });
22
+ return newRefreshTokenId;
23
+ }
24
+ export const formatRefreshToken = (refreshTokenId, sessionId) => {
25
+ return `${refreshTokenId}${REFRESH_TOKEN_DIVIDER}${sessionId}`;
26
+ };
27
+ export const parseRefreshToken = (refreshToken) => {
28
+ const [refreshTokenId, sessionId] = refreshToken.split(REFRESH_TOKEN_DIVIDER);
29
+ if (!refreshTokenId || !sessionId) {
30
+ throw new Error(`Can't parse refresh token: ${maybeRedact(refreshToken)}`);
31
+ }
32
+ return {
33
+ refreshTokenId: refreshTokenId,
34
+ sessionId: sessionId,
35
+ };
36
+ };
37
+ /**
38
+ * Mark all refresh tokens descending from the given refresh token as invalid immediately.
39
+ * This is used when we detect an invalid use of a refresh token, and want to revoke
40
+ * the entire tree.
41
+ *
42
+ * @param ctx
43
+ * @param refreshToken
44
+ */
45
+ export async function invalidateRefreshTokensInSubtree(ctx, refreshToken, config) {
46
+ const authDb = config.component !== undefined ? createAuthDb(ctx, config.component) : null;
47
+ const tokensToInvalidate = [refreshToken];
48
+ let frontier = [refreshToken._id];
49
+ while (frontier.length > 0) {
50
+ const nextFrontier = [];
51
+ for (const currentTokenId of frontier) {
52
+ const children = authDb !== null
53
+ ? (await authDb.refreshTokens.getChildren(refreshToken.sessionId, currentTokenId))
54
+ : await ctx.db
55
+ .query("token")
56
+ .withIndex("sessionIdAndParentRefreshTokenId", (q) => q
57
+ .eq("sessionId", refreshToken.sessionId)
58
+ .eq("parentRefreshTokenId", currentTokenId))
59
+ .collect();
60
+ tokensToInvalidate.push(...children);
61
+ nextFrontier.push(...children.map((child) => child._id));
62
+ }
63
+ frontier = nextFrontier;
64
+ }
65
+ for (const token of tokensToInvalidate) {
66
+ // Mark these as used so they can't be used again (even within the reuse window)
67
+ if (token.firstUsedTime === undefined ||
68
+ token.firstUsedTime > Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS) {
69
+ if (authDb !== null) {
70
+ await authDb.refreshTokens.patch(token._id, {
71
+ firstUsedTime: Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS,
72
+ });
73
+ }
74
+ else {
75
+ await ctx.db.patch(token._id, {
76
+ firstUsedTime: Date.now() - REFRESH_TOKEN_REUSE_WINDOW_MS,
77
+ });
78
+ }
79
+ }
80
+ }
81
+ return tokensToInvalidate;
82
+ }
83
+ export async function deleteAllRefreshTokens(ctx, sessionId, config) {
84
+ if (config.component !== undefined) {
85
+ await createAuthDb(ctx, config.component).refreshTokens.deleteAll(sessionId);
86
+ return;
87
+ }
88
+ const existingRefreshTokens = await ctx.db
89
+ .query("token")
90
+ .withIndex("sessionIdAndParentRefreshTokenId", (q) => q.eq("sessionId", sessionId))
91
+ .collect();
92
+ for (const refreshTokenDoc of existingRefreshTokens) {
93
+ await ctx.db.delete(refreshTokenDoc._id);
94
+ }
95
+ }
96
+ export async function refreshTokenIfValid(ctx, refreshTokenId, tokenSessionId, config) {
97
+ const authDb = config.component !== undefined ? createAuthDb(ctx, config.component) : null;
98
+ let refreshTokenDoc;
99
+ try {
100
+ refreshTokenDoc =
101
+ authDb !== null
102
+ ? (await authDb.refreshTokens.getById(refreshTokenId))
103
+ : await ctx.db.get(refreshTokenId);
104
+ }
105
+ catch {
106
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token format");
107
+ return null;
108
+ }
109
+ if (refreshTokenDoc === null) {
110
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token");
111
+ return null;
112
+ }
113
+ if (refreshTokenDoc.expirationTime < Date.now()) {
114
+ logWithLevel(LOG_LEVELS.ERROR, "Expired refresh token");
115
+ return null;
116
+ }
117
+ if (refreshTokenDoc.sessionId !== tokenSessionId) {
118
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token session ID");
119
+ return null;
120
+ }
121
+ let session;
122
+ try {
123
+ session =
124
+ authDb !== null
125
+ ? (await authDb.sessions.getById(refreshTokenDoc.sessionId))
126
+ : await ctx.db.get(refreshTokenDoc.sessionId);
127
+ }
128
+ catch {
129
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token session format");
130
+ return null;
131
+ }
132
+ if (session === null) {
133
+ logWithLevel(LOG_LEVELS.ERROR, "Invalid refresh token session");
134
+ return null;
135
+ }
136
+ if (session.expirationTime < Date.now()) {
137
+ logWithLevel(LOG_LEVELS.ERROR, "Expired refresh token session");
138
+ return null;
139
+ }
140
+ return { session, refreshTokenDoc };
141
+ }
142
+ /**
143
+ * The active refresh token is the most recently created refresh token that has
144
+ * never been used.
145
+ *
146
+ * @param ctx
147
+ * @param sessionId
148
+ */
149
+ export async function loadActiveRefreshToken(ctx, sessionId, config) {
150
+ if (config.component !== undefined) {
151
+ return (await createAuthDb(ctx, config.component).refreshTokens.getActive(sessionId));
152
+ }
153
+ return ctx.db
154
+ .query("token")
155
+ .withIndex("sessionId", (q) => q.eq("sessionId", sessionId))
156
+ .filter((q) => q.eq(q.field("firstUsedTime"), undefined))
157
+ .order("desc")
158
+ .first();
159
+ }
160
+ //# sourceMappingURL=refreshTokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshTokens.js","sourceRoot":"","sources":["../../../src/server/implementation/refreshTokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { GenericId } from "convex/values";
2
+ import { ConvexAuthConfig } from "../types.js";
3
+ import { Doc, MutationCtx, SessionInfo } from "./types.js";
4
+ import { Auth } from "convex/server";
5
+ export declare function maybeGenerateTokensForSession(ctx: MutationCtx, config: ConvexAuthConfig, userId: GenericId<"user">, sessionId: GenericId<"session">, generateTokens: boolean): Promise<SessionInfo>;
6
+ export declare function createNewAndDeleteExistingSession(ctx: MutationCtx, config: ConvexAuthConfig, userId: GenericId<"user">): Promise<GenericId<"session">>;
7
+ export declare function generateTokensForSession(ctx: MutationCtx, config: ConvexAuthConfig, args: {
8
+ userId: GenericId<"user">;
9
+ sessionId: GenericId<"session">;
10
+ issuedRefreshTokenId: GenericId<"token"> | null;
11
+ parentRefreshTokenId: GenericId<"token"> | null;
12
+ }): Promise<{
13
+ token: string;
14
+ refreshToken: string;
15
+ }>;
16
+ export declare function deleteSession(ctx: MutationCtx, session: Doc<"session">, config: ConvexAuthConfig): Promise<void>;
17
+ /**
18
+ * Return the current session ID.
19
+ *
20
+ * ```ts filename="convex/myFunctions.tsx"
21
+ * import { mutation } from "./_generated/server";
22
+ * import { getAuthSessionId } from "@robelest/convex-auth/component";
23
+ *
24
+ * export const doSomething = mutation({
25
+ * args: {/* ... *\/},
26
+ * handler: async (ctx, args) => {
27
+ * const sessionId = await getAuthSessionId(ctx);
28
+ * if (sessionId === null) {
29
+ * throw new Error("Client is not authenticated!")
30
+ * }
31
+ * const session = await ctx.db.get(sessionId);
32
+ * // ...
33
+ * },
34
+ * });
35
+ * ```
36
+ *
37
+ * @param ctx query, mutation or action `ctx`
38
+ * @returns the session ID or `null` if the client isn't authenticated
39
+ */
40
+ export declare function getAuthSessionId(ctx: {
41
+ auth: Auth;
42
+ }): Promise<GenericId<"session"> | null>;
43
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/server/implementation/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAkBrC,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EACzB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,EAC/B,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,WAAW,CAAC,CAatB;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,iCAe1B;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IACJ,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAChC,oBAAoB,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,oBAAoB,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACjD;;;GAoBF;AAqBD,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,EACvB,MAAM,EAAE,gBAAgB,iBAQzB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,wCAOzD"}