@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,91 @@
1
+ // This file corresponds to packages/core/src/lib/actions/signin/authorization-url.ts in the @auth/core package (commit 5af1f30a32e64591abc50ae4d2dba4682e525431).
2
+ import * as checks from "./checks.js";
3
+ import { callbackUrl, getAuthorizationSignature, } from "./convexAuth.js";
4
+ import { logWithLevel } from "../implementation/utils.js";
5
+ /**
6
+ * Generates an authorization/request token URL.
7
+ *
8
+ * [OAuth 2](https://www.oauth.com/oauth2-servers/authorization/the-authorization-request/)
9
+ */
10
+ export async function getAuthorizationUrl(
11
+ // ConvexAuth: we don't accept a query argument
12
+ options) {
13
+ const { provider } = options;
14
+ let url = provider.authorization?.url;
15
+ // ConvexAuth: ConvexAuth does slightly different logic to determine the authorization endpoint
16
+ const { as, authorization: authorizationEndpoint, configSource } = provider;
17
+ if (!authorizationEndpoint) {
18
+ throw new TypeError("Could not determine the authorization endpoint.");
19
+ }
20
+ if (!url) {
21
+ url = new URL(authorizationEndpoint.url);
22
+ }
23
+ const authParams = url.searchParams;
24
+ // ConvexAuth: The logic for the callback URL is different from Auth.js
25
+ const redirect_uri = callbackUrl(provider.id);
26
+ // TODO(ConvexAuth): Support redirect proxy URLs.
27
+ // If we do so, update state.create to take the data value as an origin parameter (see the Auth.js code for ref).
28
+ // let data: string | undefined;
29
+ // if (!options.isOnRedirectProxy && provider.redirectProxyUrl) {
30
+ // redirect_uri = provider.redirectProxyUrl;
31
+ // data = provider.callbackUrl;
32
+ // logger.debug("using redirect proxy", { redirect_uri, data });
33
+ // }
34
+ const params = Object.assign({
35
+ response_type: "code",
36
+ // clientId can technically be undefined, should we check this in assert.ts or rely on the Authorization Server to do it?
37
+ client_id: provider.clientId,
38
+ redirect_uri,
39
+ // @ts-expect-error TODO:
40
+ ...provider.authorization?.params,
41
+ }, Object.fromEntries(url.searchParams.entries() ?? []));
42
+ for (const k in params)
43
+ authParams.set(k, params[k]);
44
+ const cookies = [];
45
+ // ConvexAuth: no value passed for `origin` (Auth.js uses `data` from above)
46
+ const state = await checks.state.create(options);
47
+ if (state) {
48
+ authParams.set("state", state.value);
49
+ cookies.push(state.cookie);
50
+ }
51
+ // ConvexAuth: We need to save the value of the codeVerifier.
52
+ let codeVerifier;
53
+ if (provider.checks?.includes("pkce")) {
54
+ // ConvexAuth: we check where the config came from to help decide which branch to take here
55
+ if (configSource === "discovered" && !as.code_challenge_methods_supported?.includes("S256")) {
56
+ // We assume S256 PKCE support, if the server does not advertise that,
57
+ // a random `nonce` must be used for CSRF protection.
58
+ if (provider.type === "oidc")
59
+ provider.checks = ["nonce"];
60
+ }
61
+ else {
62
+ const pkce = await checks.pkce.create(options);
63
+ authParams.set("code_challenge", pkce.codeChallenge);
64
+ authParams.set("code_challenge_method", "S256");
65
+ cookies.push(pkce.cookie);
66
+ codeVerifier = pkce.codeVerifier;
67
+ }
68
+ }
69
+ const nonce = await checks.nonce.create(options);
70
+ if (nonce) {
71
+ authParams.set("nonce", nonce.value);
72
+ cookies.push(nonce.cookie);
73
+ }
74
+ // TODO: This does not work in normalizeOAuth because authorization endpoint can come from discovery
75
+ // Need to make normalizeOAuth async
76
+ if (provider.type === "oidc" && !url.searchParams.has("scope")) {
77
+ url.searchParams.set("scope", "openid profile email");
78
+ }
79
+ logWithLevel("DEBUG", "authorization url is ready", {
80
+ url,
81
+ cookies,
82
+ provider,
83
+ });
84
+ const convexAuthSignature = getAuthorizationSignature({
85
+ codeVerifier,
86
+ state: authParams.get("state") ?? undefined,
87
+ nonce: authParams.get("nonce") ?? undefined,
88
+ });
89
+ return { redirect: url.toString(), cookies, signature: convexAuthSignature };
90
+ }
91
+ //# sourceMappingURL=authorizationUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizationUrl.js","sourceRoot":"","sources":["../../../src/server/oauth/authorizationUrl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { InternalOptions } from "./types.js";
2
+ import { Cookie } from "@auth/core/lib/utils/cookie.js";
3
+ import { Account, Profile, TokenSet } from "@auth/core/types.js";
4
+ /**
5
+ * Handles the following OAuth steps.
6
+ * https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1
7
+ * https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3
8
+ * https://openid.net/specs/openid-connect-core-1_0.html#UserInfoRequest
9
+ *
10
+ * @note Although requesting userinfo is not required by the OAuth2.0 spec,
11
+ * we fetch it anyway. This is because we always want a user profile.
12
+ */
13
+ export declare function handleOAuth(params: Record<string, string>, cookies: Record<string, string | undefined>, options: InternalOptions<"oauth" | "oidc">): Promise<{
14
+ profile: Profile;
15
+ tokens: TokenSet & Pick<Account, "expires_at">;
16
+ cookies: Cookie[];
17
+ signature: string;
18
+ }>;
19
+ //# sourceMappingURL=callback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback.d.ts","sourceRoot":"","sources":["../../../src/server/oauth/callback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAsBjE;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAE/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAE9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,OAAO,EAAE,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,GACzC,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAgMD"}
@@ -0,0 +1,173 @@
1
+ // This maps to packages/core/src/lib/actions/callback/oauth/callback.ts in the @auth/core package (commit 5af1f30a32e64591abc50ae4d2dba4682e525431)
2
+ import * as checks from "./checks.js";
3
+ import * as o from "oauth4webapi";
4
+ import { fetchOpt } from "./lib/utils/customFetch.js";
5
+ import { logWithLevel } from "../implementation/utils.js";
6
+ import { isOIDCProvider } from "./lib/utils/providers.js";
7
+ import { callbackUrl, getAuthorizationSignature, } from "./convexAuth.js";
8
+ function formUrlEncode(token) {
9
+ return encodeURIComponent(token).replace(/%20/g, "+");
10
+ }
11
+ /**
12
+ * Formats client_id and client_secret as an HTTP Basic Authentication header as per the OAuth 2.0
13
+ * specified in RFC6749.
14
+ */
15
+ function clientSecretBasic(clientId, clientSecret) {
16
+ const username = formUrlEncode(clientId);
17
+ const password = formUrlEncode(clientSecret);
18
+ const credentials = btoa(`${username}:${password}`);
19
+ return `Basic ${credentials}`;
20
+ }
21
+ /**
22
+ * Handles the following OAuth steps.
23
+ * https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1
24
+ * https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3
25
+ * https://openid.net/specs/openid-connect-core-1_0.html#UserInfoRequest
26
+ *
27
+ * @note Although requesting userinfo is not required by the OAuth2.0 spec,
28
+ * we fetch it anyway. This is because we always want a user profile.
29
+ */
30
+ export async function handleOAuth(
31
+ // ConvexAuth: `params` is a Record<string, string> instead of RequestInternal["query"]
32
+ params,
33
+ // ConvexAuth: `cookies` is a Record<string, string | undefined> instead of RequestInternal["cookies"]
34
+ cookies, options) {
35
+ const { provider } = options;
36
+ // ConvexAuth: The `token` property is not used here
37
+ const { userinfo, as } = provider;
38
+ const client = {
39
+ client_id: provider.clientId,
40
+ ...provider.client,
41
+ };
42
+ let clientAuth;
43
+ switch (client.token_endpoint_auth_method) {
44
+ // TODO: in the next breaking major version have undefined be `client_secret_post`
45
+ case undefined:
46
+ case "client_secret_basic":
47
+ // TODO: in the next breaking major version use o.ClientSecretBasic() here
48
+ clientAuth = (_as, _client, _body, headers) => {
49
+ headers.set("authorization", clientSecretBasic(provider.clientId, provider.clientSecret));
50
+ };
51
+ break;
52
+ case "client_secret_post":
53
+ clientAuth = o.ClientSecretPost(provider.clientSecret);
54
+ break;
55
+ case "client_secret_jwt":
56
+ clientAuth = o.ClientSecretJwt(provider.clientSecret);
57
+ break;
58
+ case "private_key_jwt":
59
+ clientAuth = o.PrivateKeyJwt(provider.token.clientPrivateKey, {
60
+ // TODO: review in the next breaking change
61
+ [o.modifyAssertion](_header, payload) {
62
+ payload.aud = [as.issuer, as.token_endpoint];
63
+ },
64
+ });
65
+ break;
66
+ default:
67
+ throw new Error("unsupported client authentication method");
68
+ }
69
+ const resCookies = [];
70
+ const state = await checks.state.use(cookies, resCookies, options);
71
+ let codeGrantParams;
72
+ try {
73
+ codeGrantParams = o.validateAuthResponse(as, client, new URLSearchParams(params), provider.checks.includes("state") ? state : o.skipStateCheck);
74
+ }
75
+ catch (err) {
76
+ if (err instanceof o.AuthorizationResponseError) {
77
+ const cause = {
78
+ providerId: provider.id,
79
+ ...Object.fromEntries(err.cause.entries()),
80
+ };
81
+ logWithLevel("DEBUG", "OAuthCallbackError", cause);
82
+ throw new Error("OAuth Provider returned an error", { cause });
83
+ }
84
+ throw err;
85
+ }
86
+ const codeVerifier = await checks.pkce.use(cookies, resCookies, options);
87
+ // ConvexAuth: The logic for the callback URL is different from Auth.js
88
+ const redirect_uri = callbackUrl(provider.id);
89
+ // TODO(ConvexAuth): Support redirect proxy URLs
90
+ // if (!options.isOnRedirectProxy && provider.redirectProxyUrl) {
91
+ // redirect_uri = provider.redirectProxyUrl;
92
+ // }
93
+ let codeGrantResponse = await o.authorizationCodeGrantRequest(as, client, clientAuth, codeGrantParams, redirect_uri, codeVerifier ?? "decoy", {
94
+ // TODO: move away from allowing insecure HTTP requests
95
+ [o.allowInsecureRequests]: true,
96
+ [o.customFetch]: (...args) => {
97
+ if (!provider.checks.includes("pkce")) {
98
+ args[1].body.delete("code_verifier");
99
+ }
100
+ return fetchOpt(provider)[o.customFetch](...args);
101
+ },
102
+ });
103
+ if (provider.token?.conform) {
104
+ codeGrantResponse =
105
+ (await provider.token.conform(codeGrantResponse.clone())) ??
106
+ codeGrantResponse;
107
+ }
108
+ let profile = {};
109
+ // ConvexAuth: We use the value of the nonce later, aside from feeding it into the
110
+ // `processAuthorizationCodeResponse` function.
111
+ const nonce = await checks.nonce.use(cookies, resCookies, options);
112
+ const isOidc = isOIDCProvider(provider);
113
+ const processedCodeResponse = await o.processAuthorizationCodeResponse(as, client, codeGrantResponse, {
114
+ expectedNonce: nonce,
115
+ requireIdToken: isOidc,
116
+ });
117
+ const tokens = processedCodeResponse;
118
+ if (isOidc) {
119
+ // ConvexAuth: the next few lines are changed slightly to make TypeScript happy
120
+ const idTokenClaimsOrUndefined = o.getValidatedIdTokenClaims(processedCodeResponse);
121
+ if (idTokenClaimsOrUndefined === undefined) {
122
+ throw new Error("ID Token claims are missing");
123
+ }
124
+ const idTokenClaims = idTokenClaimsOrUndefined;
125
+ profile = idTokenClaims;
126
+ // Apple sends some of the user information in a `user` parameter as a stringified JSON.
127
+ // It also only does so the first time the user consents to share their information.
128
+ if (provider.id === "apple") {
129
+ try {
130
+ profile.user = JSON.parse(params?.user);
131
+ // ConvexAuth: disabled lint for empty block
132
+ // eslint-disable-next-line no-empty
133
+ }
134
+ catch { }
135
+ }
136
+ if (provider.idToken === false) {
137
+ const userinfoResponse = await o.userInfoRequest(as, client, processedCodeResponse.access_token, {
138
+ ...fetchOpt(provider),
139
+ // TODO: move away from allowing insecure HTTP requests
140
+ [o.allowInsecureRequests]: true,
141
+ });
142
+ profile = await o.processUserInfoResponse(as, client, idTokenClaims.sub, userinfoResponse);
143
+ }
144
+ }
145
+ else {
146
+ if (userinfo?.request) {
147
+ const _profile = await userinfo.request({ tokens, provider });
148
+ if (_profile instanceof Object)
149
+ profile = _profile;
150
+ }
151
+ else if (userinfo?.url) {
152
+ const userinfoResponse = await o.userInfoRequest(as, client, processedCodeResponse.access_token, fetchOpt(provider));
153
+ profile = await userinfoResponse.json();
154
+ }
155
+ else {
156
+ throw new TypeError("No userinfo endpoint configured");
157
+ }
158
+ }
159
+ if (tokens.expires_in) {
160
+ tokens.expires_at =
161
+ Math.floor(Date.now() / 1000) + Number(tokens.expires_in);
162
+ }
163
+ // ConvexAuth: The Auth.js code would handle user + account creation here, but for
164
+ // ConvexAuth we want to handle that in a Convex function. Instead, we return the
165
+ // information needed for the mutation.
166
+ return {
167
+ profile,
168
+ tokens,
169
+ cookies: resCookies,
170
+ signature: getAuthorizationSignature({ codeVerifier, state, nonce }),
171
+ };
172
+ }
173
+ //# sourceMappingURL=callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback.js","sourceRoot":"","sources":["../../../src/server/oauth/callback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { InternalOptions } from "./types.js";
2
+ import { Cookie } from "@auth/core/lib/utils/cookie.js";
3
+ /**
4
+ * @see https://www.rfc-editor.org/rfc/rfc7636
5
+ * @see https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#pkce
6
+ */
7
+ export declare const pkce: {
8
+ /** Creates a PKCE code challenge and verifier pair. The verifier is stored in the cookie. */
9
+ create(options: InternalOptions<"oauth">): Promise<{
10
+ cookie: Cookie;
11
+ codeChallenge: string;
12
+ codeVerifier: string;
13
+ }>;
14
+ /**
15
+ * Returns code_verifier if the provider is configured to use PKCE,
16
+ * and clears the container cookie afterwards.
17
+ * An error is thrown if the code_verifier is missing or invalid.
18
+ */
19
+ use: (cookies: Record<string, string | undefined>, resCookies: Cookie[], options: InternalOptions<"oidc">) => Promise<string | undefined>;
20
+ };
21
+ /**
22
+ * @see https://www.rfc-editor.org/rfc/rfc6749#section-10.12
23
+ * @see https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1
24
+ */
25
+ export declare const state: {
26
+ /** Creates a state cookie with an optionally encoded body. */
27
+ create(options: InternalOptions<"oauth">, origin?: string): Promise<{
28
+ cookie: Cookie;
29
+ value: string;
30
+ } | undefined>;
31
+ /**
32
+ * Returns state if the provider is configured to use state,
33
+ * and clears the container cookie afterwards.
34
+ * An error is thrown if the state is missing or invalid.
35
+ */
36
+ use: (cookies: Record<string, string | undefined>, resCookies: Cookie[], options: InternalOptions<"oidc">) => Promise<string | undefined>;
37
+ };
38
+ export declare const nonce: {
39
+ create(options: InternalOptions<"oidc">): Promise<{
40
+ cookie: Cookie;
41
+ value: string;
42
+ } | undefined>;
43
+ /**
44
+ * Returns nonce if the provider is configured to use nonce,
45
+ * and clears the container cookie afterwards.
46
+ * An error is thrown if the nonce is missing or invalid.
47
+ * @see https://openid.net/specs/openid-connect-core-1_0.html#NonceNotes
48
+ * @see https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#nonce
49
+ */
50
+ use: (cookies: Record<string, string | undefined>, resCookies: Cookie[], options: InternalOptions<"oidc">) => Promise<string | undefined>;
51
+ };
52
+ //# sourceMappingURL=checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/server/oauth/checks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAgExD;;;GAGG;AACH,eAAO,MAAM,IAAI;IACf,6FAA6F;oBACvE,eAAe,CAAC,OAAO,CAAC;;;;;IAM9C;;;;OAIG;mBA7BQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,cAC/B,MAAM,EAAE,WACX,eAAe,CAAC,MAAM,CAAC;CA6BnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK;IAChB,8DAA8D;oBACxC,eAAe,CAAC,OAAO,CAAC,WAAW,MAAM;;;;IAe/D;;;;OAIG;mBA1DQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,cAC/B,MAAM,EAAE,WACX,eAAe,CAAC,MAAM,CAAC;CA0DnC,CAAC;AAEF,eAAO,MAAM,KAAK;oBACM,eAAe,CAAC,MAAM,CAAC;;;;IAM7C;;;;;;OAMG;mBA3EQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,cAC/B,MAAM,EAAE,WACX,eAAe,CAAC,MAAM,CAAC;CA2EnC,CAAC"}
@@ -0,0 +1,106 @@
1
+ // This maps to packages/core/src/lib/actions/callback/oauth/checks.ts in the @auth/core package (commit 5af1f30a32e64591abc50ae4d2dba4682e525431)
2
+ import * as o from "oauth4webapi";
3
+ import { logWithLevel } from "../implementation/utils.js";
4
+ const COOKIE_TTL = 60 * 15; // 15 minutes
5
+ /** Returns a cookie with the given payload and options. */
6
+ // ConvexAuth: Auth.js calls this `sealCookie` and encrypts the payload wrapped in a JWT.
7
+ async function createCookie(name, payload, options) {
8
+ const { cookies } = options;
9
+ const cookie = cookies[name];
10
+ const expires = new Date();
11
+ expires.setTime(expires.getTime() + COOKIE_TTL * 1000);
12
+ logWithLevel("DEBUG", `CREATE_${name.toUpperCase()}`, {
13
+ name: cookie.name,
14
+ payload,
15
+ COOKIE_TTL,
16
+ expires,
17
+ });
18
+ const cookieOptions = { ...cookie.options, expires };
19
+ return { name: cookie.name, value: payload, options: cookieOptions };
20
+ }
21
+ function clearCookie(name, options, resCookies) {
22
+ const { cookies } = options;
23
+ const cookie = cookies[name];
24
+ logWithLevel("DEBUG", `CLEAR_${name.toUpperCase()}`, { cookie });
25
+ resCookies.push({
26
+ name: cookie.name,
27
+ value: "",
28
+ options: { ...cookies[name].options, maxAge: 0 },
29
+ });
30
+ }
31
+ function useCookie(check, name) {
32
+ return async function (
33
+ // ConvexAuth: `cookies` is a Record<string, string | undefined> instead of RequestInternal["cookies"]
34
+ cookies, resCookies, options) {
35
+ const { provider } = options;
36
+ if (!provider?.checks?.includes(check))
37
+ return;
38
+ const cookieValue = cookies?.[options.cookies[name].name];
39
+ logWithLevel("DEBUG", `USE_${name.toUpperCase()}`, { value: cookieValue });
40
+ clearCookie(name, options, resCookies);
41
+ return cookieValue;
42
+ };
43
+ }
44
+ /**
45
+ * @see https://www.rfc-editor.org/rfc/rfc7636
46
+ * @see https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#pkce
47
+ */
48
+ export const pkce = {
49
+ /** Creates a PKCE code challenge and verifier pair. The verifier is stored in the cookie. */
50
+ async create(options) {
51
+ const codeVerifier = o.generateRandomCodeVerifier();
52
+ const codeChallenge = await o.calculatePKCECodeChallenge(codeVerifier);
53
+ const cookie = await createCookie("pkceCodeVerifier", codeVerifier, options);
54
+ return { cookie, codeChallenge: codeChallenge, codeVerifier };
55
+ },
56
+ /**
57
+ * Returns code_verifier if the provider is configured to use PKCE,
58
+ * and clears the container cookie afterwards.
59
+ * An error is thrown if the code_verifier is missing or invalid.
60
+ */
61
+ use: useCookie("pkce", "pkceCodeVerifier"),
62
+ };
63
+ /**
64
+ * @see https://www.rfc-editor.org/rfc/rfc6749#section-10.12
65
+ * @see https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1
66
+ */
67
+ export const state = {
68
+ /** Creates a state cookie with an optionally encoded body. */
69
+ async create(options, origin) {
70
+ const { provider } = options;
71
+ if (!provider.checks.includes("state")) {
72
+ if (origin) {
73
+ throw new Error("State data was provided but the provider is not configured to use state");
74
+ }
75
+ return;
76
+ }
77
+ const payload = o.generateRandomState();
78
+ const cookie = await createCookie("state", payload, options);
79
+ return { cookie, value: payload };
80
+ },
81
+ /**
82
+ * Returns state if the provider is configured to use state,
83
+ * and clears the container cookie afterwards.
84
+ * An error is thrown if the state is missing or invalid.
85
+ */
86
+ use: useCookie("state", "state"),
87
+ };
88
+ export const nonce = {
89
+ async create(options) {
90
+ if (!options.provider.checks.includes("nonce"))
91
+ return;
92
+ const value = o.generateRandomNonce();
93
+ const cookie = await createCookie("nonce", value, options);
94
+ return { cookie, value };
95
+ },
96
+ /**
97
+ * Returns nonce if the provider is configured to use nonce,
98
+ * and clears the container cookie afterwards.
99
+ * An error is thrown if the nonce is missing or invalid.
100
+ * @see https://openid.net/specs/openid-connect-core-1_0.html#NonceNotes
101
+ * @see https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#nonce
102
+ */
103
+ use: useCookie("nonce", "nonce"),
104
+ };
105
+ // ConvexAuth: All WebAuthn checks are omitted.
106
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/server/oauth/checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { CookieOption, CookiesOptions } from "@auth/core/types.js";
2
+ import { InternalProvider } from "./types.js";
3
+ import { OAuthConfig } from "@auth/core/providers/oauth.js";
4
+ export declare function callbackUrl(providerId: string): string;
5
+ export declare function getAuthorizationSignature({ codeVerifier, state, nonce, }: {
6
+ codeVerifier?: string;
7
+ state?: string;
8
+ nonce?: string;
9
+ }): string;
10
+ export declare const defaultCookiesOptions: (providerId: string) => Record<keyof CookiesOptions, CookieOption>;
11
+ export declare function oAuthConfigToInternalProvider(config: OAuthConfig<any>): Promise<InternalProvider<"oauth" | "oidc">>;
12
+ //# sourceMappingURL=convexAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convexAuth.d.ts","sourceRoot":"","sources":["../../../src/server/oauth/convexAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM9C,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAG5D,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,UAE7C;AAID,wBAAgB,yBAAyB,CAAC,EACxC,YAAY,EACZ,KAAK,EACL,KAAK,GACN,EAAE;IACD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,UAIA;AASD,eAAO,MAAM,qBAAqB,EAAE,CAClC,UAAU,EAAE,MAAM,KACf,MAAM,CAAC,MAAM,cAAc,EAAE,YAAY,CA+C7C,CAAC;AAEF,wBAAsB,6BAA6B,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CA8EzH"}
@@ -0,0 +1,137 @@
1
+ import { requireEnv } from "../utils.js";
2
+ import { SHARED_COOKIE_OPTIONS } from "../cookies.js";
3
+ import { fetchOpt } from "./lib/utils/customFetch.js";
4
+ import * as o from "oauth4webapi";
5
+ import { normalizeEndpoint } from "../provider_utils.js";
6
+ import { isLocalHost } from "../utils.js";
7
+ // ConvexAuth: The logic for the callback URL is different from Auth.js
8
+ export function callbackUrl(providerId) {
9
+ return (process.env.CUSTOM_AUTH_SITE_URL ?? requireEnv("CONVEX_SITE_URL")) + "/api/auth/callback/" + providerId;
10
+ }
11
+ // ConvexAuth: This is a ConvexAuth specific function that produces a string that the
12
+ // Convex functions will validate
13
+ export function getAuthorizationSignature({ codeVerifier, state, nonce, }) {
14
+ return [codeVerifier, state, nonce]
15
+ .filter((param) => param !== undefined)
16
+ .join(" ");
17
+ }
18
+ function oauthStateCookieName(type, providerId) {
19
+ return (!isLocalHost(process.env.CONVEX_SITE_URL) ? "__Host-" : "") + providerId + "OAuth" + type;
20
+ }
21
+ export const defaultCookiesOptions = (providerId) => {
22
+ return {
23
+ pkceCodeVerifier: {
24
+ name: oauthStateCookieName("pkce", providerId),
25
+ options: {
26
+ ...SHARED_COOKIE_OPTIONS,
27
+ },
28
+ },
29
+ state: {
30
+ name: oauthStateCookieName("state", providerId),
31
+ options: {
32
+ ...SHARED_COOKIE_OPTIONS,
33
+ },
34
+ },
35
+ nonce: {
36
+ name: oauthStateCookieName("nonce", providerId),
37
+ options: {
38
+ ...SHARED_COOKIE_OPTIONS,
39
+ },
40
+ },
41
+ // ConvexAuth: We don't support webauthn, so this value doesn't actually matter
42
+ webauthnChallenge: {
43
+ name: "ConvexAuth_shouldNotBeUsed_webauthnChallenge",
44
+ options: {
45
+ ...SHARED_COOKIE_OPTIONS,
46
+ },
47
+ },
48
+ // ConvexAuth: We don't use these cookies, so their values should never be used
49
+ sessionToken: {
50
+ name: "ConvexAuth_shouldNotBeUsed_sessionToken",
51
+ options: {
52
+ ...SHARED_COOKIE_OPTIONS,
53
+ },
54
+ },
55
+ callbackUrl: {
56
+ name: "ConvexAuth_shouldNotBeUsed_callbackUrl",
57
+ options: {
58
+ ...SHARED_COOKIE_OPTIONS,
59
+ },
60
+ },
61
+ csrfToken: {
62
+ name: "ConvexAuth_shouldNotBeUsed_csrfToken",
63
+ options: {
64
+ ...SHARED_COOKIE_OPTIONS,
65
+ },
66
+ },
67
+ };
68
+ };
69
+ export async function oAuthConfigToInternalProvider(config) {
70
+ // Only do service discovery if the provider does not have the required configuration
71
+ if (!config.authorization || !config.token || !config.userinfo) {
72
+ // Taken from https://github.com/nextauthjs/next-auth/blob/a7491dcb9355ff2d01fb8e9236636605e2090145/packages/core/src/lib/actions/callback/oauth/callback.ts#L63
73
+ if (!config.issuer) {
74
+ throw new Error(`Provider \`${config.id}\` is missing an \`issuer\` URL configuration. Consult the provider docs.`);
75
+ }
76
+ const issuer = new URL(config.issuer);
77
+ // TODO: move away from allowing insecure HTTP requests
78
+ const discoveryResponse = await o.discoveryRequest(issuer, {
79
+ ...fetchOpt(config),
80
+ [o.allowInsecureRequests]: true,
81
+ });
82
+ const discoveredAs = await o.processDiscoveryResponse(issuer, discoveryResponse);
83
+ if (!discoveredAs.token_endpoint)
84
+ throw new TypeError("TODO: Authorization server did not provide a token endpoint.");
85
+ const as = discoveredAs;
86
+ return {
87
+ ...config,
88
+ checks: config.checks,
89
+ profile: config.profile,
90
+ account: config.account,
91
+ clientId: config.clientId,
92
+ idToken: config.type === "oidc" ? config.idToken : undefined,
93
+ // ConvexAuth: Apparently it's important for us to normalize the endpoint after
94
+ // service discovery (https://github.com/get-convex/convex-auth/commit/35bf716bfb0d29dbce1cbca318973b0732f75015)
95
+ authorization: normalizeEndpoint({
96
+ ...config.authorization,
97
+ url: as.authorization_endpoint,
98
+ }),
99
+ token: normalizeEndpoint({
100
+ ...config.token,
101
+ url: as.token_endpoint,
102
+ }),
103
+ userinfo: as.userinfo_endpoint
104
+ ? normalizeEndpoint({
105
+ ...config.userinfo,
106
+ url: as.userinfo_endpoint,
107
+ })
108
+ : config.userinfo,
109
+ as,
110
+ configSource: "discovered"
111
+ };
112
+ }
113
+ const authorization = normalizeEndpoint(config.authorization);
114
+ const token = normalizeEndpoint(config.token);
115
+ const userinfo = config.userinfo
116
+ ? normalizeEndpoint(config.userinfo)
117
+ : undefined;
118
+ return {
119
+ ...config,
120
+ checks: config.checks,
121
+ profile: config.profile,
122
+ account: config.account,
123
+ clientId: config.clientId,
124
+ idToken: config.type === "oidc" ? config.idToken : undefined,
125
+ authorization,
126
+ token,
127
+ userinfo,
128
+ as: {
129
+ issuer: config.issuer ?? "theremustbeastringhere.dev",
130
+ authorization_endpoint: authorization?.url.toString(),
131
+ token_endpoint: token?.url.toString(),
132
+ userinfo_endpoint: userinfo?.url.toString(),
133
+ },
134
+ configSource: "provided",
135
+ };
136
+ }
137
+ //# sourceMappingURL=convexAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convexAuth.js","sourceRoot":"","sources":["../../../src/server/oauth/convexAuth.ts"],"names":[],"mappings":"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"}