@auth/qwik 0.0.0

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 (355) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +24 -0
  3. package/index.d.ts +65 -0
  4. package/index.d.ts.map +1 -0
  5. package/index.qwik.mjs +343 -0
  6. package/package.json +64 -0
  7. package/providers/42-school.d.ts +3 -0
  8. package/providers/42-school.d.ts.map +1 -0
  9. package/providers/42-school.js +2 -0
  10. package/providers/apple.d.ts +3 -0
  11. package/providers/apple.d.ts.map +1 -0
  12. package/providers/apple.js +2 -0
  13. package/providers/asgardeo.d.ts +3 -0
  14. package/providers/asgardeo.d.ts.map +1 -0
  15. package/providers/asgardeo.js +2 -0
  16. package/providers/auth0.d.ts +3 -0
  17. package/providers/auth0.d.ts.map +1 -0
  18. package/providers/auth0.js +2 -0
  19. package/providers/authentik.d.ts +3 -0
  20. package/providers/authentik.d.ts.map +1 -0
  21. package/providers/authentik.js +2 -0
  22. package/providers/azure-ad-b2c.d.ts +3 -0
  23. package/providers/azure-ad-b2c.d.ts.map +1 -0
  24. package/providers/azure-ad-b2c.js +2 -0
  25. package/providers/azure-ad.d.ts +3 -0
  26. package/providers/azure-ad.d.ts.map +1 -0
  27. package/providers/azure-ad.js +2 -0
  28. package/providers/azure-devops.d.ts +3 -0
  29. package/providers/azure-devops.d.ts.map +1 -0
  30. package/providers/azure-devops.js +2 -0
  31. package/providers/bankid-no.d.ts +3 -0
  32. package/providers/bankid-no.d.ts.map +1 -0
  33. package/providers/bankid-no.js +2 -0
  34. package/providers/battlenet.d.ts +3 -0
  35. package/providers/battlenet.d.ts.map +1 -0
  36. package/providers/battlenet.js +2 -0
  37. package/providers/beyondidentity.d.ts +3 -0
  38. package/providers/beyondidentity.d.ts.map +1 -0
  39. package/providers/beyondidentity.js +2 -0
  40. package/providers/box.d.ts +3 -0
  41. package/providers/box.d.ts.map +1 -0
  42. package/providers/box.js +2 -0
  43. package/providers/boxyhq-saml.d.ts +3 -0
  44. package/providers/boxyhq-saml.d.ts.map +1 -0
  45. package/providers/boxyhq-saml.js +2 -0
  46. package/providers/bungie.d.ts +3 -0
  47. package/providers/bungie.d.ts.map +1 -0
  48. package/providers/bungie.js +2 -0
  49. package/providers/click-up.d.ts +3 -0
  50. package/providers/click-up.d.ts.map +1 -0
  51. package/providers/click-up.js +2 -0
  52. package/providers/cognito.d.ts +3 -0
  53. package/providers/cognito.d.ts.map +1 -0
  54. package/providers/cognito.js +2 -0
  55. package/providers/coinbase.d.ts +3 -0
  56. package/providers/coinbase.d.ts.map +1 -0
  57. package/providers/coinbase.js +2 -0
  58. package/providers/credentials.d.ts +3 -0
  59. package/providers/credentials.d.ts.map +1 -0
  60. package/providers/credentials.js +2 -0
  61. package/providers/descope.d.ts +3 -0
  62. package/providers/descope.d.ts.map +1 -0
  63. package/providers/descope.js +2 -0
  64. package/providers/discord.d.ts +3 -0
  65. package/providers/discord.d.ts.map +1 -0
  66. package/providers/discord.js +2 -0
  67. package/providers/dribbble.d.ts +3 -0
  68. package/providers/dribbble.d.ts.map +1 -0
  69. package/providers/dribbble.js +2 -0
  70. package/providers/dropbox.d.ts +3 -0
  71. package/providers/dropbox.d.ts.map +1 -0
  72. package/providers/dropbox.js +2 -0
  73. package/providers/duende-identity-server6.d.ts +3 -0
  74. package/providers/duende-identity-server6.d.ts.map +1 -0
  75. package/providers/duende-identity-server6.js +2 -0
  76. package/providers/email.d.ts +3 -0
  77. package/providers/email.d.ts.map +1 -0
  78. package/providers/email.js +2 -0
  79. package/providers/eveonline.d.ts +3 -0
  80. package/providers/eveonline.d.ts.map +1 -0
  81. package/providers/eveonline.js +2 -0
  82. package/providers/facebook.d.ts +3 -0
  83. package/providers/facebook.d.ts.map +1 -0
  84. package/providers/facebook.js +2 -0
  85. package/providers/faceit.d.ts +3 -0
  86. package/providers/faceit.d.ts.map +1 -0
  87. package/providers/faceit.js +2 -0
  88. package/providers/foursquare.d.ts +3 -0
  89. package/providers/foursquare.d.ts.map +1 -0
  90. package/providers/foursquare.js +2 -0
  91. package/providers/freshbooks.d.ts +3 -0
  92. package/providers/freshbooks.d.ts.map +1 -0
  93. package/providers/freshbooks.js +2 -0
  94. package/providers/fusionauth.d.ts +3 -0
  95. package/providers/fusionauth.d.ts.map +1 -0
  96. package/providers/fusionauth.js +2 -0
  97. package/providers/github.d.ts +3 -0
  98. package/providers/github.d.ts.map +1 -0
  99. package/providers/github.js +2 -0
  100. package/providers/gitlab.d.ts +3 -0
  101. package/providers/gitlab.d.ts.map +1 -0
  102. package/providers/gitlab.js +2 -0
  103. package/providers/google.d.ts +3 -0
  104. package/providers/google.d.ts.map +1 -0
  105. package/providers/google.js +2 -0
  106. package/providers/hubspot.d.ts +3 -0
  107. package/providers/hubspot.d.ts.map +1 -0
  108. package/providers/hubspot.js +2 -0
  109. package/providers/identity-server4.d.ts +3 -0
  110. package/providers/identity-server4.d.ts.map +1 -0
  111. package/providers/identity-server4.js +2 -0
  112. package/providers/index.d.ts +2 -0
  113. package/providers/index.d.ts.map +1 -0
  114. package/providers/index.js +1 -0
  115. package/providers/instagram.d.ts +3 -0
  116. package/providers/instagram.d.ts.map +1 -0
  117. package/providers/instagram.js +2 -0
  118. package/providers/kakao.d.ts +3 -0
  119. package/providers/kakao.d.ts.map +1 -0
  120. package/providers/kakao.js +2 -0
  121. package/providers/keycloak.d.ts +3 -0
  122. package/providers/keycloak.d.ts.map +1 -0
  123. package/providers/keycloak.js +2 -0
  124. package/providers/line.d.ts +3 -0
  125. package/providers/line.d.ts.map +1 -0
  126. package/providers/line.js +2 -0
  127. package/providers/linkedin.d.ts +3 -0
  128. package/providers/linkedin.d.ts.map +1 -0
  129. package/providers/linkedin.js +2 -0
  130. package/providers/mailchimp.d.ts +3 -0
  131. package/providers/mailchimp.d.ts.map +1 -0
  132. package/providers/mailchimp.js +2 -0
  133. package/providers/mailru.d.ts +3 -0
  134. package/providers/mailru.d.ts.map +1 -0
  135. package/providers/mailru.js +2 -0
  136. package/providers/mastodon.d.ts +3 -0
  137. package/providers/mastodon.d.ts.map +1 -0
  138. package/providers/mastodon.js +2 -0
  139. package/providers/mattermost.d.ts +3 -0
  140. package/providers/mattermost.d.ts.map +1 -0
  141. package/providers/mattermost.js +2 -0
  142. package/providers/medium.d.ts +3 -0
  143. package/providers/medium.d.ts.map +1 -0
  144. package/providers/medium.js +2 -0
  145. package/providers/microsoft-entra-id.d.ts +3 -0
  146. package/providers/microsoft-entra-id.d.ts.map +1 -0
  147. package/providers/microsoft-entra-id.js +2 -0
  148. package/providers/naver.d.ts +3 -0
  149. package/providers/naver.d.ts.map +1 -0
  150. package/providers/naver.js +2 -0
  151. package/providers/netlify.d.ts +3 -0
  152. package/providers/netlify.d.ts.map +1 -0
  153. package/providers/netlify.js +2 -0
  154. package/providers/netsuite.d.ts +3 -0
  155. package/providers/netsuite.d.ts.map +1 -0
  156. package/providers/netsuite.js +2 -0
  157. package/providers/nodemailer.d.ts +3 -0
  158. package/providers/nodemailer.d.ts.map +1 -0
  159. package/providers/nodemailer.js +2 -0
  160. package/providers/notion.d.ts +3 -0
  161. package/providers/notion.d.ts.map +1 -0
  162. package/providers/notion.js +2 -0
  163. package/providers/okta.d.ts +3 -0
  164. package/providers/okta.d.ts.map +1 -0
  165. package/providers/okta.js +2 -0
  166. package/providers/onelogin.d.ts +3 -0
  167. package/providers/onelogin.d.ts.map +1 -0
  168. package/providers/onelogin.js +2 -0
  169. package/providers/ory-hydra.d.ts +3 -0
  170. package/providers/ory-hydra.d.ts.map +1 -0
  171. package/providers/ory-hydra.js +2 -0
  172. package/providers/osso.d.ts +3 -0
  173. package/providers/osso.d.ts.map +1 -0
  174. package/providers/osso.js +2 -0
  175. package/providers/osu.d.ts +3 -0
  176. package/providers/osu.d.ts.map +1 -0
  177. package/providers/osu.js +2 -0
  178. package/providers/passage.d.ts +3 -0
  179. package/providers/passage.d.ts.map +1 -0
  180. package/providers/passage.js +2 -0
  181. package/providers/passkey.d.ts +3 -0
  182. package/providers/passkey.d.ts.map +1 -0
  183. package/providers/passkey.js +2 -0
  184. package/providers/patreon.d.ts +3 -0
  185. package/providers/patreon.d.ts.map +1 -0
  186. package/providers/patreon.js +2 -0
  187. package/providers/pinterest.d.ts +3 -0
  188. package/providers/pinterest.d.ts.map +1 -0
  189. package/providers/pinterest.js +2 -0
  190. package/providers/pipedrive.d.ts +3 -0
  191. package/providers/pipedrive.d.ts.map +1 -0
  192. package/providers/pipedrive.js +2 -0
  193. package/providers/postmark.d.ts +3 -0
  194. package/providers/postmark.d.ts.map +1 -0
  195. package/providers/postmark.js +2 -0
  196. package/providers/reddit.d.ts +3 -0
  197. package/providers/reddit.d.ts.map +1 -0
  198. package/providers/reddit.js +2 -0
  199. package/providers/resend.d.ts +3 -0
  200. package/providers/resend.d.ts.map +1 -0
  201. package/providers/resend.js +2 -0
  202. package/providers/salesforce.d.ts +3 -0
  203. package/providers/salesforce.d.ts.map +1 -0
  204. package/providers/salesforce.js +2 -0
  205. package/providers/sendgrid.d.ts +3 -0
  206. package/providers/sendgrid.d.ts.map +1 -0
  207. package/providers/sendgrid.js +2 -0
  208. package/providers/simplelogin.d.ts +3 -0
  209. package/providers/simplelogin.d.ts.map +1 -0
  210. package/providers/simplelogin.js +2 -0
  211. package/providers/slack.d.ts +3 -0
  212. package/providers/slack.d.ts.map +1 -0
  213. package/providers/slack.js +2 -0
  214. package/providers/spotify.d.ts +3 -0
  215. package/providers/spotify.d.ts.map +1 -0
  216. package/providers/spotify.js +2 -0
  217. package/providers/strava.d.ts +3 -0
  218. package/providers/strava.d.ts.map +1 -0
  219. package/providers/strava.js +2 -0
  220. package/providers/tiktok.d.ts +3 -0
  221. package/providers/tiktok.d.ts.map +1 -0
  222. package/providers/tiktok.js +2 -0
  223. package/providers/todoist.d.ts +3 -0
  224. package/providers/todoist.d.ts.map +1 -0
  225. package/providers/todoist.js +2 -0
  226. package/providers/trakt.d.ts +3 -0
  227. package/providers/trakt.d.ts.map +1 -0
  228. package/providers/trakt.js +2 -0
  229. package/providers/twitch.d.ts +3 -0
  230. package/providers/twitch.d.ts.map +1 -0
  231. package/providers/twitch.js +2 -0
  232. package/providers/twitter.d.ts +3 -0
  233. package/providers/twitter.d.ts.map +1 -0
  234. package/providers/twitter.js +2 -0
  235. package/providers/united-effects.d.ts +3 -0
  236. package/providers/united-effects.d.ts.map +1 -0
  237. package/providers/united-effects.js +2 -0
  238. package/providers/vk.d.ts +3 -0
  239. package/providers/vk.d.ts.map +1 -0
  240. package/providers/vk.js +2 -0
  241. package/providers/webauthn.d.ts +3 -0
  242. package/providers/webauthn.d.ts.map +1 -0
  243. package/providers/webauthn.js +2 -0
  244. package/providers/webex.d.ts +3 -0
  245. package/providers/webex.d.ts.map +1 -0
  246. package/providers/webex.js +2 -0
  247. package/providers/wikimedia.d.ts +3 -0
  248. package/providers/wikimedia.d.ts.map +1 -0
  249. package/providers/wikimedia.js +2 -0
  250. package/providers/wordpress.d.ts +3 -0
  251. package/providers/wordpress.d.ts.map +1 -0
  252. package/providers/wordpress.js +2 -0
  253. package/providers/workos.d.ts +3 -0
  254. package/providers/workos.d.ts.map +1 -0
  255. package/providers/workos.js +2 -0
  256. package/providers/yandex.d.ts +3 -0
  257. package/providers/yandex.d.ts.map +1 -0
  258. package/providers/yandex.js +2 -0
  259. package/providers/zitadel.d.ts +3 -0
  260. package/providers/zitadel.d.ts.map +1 -0
  261. package/providers/zitadel.js +2 -0
  262. package/providers/zoho.d.ts +3 -0
  263. package/providers/zoho.d.ts.map +1 -0
  264. package/providers/zoho.js +2 -0
  265. package/providers/zoom.d.ts +3 -0
  266. package/providers/zoom.d.ts.map +1 -0
  267. package/providers/zoom.js +2 -0
  268. package/src/index.ts +373 -0
  269. package/src/providers/42-school.ts +2 -0
  270. package/src/providers/apple.ts +2 -0
  271. package/src/providers/asgardeo.ts +2 -0
  272. package/src/providers/auth0.ts +2 -0
  273. package/src/providers/authentik.ts +2 -0
  274. package/src/providers/azure-ad-b2c.ts +2 -0
  275. package/src/providers/azure-ad.ts +2 -0
  276. package/src/providers/azure-devops.ts +2 -0
  277. package/src/providers/bankid-no.ts +2 -0
  278. package/src/providers/battlenet.ts +2 -0
  279. package/src/providers/beyondidentity.ts +2 -0
  280. package/src/providers/box.ts +2 -0
  281. package/src/providers/boxyhq-saml.ts +2 -0
  282. package/src/providers/bungie.ts +2 -0
  283. package/src/providers/click-up.ts +2 -0
  284. package/src/providers/cognito.ts +2 -0
  285. package/src/providers/coinbase.ts +2 -0
  286. package/src/providers/credentials.ts +2 -0
  287. package/src/providers/descope.ts +2 -0
  288. package/src/providers/discord.ts +2 -0
  289. package/src/providers/dribbble.ts +2 -0
  290. package/src/providers/dropbox.ts +2 -0
  291. package/src/providers/duende-identity-server6.ts +2 -0
  292. package/src/providers/email.ts +2 -0
  293. package/src/providers/eveonline.ts +2 -0
  294. package/src/providers/facebook.ts +2 -0
  295. package/src/providers/faceit.ts +2 -0
  296. package/src/providers/foursquare.ts +2 -0
  297. package/src/providers/freshbooks.ts +2 -0
  298. package/src/providers/fusionauth.ts +2 -0
  299. package/src/providers/github.ts +2 -0
  300. package/src/providers/gitlab.ts +2 -0
  301. package/src/providers/google.ts +2 -0
  302. package/src/providers/hubspot.ts +2 -0
  303. package/src/providers/identity-server4.ts +2 -0
  304. package/src/providers/index.ts +1 -0
  305. package/src/providers/instagram.ts +2 -0
  306. package/src/providers/kakao.ts +2 -0
  307. package/src/providers/keycloak.ts +2 -0
  308. package/src/providers/line.ts +2 -0
  309. package/src/providers/linkedin.ts +2 -0
  310. package/src/providers/mailchimp.ts +2 -0
  311. package/src/providers/mailru.ts +2 -0
  312. package/src/providers/mastodon.ts +2 -0
  313. package/src/providers/mattermost.ts +2 -0
  314. package/src/providers/medium.ts +2 -0
  315. package/src/providers/microsoft-entra-id.ts +2 -0
  316. package/src/providers/naver.ts +2 -0
  317. package/src/providers/netlify.ts +2 -0
  318. package/src/providers/netsuite.ts +2 -0
  319. package/src/providers/nodemailer.ts +2 -0
  320. package/src/providers/notion.ts +2 -0
  321. package/src/providers/okta.ts +2 -0
  322. package/src/providers/onelogin.ts +2 -0
  323. package/src/providers/ory-hydra.ts +2 -0
  324. package/src/providers/osso.ts +2 -0
  325. package/src/providers/osu.ts +2 -0
  326. package/src/providers/passage.ts +2 -0
  327. package/src/providers/passkey.ts +2 -0
  328. package/src/providers/patreon.ts +2 -0
  329. package/src/providers/pinterest.ts +2 -0
  330. package/src/providers/pipedrive.ts +2 -0
  331. package/src/providers/postmark.ts +2 -0
  332. package/src/providers/reddit.ts +2 -0
  333. package/src/providers/resend.ts +2 -0
  334. package/src/providers/salesforce.ts +2 -0
  335. package/src/providers/sendgrid.ts +2 -0
  336. package/src/providers/simplelogin.ts +2 -0
  337. package/src/providers/slack.ts +2 -0
  338. package/src/providers/spotify.ts +2 -0
  339. package/src/providers/strava.ts +2 -0
  340. package/src/providers/tiktok.ts +2 -0
  341. package/src/providers/todoist.ts +2 -0
  342. package/src/providers/trakt.ts +2 -0
  343. package/src/providers/twitch.ts +2 -0
  344. package/src/providers/twitter.ts +2 -0
  345. package/src/providers/united-effects.ts +2 -0
  346. package/src/providers/vk.ts +2 -0
  347. package/src/providers/webauthn.ts +2 -0
  348. package/src/providers/webex.ts +2 -0
  349. package/src/providers/wikimedia.ts +2 -0
  350. package/src/providers/wordpress.ts +2 -0
  351. package/src/providers/workos.ts +2 -0
  352. package/src/providers/yandex.ts +2 -0
  353. package/src/providers/zitadel.ts +2 -0
  354. package/src/providers/zoho.ts +2 -0
  355. package/src/providers/zoom.ts +2 -0
package/src/index.ts ADDED
@@ -0,0 +1,373 @@
1
+ /**
2
+ *
3
+ * :::warning
4
+ * `@auth/qwik` is currently experimental. The API _will_ change in the future.
5
+ * :::
6
+ *
7
+ * Qwik Auth is the official Qwik integration for Auth.js.
8
+ * It provides a simple way to add authentication to your Qwik app in a few lines of code.
9
+ *
10
+ * ## Installation
11
+ * ```bash npm2yarn
12
+ * npm install @auth/qwik
13
+ * ```
14
+ *
15
+ * ## Usage
16
+ *
17
+ * ### Provider Configuration
18
+ *
19
+ * Create a `plugin@auth.ts` file in the routes folder
20
+ *
21
+ * import GitHub from "@auth/qwik/providers/github"
22
+ * import { QwikAuth$ } from "@auth/qwik"
23
+ *
24
+ * export const {
25
+ * onRequest, useSession, useSignIn, useSignOut
26
+ * } = QwikAuth$(() => ({ providers: [GitHub] }))
27
+ *
28
+ * ## Signing in and signing out
29
+ *
30
+ * Sign In via form
31
+ *
32
+ * import { component$ } from '@builder.io/qwik';
33
+ * import { Form } from '@builder.io/qwik-city';
34
+ * import { useSignIn } from '~/routes/plugin@auth';
35
+ *
36
+ * export default component$(() => {
37
+ * const signIn = useSignIn();
38
+ * return (
39
+ * <Form action={signIn}>
40
+ * <input type="hidden" name="providerId" value="github" />
41
+ * <input type="hidden" name="options.redirectTo" value="http://qwik-auth-example.com/dashboard" />
42
+ * <button>Sign In</button>
43
+ * </Form>
44
+ * );
45
+ * });
46
+ *
47
+ * Sign In via code
48
+ *
49
+ * import { component$ } from '@builder.io/qwik';
50
+ * import { useSignIn } from '~/routes/plugin@auth';
51
+ *
52
+ * export default component$(() => {
53
+ * const signIn = useSignIn();
54
+ * return (
55
+ * <button onClick$={() => signIn.submit({ providerId: 'github', options: { redirectTo: 'http://qwik-auth-example.com/dashboard' } })}>Sign In</button>
56
+ * );
57
+ * });
58
+ *
59
+ * Sign out via form
60
+ *
61
+ * import { component$ } from '@builder.io/qwik';
62
+ * import { Form } from '@builder.io/qwik-city';
63
+ * import { useSignOut } from '~/routes/plugin@auth';
64
+ *
65
+ * export default component$(() => {
66
+ * const signOut = useSignOut();
67
+ * return (
68
+ * <Form action={signOut}>
69
+ * <input type="hidden" name="redirectTo" value="/signedout" />
70
+ * <button>Sign Out</button>
71
+ * </Form>
72
+ * );
73
+ * });
74
+ *
75
+ * Sign out via code
76
+ *
77
+ * import { component$ } from '@builder.io/qwik';
78
+ * import { useSignOut } from '~/routes/plugin@auth';
79
+ *
80
+ * export default component$(() => {
81
+ * const signOut = useSignOut();
82
+ * return <button onClick$={() => signOut.submit({ redirectTo: '/signedout' })}>Sign Out</button>;
83
+ * });
84
+ *
85
+ * ## Managing the session
86
+ *
87
+ * import { component$ } from '@builder.io/qwik';
88
+ * import { useSession } from '~/routes/plugin@auth';
89
+ *
90
+ * export default component$(() => {
91
+ * const session = useSession();
92
+ * return <p>{session.value?.user?.email}</p>;
93
+ * });
94
+ *
95
+ * ## Authorization
96
+ *
97
+ * Session data can be accessed via the route event.sharedMap.
98
+ * So a route can be protected and redirect using something like this located in a layout.tsx or page index.tsx:
99
+ *
100
+ * export const onRequest: RequestHandler = (event) => {
101
+ * const session = event.sharedMap.get("session")
102
+ * if (!session || new Date(session.expires) < new Date()) {
103
+ * throw event.redirect(302, `/auth/signin?redirectTo=${event.url.pathname}`);
104
+ * }
105
+ * };
106
+ *
107
+ * ```
108
+ *
109
+ * @module @auth/qwik
110
+ */
111
+
112
+ import type { AuthConfig } from "@auth/core"
113
+ import { Auth, isAuthAction, skipCSRFCheck } from "@auth/core"
114
+ import { AuthAction, Session } from "@auth/core/types"
115
+ import { implicit$FirstArg, type QRL } from "@builder.io/qwik"
116
+ import {
117
+ globalAction$,
118
+ routeLoader$,
119
+ z,
120
+ zod$,
121
+ type RequestEventCommon,
122
+ } from "@builder.io/qwik-city"
123
+ import { EnvGetter } from "@builder.io/qwik-city/middleware/request-handler"
124
+ import { isServer } from "@builder.io/qwik/build"
125
+ import { parseString, splitCookiesString } from "set-cookie-parser"
126
+
127
+ /** Configure the {@link QwikAuth$} method. */
128
+ export interface QwikAuthConfig extends Omit<AuthConfig, "raw"> {}
129
+
130
+ export type GetSessionResult = Promise<{ data: Session | null; cookie: any }>
131
+
132
+ function qwikAuthQrl(
133
+ authOptions: QRL<(ev: RequestEventCommon) => QwikAuthConfig>
134
+ ) {
135
+ const useSignIn = globalAction$(
136
+ async (
137
+ { providerId, redirectTo: _redirectTo, options, authorizationParams },
138
+ req
139
+ ) => {
140
+ const { redirectTo = _redirectTo ?? defaultRedirectTo(req), ...rest } =
141
+ options ?? {}
142
+
143
+ const isCredentials = providerId === "credentials"
144
+
145
+ const authOpts = await authOptions(req)
146
+ setEnvDefaults(req.env, authOpts)
147
+ const body = new URLSearchParams({ redirectTo })
148
+ Object.entries(rest).forEach(([key, value]) => {
149
+ body.set(key, String(value))
150
+ })
151
+
152
+ const baseSignInUrl = `/auth/${isCredentials ? "callback" : "signin"}${
153
+ providerId ? `/${providerId}` : ""
154
+ }`
155
+ const signInUrl = `${baseSignInUrl}?${new URLSearchParams(
156
+ authorizationParams
157
+ )}`
158
+
159
+ const data = await authAction(body, req, signInUrl, authOpts)
160
+
161
+ // set authjs.callback-url cookie. Fix for https://github.com/QwikDev/qwik/issues/5227
162
+ req.cookie.set("authjs.callback-url", redirectTo, {
163
+ path: "/",
164
+ })
165
+
166
+ if (data.url) {
167
+ throw req.redirect(301, data.url)
168
+ }
169
+ },
170
+ zod$({
171
+ providerId: z.string().optional(),
172
+ /** Yoooo */
173
+ redirectTo: z.string().optional(),
174
+ options: z
175
+ .object({
176
+ redirectTo: z.string(),
177
+ })
178
+ .passthrough()
179
+ .partial()
180
+ .optional(),
181
+ authorizationParams: z
182
+ .union([z.string(), z.custom<URLSearchParams>(), z.record(z.string())])
183
+ .optional(),
184
+ })
185
+ )
186
+
187
+ const useSignOut = globalAction$(
188
+ async ({ redirectTo }, req) => {
189
+ redirectTo ??= defaultRedirectTo(req)
190
+ const authOpts = await authOptions(req)
191
+ setEnvDefaults(req.env, authOpts)
192
+ const body = new URLSearchParams({ redirectTo })
193
+ await authAction(body, req, `/auth/signout`, authOpts)
194
+ },
195
+ zod$({
196
+ redirectTo: z.string().optional(),
197
+ })
198
+ )
199
+
200
+ const useSession = routeLoader$((req) => {
201
+ return req.sharedMap.get("session") as Session | null
202
+ })
203
+
204
+ const onRequest = async (req: RequestEventCommon) => {
205
+ if (isServer) {
206
+ const prefix: string = "/auth"
207
+
208
+ const action = req.url.pathname
209
+ .slice(prefix.length + 1)
210
+ .split("/")[0] as AuthAction
211
+
212
+ const authOpts = await authOptions(req)
213
+ setEnvDefaults(req.env, authOpts)
214
+ if (isAuthAction(action) && req.url.pathname.startsWith(prefix + "/")) {
215
+ const res = (await Auth(req.request, authOpts)) as Response
216
+ const cookie = res.headers.get("set-cookie")
217
+ if (cookie) {
218
+ req.headers.set("set-cookie", cookie)
219
+ res.headers.delete("set-cookie")
220
+ fixCookies(req)
221
+ }
222
+ throw req.send(res)
223
+ } else {
224
+ const { data, cookie } = await getSessionData(req.request, authOpts)
225
+ req.sharedMap.set("session", data)
226
+ if (cookie) {
227
+ req.headers.set("set-cookie", cookie)
228
+ fixCookies(req)
229
+ }
230
+ }
231
+ }
232
+ }
233
+
234
+ return { useSignIn, useSignOut, useSession, onRequest }
235
+ }
236
+
237
+ /**
238
+ * Initialize Qwik Auth.
239
+ *
240
+ * @example
241
+ * ```ts title="plugin@auth.ts"
242
+ * import { QwikAuth } from "@auth/qwik"
243
+ * import GitHub from "@auth/qwik/providers/github"
244
+ *
245
+ * export const {
246
+ * onRequest, useSession, useSignIn, useSignOut
247
+ * } = QwikAuth$(() => ({ providers: [GitHub] }))
248
+ * ```
249
+ */
250
+ export const QwikAuth$ = /*#__PURE__*/ implicit$FirstArg(qwikAuthQrl)
251
+
252
+ async function authAction(
253
+ body: URLSearchParams | undefined,
254
+ req: RequestEventCommon,
255
+ path: string,
256
+ authOptions: QwikAuthConfig
257
+ ) {
258
+ const request = new Request(new URL(path, req.request.url), {
259
+ method: req.request.method,
260
+ headers: req.request.headers,
261
+ body: body,
262
+ })
263
+ request.headers.set("content-type", "application/x-www-form-urlencoded")
264
+ const res = (await Auth(request, authOptions)) as Response
265
+
266
+ const cookies: string[] = []
267
+ res.headers.forEach((value, key) => {
268
+ if (key === "set-cookie") {
269
+ // while browsers would support setting multiple cookies, the fetch implementation does not, so we join them later.
270
+ cookies.push(value)
271
+ } else if (!req.headers.has(key)) {
272
+ req.headers.set(key, value)
273
+ }
274
+ })
275
+
276
+ if (cookies.length > 0) {
277
+ req.headers.set("set-cookie", cookies.join(", "))
278
+ }
279
+
280
+ fixCookies(req)
281
+
282
+ try {
283
+ return await res.json()
284
+ } catch (error) {
285
+ return await res.text()
286
+ }
287
+ }
288
+
289
+ const fixCookies = (req: RequestEventCommon) => {
290
+ req.headers.set("set-cookie", req.headers.get("set-cookie") || "")
291
+ const cookie = req.headers.get("set-cookie")
292
+ if (cookie) {
293
+ req.headers.delete("set-cookie")
294
+ splitCookiesString(cookie).forEach((cookie) => {
295
+ const { name, value, ...rest } = parseString(cookie)
296
+ req.cookie.set(name, value, rest as any)
297
+ })
298
+ }
299
+ }
300
+
301
+ const defaultRedirectTo = (req: RequestEventCommon) => {
302
+ req.url.searchParams.delete("qaction")
303
+ return req.url.href
304
+ }
305
+
306
+ async function getSessionData(
307
+ req: Request,
308
+ options: AuthConfig
309
+ ): GetSessionResult {
310
+ options.secret ??= process.env.AUTH_SECRET
311
+ options.trustHost ??= true
312
+
313
+ const url = new URL("/auth/session", req.url)
314
+ const response = (await Auth(
315
+ new Request(url, { headers: req.headers }),
316
+ options
317
+ )) as Response
318
+
319
+ const { status = 200 } = response
320
+
321
+ const data = await response.json()
322
+ const cookie = response.headers.get("set-cookie")
323
+ if (!data || !Object.keys(data).length) {
324
+ return { data: null, cookie }
325
+ }
326
+ if (status === 200) {
327
+ return { data, cookie }
328
+ }
329
+
330
+ throw new Error(data.message)
331
+ }
332
+
333
+ export const setEnvDefaults = (env: EnvGetter, config: AuthConfig) => {
334
+ config.basePath = "/auth"
335
+ if (!config.secret?.length) {
336
+ config.secret = []
337
+ const secret = env.get("AUTH_SECRET")
338
+ if (secret) {
339
+ config.secret.push(secret)
340
+ }
341
+ for (const i of [1, 2, 3]) {
342
+ const secret = env.get(`AUTH_SECRET_${i}`)
343
+ if (secret) {
344
+ config.secret.unshift(secret)
345
+ }
346
+ }
347
+ }
348
+
349
+ config.redirectProxyUrl ??= env.get("AUTH_REDIRECT_PROXY_URL")
350
+ config.trustHost ??= !!(
351
+ env.get("AUTH_URL") ??
352
+ env.get("AUTH_TRUST_HOST") ??
353
+ env.get("VERCEL") ??
354
+ env.get("CF_PAGES") ??
355
+ env.get("NODE_ENV") !== "production"
356
+ )
357
+ config.skipCSRFCheck = skipCSRFCheck
358
+
359
+ config.providers = config.providers.map((p) => {
360
+ const finalProvider = typeof p === "function" ? p({}) : p
361
+ const ID = finalProvider.id.toUpperCase().replace(/-/g, "_")
362
+ if (finalProvider.type === "oauth" || finalProvider.type === "oidc") {
363
+ finalProvider.clientId ??= env.get(`AUTH_${ID}_ID`)
364
+ finalProvider.clientSecret ??= env.get(`AUTH_${ID}_SECRET`)
365
+ if (finalProvider.type === "oidc") {
366
+ finalProvider.issuer ??= env.get(`AUTH_${ID}_ISSUER`)
367
+ }
368
+ } else if (finalProvider.type === "email") {
369
+ finalProvider.apiKey ??= env.get(`AUTH_${ID}_KEY`)
370
+ }
371
+ return finalProvider
372
+ })
373
+ }
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/42-school"
2
+ export { default } from "@auth/core/providers/42-school"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/apple"
2
+ export { default } from "@auth/core/providers/apple"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/asgardeo"
2
+ export { default } from "@auth/core/providers/asgardeo"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/auth0"
2
+ export { default } from "@auth/core/providers/auth0"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/authentik"
2
+ export { default } from "@auth/core/providers/authentik"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/azure-ad-b2c"
2
+ export { default } from "@auth/core/providers/azure-ad-b2c"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/azure-ad"
2
+ export { default } from "@auth/core/providers/azure-ad"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/azure-devops"
2
+ export { default } from "@auth/core/providers/azure-devops"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/bankid-no"
2
+ export { default } from "@auth/core/providers/bankid-no"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/battlenet"
2
+ export { default } from "@auth/core/providers/battlenet"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/beyondidentity"
2
+ export { default } from "@auth/core/providers/beyondidentity"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/box"
2
+ export { default } from "@auth/core/providers/box"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/boxyhq-saml"
2
+ export { default } from "@auth/core/providers/boxyhq-saml"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/bungie"
2
+ export { default } from "@auth/core/providers/bungie"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/click-up"
2
+ export { default } from "@auth/core/providers/click-up"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/cognito"
2
+ export { default } from "@auth/core/providers/cognito"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/coinbase"
2
+ export { default } from "@auth/core/providers/coinbase"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/credentials"
2
+ export { default } from "@auth/core/providers/credentials"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/descope"
2
+ export { default } from "@auth/core/providers/descope"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/discord"
2
+ export { default } from "@auth/core/providers/discord"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/dribbble"
2
+ export { default } from "@auth/core/providers/dribbble"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/dropbox"
2
+ export { default } from "@auth/core/providers/dropbox"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/duende-identity-server6"
2
+ export { default } from "@auth/core/providers/duende-identity-server6"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/email"
2
+ export { default } from "@auth/core/providers/email"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/eveonline"
2
+ export { default } from "@auth/core/providers/eveonline"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/facebook"
2
+ export { default } from "@auth/core/providers/facebook"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/faceit"
2
+ export { default } from "@auth/core/providers/faceit"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/foursquare"
2
+ export { default } from "@auth/core/providers/foursquare"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/freshbooks"
2
+ export { default } from "@auth/core/providers/freshbooks"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/fusionauth"
2
+ export { default } from "@auth/core/providers/fusionauth"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/github"
2
+ export { default } from "@auth/core/providers/github"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/gitlab"
2
+ export { default } from "@auth/core/providers/gitlab"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/google"
2
+ export { default } from "@auth/core/providers/google"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/hubspot"
2
+ export { default } from "@auth/core/providers/hubspot"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/identity-server4"
2
+ export { default } from "@auth/core/providers/identity-server4"
@@ -0,0 +1 @@
1
+ export * from "@auth/core/providers"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/instagram"
2
+ export { default } from "@auth/core/providers/instagram"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/kakao"
2
+ export { default } from "@auth/core/providers/kakao"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/keycloak"
2
+ export { default } from "@auth/core/providers/keycloak"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/line"
2
+ export { default } from "@auth/core/providers/line"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/linkedin"
2
+ export { default } from "@auth/core/providers/linkedin"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/mailchimp"
2
+ export { default } from "@auth/core/providers/mailchimp"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/mailru"
2
+ export { default } from "@auth/core/providers/mailru"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/mastodon"
2
+ export { default } from "@auth/core/providers/mastodon"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/mattermost"
2
+ export { default } from "@auth/core/providers/mattermost"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/medium"
2
+ export { default } from "@auth/core/providers/medium"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/microsoft-entra-id"
2
+ export { default } from "@auth/core/providers/microsoft-entra-id"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/naver"
2
+ export { default } from "@auth/core/providers/naver"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/netlify"
2
+ export { default } from "@auth/core/providers/netlify"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/netsuite"
2
+ export { default } from "@auth/core/providers/netsuite"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/nodemailer"
2
+ export { default } from "@auth/core/providers/nodemailer"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/notion"
2
+ export { default } from "@auth/core/providers/notion"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/okta"
2
+ export { default } from "@auth/core/providers/okta"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/onelogin"
2
+ export { default } from "@auth/core/providers/onelogin"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/ory-hydra"
2
+ export { default } from "@auth/core/providers/ory-hydra"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/osso"
2
+ export { default } from "@auth/core/providers/osso"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/osu"
2
+ export { default } from "@auth/core/providers/osu"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/passage"
2
+ export { default } from "@auth/core/providers/passage"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/passkey"
2
+ export { default } from "@auth/core/providers/passkey"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/patreon"
2
+ export { default } from "@auth/core/providers/patreon"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/pinterest"
2
+ export { default } from "@auth/core/providers/pinterest"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/pipedrive"
2
+ export { default } from "@auth/core/providers/pipedrive"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/postmark"
2
+ export { default } from "@auth/core/providers/postmark"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/reddit"
2
+ export { default } from "@auth/core/providers/reddit"
@@ -0,0 +1,2 @@
1
+ export * from "@auth/core/providers/resend"
2
+ export { default } from "@auth/core/providers/resend"