@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.
- package/LICENSE +15 -0
- package/README.md +24 -0
- package/index.d.ts +65 -0
- package/index.d.ts.map +1 -0
- package/index.qwik.mjs +343 -0
- package/package.json +64 -0
- package/providers/42-school.d.ts +3 -0
- package/providers/42-school.d.ts.map +1 -0
- package/providers/42-school.js +2 -0
- package/providers/apple.d.ts +3 -0
- package/providers/apple.d.ts.map +1 -0
- package/providers/apple.js +2 -0
- package/providers/asgardeo.d.ts +3 -0
- package/providers/asgardeo.d.ts.map +1 -0
- package/providers/asgardeo.js +2 -0
- package/providers/auth0.d.ts +3 -0
- package/providers/auth0.d.ts.map +1 -0
- package/providers/auth0.js +2 -0
- package/providers/authentik.d.ts +3 -0
- package/providers/authentik.d.ts.map +1 -0
- package/providers/authentik.js +2 -0
- package/providers/azure-ad-b2c.d.ts +3 -0
- package/providers/azure-ad-b2c.d.ts.map +1 -0
- package/providers/azure-ad-b2c.js +2 -0
- package/providers/azure-ad.d.ts +3 -0
- package/providers/azure-ad.d.ts.map +1 -0
- package/providers/azure-ad.js +2 -0
- package/providers/azure-devops.d.ts +3 -0
- package/providers/azure-devops.d.ts.map +1 -0
- package/providers/azure-devops.js +2 -0
- package/providers/bankid-no.d.ts +3 -0
- package/providers/bankid-no.d.ts.map +1 -0
- package/providers/bankid-no.js +2 -0
- package/providers/battlenet.d.ts +3 -0
- package/providers/battlenet.d.ts.map +1 -0
- package/providers/battlenet.js +2 -0
- package/providers/beyondidentity.d.ts +3 -0
- package/providers/beyondidentity.d.ts.map +1 -0
- package/providers/beyondidentity.js +2 -0
- package/providers/box.d.ts +3 -0
- package/providers/box.d.ts.map +1 -0
- package/providers/box.js +2 -0
- package/providers/boxyhq-saml.d.ts +3 -0
- package/providers/boxyhq-saml.d.ts.map +1 -0
- package/providers/boxyhq-saml.js +2 -0
- package/providers/bungie.d.ts +3 -0
- package/providers/bungie.d.ts.map +1 -0
- package/providers/bungie.js +2 -0
- package/providers/click-up.d.ts +3 -0
- package/providers/click-up.d.ts.map +1 -0
- package/providers/click-up.js +2 -0
- package/providers/cognito.d.ts +3 -0
- package/providers/cognito.d.ts.map +1 -0
- package/providers/cognito.js +2 -0
- package/providers/coinbase.d.ts +3 -0
- package/providers/coinbase.d.ts.map +1 -0
- package/providers/coinbase.js +2 -0
- package/providers/credentials.d.ts +3 -0
- package/providers/credentials.d.ts.map +1 -0
- package/providers/credentials.js +2 -0
- package/providers/descope.d.ts +3 -0
- package/providers/descope.d.ts.map +1 -0
- package/providers/descope.js +2 -0
- package/providers/discord.d.ts +3 -0
- package/providers/discord.d.ts.map +1 -0
- package/providers/discord.js +2 -0
- package/providers/dribbble.d.ts +3 -0
- package/providers/dribbble.d.ts.map +1 -0
- package/providers/dribbble.js +2 -0
- package/providers/dropbox.d.ts +3 -0
- package/providers/dropbox.d.ts.map +1 -0
- package/providers/dropbox.js +2 -0
- package/providers/duende-identity-server6.d.ts +3 -0
- package/providers/duende-identity-server6.d.ts.map +1 -0
- package/providers/duende-identity-server6.js +2 -0
- package/providers/email.d.ts +3 -0
- package/providers/email.d.ts.map +1 -0
- package/providers/email.js +2 -0
- package/providers/eveonline.d.ts +3 -0
- package/providers/eveonline.d.ts.map +1 -0
- package/providers/eveonline.js +2 -0
- package/providers/facebook.d.ts +3 -0
- package/providers/facebook.d.ts.map +1 -0
- package/providers/facebook.js +2 -0
- package/providers/faceit.d.ts +3 -0
- package/providers/faceit.d.ts.map +1 -0
- package/providers/faceit.js +2 -0
- package/providers/foursquare.d.ts +3 -0
- package/providers/foursquare.d.ts.map +1 -0
- package/providers/foursquare.js +2 -0
- package/providers/freshbooks.d.ts +3 -0
- package/providers/freshbooks.d.ts.map +1 -0
- package/providers/freshbooks.js +2 -0
- package/providers/fusionauth.d.ts +3 -0
- package/providers/fusionauth.d.ts.map +1 -0
- package/providers/fusionauth.js +2 -0
- package/providers/github.d.ts +3 -0
- package/providers/github.d.ts.map +1 -0
- package/providers/github.js +2 -0
- package/providers/gitlab.d.ts +3 -0
- package/providers/gitlab.d.ts.map +1 -0
- package/providers/gitlab.js +2 -0
- package/providers/google.d.ts +3 -0
- package/providers/google.d.ts.map +1 -0
- package/providers/google.js +2 -0
- package/providers/hubspot.d.ts +3 -0
- package/providers/hubspot.d.ts.map +1 -0
- package/providers/hubspot.js +2 -0
- package/providers/identity-server4.d.ts +3 -0
- package/providers/identity-server4.d.ts.map +1 -0
- package/providers/identity-server4.js +2 -0
- package/providers/index.d.ts +2 -0
- package/providers/index.d.ts.map +1 -0
- package/providers/index.js +1 -0
- package/providers/instagram.d.ts +3 -0
- package/providers/instagram.d.ts.map +1 -0
- package/providers/instagram.js +2 -0
- package/providers/kakao.d.ts +3 -0
- package/providers/kakao.d.ts.map +1 -0
- package/providers/kakao.js +2 -0
- package/providers/keycloak.d.ts +3 -0
- package/providers/keycloak.d.ts.map +1 -0
- package/providers/keycloak.js +2 -0
- package/providers/line.d.ts +3 -0
- package/providers/line.d.ts.map +1 -0
- package/providers/line.js +2 -0
- package/providers/linkedin.d.ts +3 -0
- package/providers/linkedin.d.ts.map +1 -0
- package/providers/linkedin.js +2 -0
- package/providers/mailchimp.d.ts +3 -0
- package/providers/mailchimp.d.ts.map +1 -0
- package/providers/mailchimp.js +2 -0
- package/providers/mailru.d.ts +3 -0
- package/providers/mailru.d.ts.map +1 -0
- package/providers/mailru.js +2 -0
- package/providers/mastodon.d.ts +3 -0
- package/providers/mastodon.d.ts.map +1 -0
- package/providers/mastodon.js +2 -0
- package/providers/mattermost.d.ts +3 -0
- package/providers/mattermost.d.ts.map +1 -0
- package/providers/mattermost.js +2 -0
- package/providers/medium.d.ts +3 -0
- package/providers/medium.d.ts.map +1 -0
- package/providers/medium.js +2 -0
- package/providers/microsoft-entra-id.d.ts +3 -0
- package/providers/microsoft-entra-id.d.ts.map +1 -0
- package/providers/microsoft-entra-id.js +2 -0
- package/providers/naver.d.ts +3 -0
- package/providers/naver.d.ts.map +1 -0
- package/providers/naver.js +2 -0
- package/providers/netlify.d.ts +3 -0
- package/providers/netlify.d.ts.map +1 -0
- package/providers/netlify.js +2 -0
- package/providers/netsuite.d.ts +3 -0
- package/providers/netsuite.d.ts.map +1 -0
- package/providers/netsuite.js +2 -0
- package/providers/nodemailer.d.ts +3 -0
- package/providers/nodemailer.d.ts.map +1 -0
- package/providers/nodemailer.js +2 -0
- package/providers/notion.d.ts +3 -0
- package/providers/notion.d.ts.map +1 -0
- package/providers/notion.js +2 -0
- package/providers/okta.d.ts +3 -0
- package/providers/okta.d.ts.map +1 -0
- package/providers/okta.js +2 -0
- package/providers/onelogin.d.ts +3 -0
- package/providers/onelogin.d.ts.map +1 -0
- package/providers/onelogin.js +2 -0
- package/providers/ory-hydra.d.ts +3 -0
- package/providers/ory-hydra.d.ts.map +1 -0
- package/providers/ory-hydra.js +2 -0
- package/providers/osso.d.ts +3 -0
- package/providers/osso.d.ts.map +1 -0
- package/providers/osso.js +2 -0
- package/providers/osu.d.ts +3 -0
- package/providers/osu.d.ts.map +1 -0
- package/providers/osu.js +2 -0
- package/providers/passage.d.ts +3 -0
- package/providers/passage.d.ts.map +1 -0
- package/providers/passage.js +2 -0
- package/providers/passkey.d.ts +3 -0
- package/providers/passkey.d.ts.map +1 -0
- package/providers/passkey.js +2 -0
- package/providers/patreon.d.ts +3 -0
- package/providers/patreon.d.ts.map +1 -0
- package/providers/patreon.js +2 -0
- package/providers/pinterest.d.ts +3 -0
- package/providers/pinterest.d.ts.map +1 -0
- package/providers/pinterest.js +2 -0
- package/providers/pipedrive.d.ts +3 -0
- package/providers/pipedrive.d.ts.map +1 -0
- package/providers/pipedrive.js +2 -0
- package/providers/postmark.d.ts +3 -0
- package/providers/postmark.d.ts.map +1 -0
- package/providers/postmark.js +2 -0
- package/providers/reddit.d.ts +3 -0
- package/providers/reddit.d.ts.map +1 -0
- package/providers/reddit.js +2 -0
- package/providers/resend.d.ts +3 -0
- package/providers/resend.d.ts.map +1 -0
- package/providers/resend.js +2 -0
- package/providers/salesforce.d.ts +3 -0
- package/providers/salesforce.d.ts.map +1 -0
- package/providers/salesforce.js +2 -0
- package/providers/sendgrid.d.ts +3 -0
- package/providers/sendgrid.d.ts.map +1 -0
- package/providers/sendgrid.js +2 -0
- package/providers/simplelogin.d.ts +3 -0
- package/providers/simplelogin.d.ts.map +1 -0
- package/providers/simplelogin.js +2 -0
- package/providers/slack.d.ts +3 -0
- package/providers/slack.d.ts.map +1 -0
- package/providers/slack.js +2 -0
- package/providers/spotify.d.ts +3 -0
- package/providers/spotify.d.ts.map +1 -0
- package/providers/spotify.js +2 -0
- package/providers/strava.d.ts +3 -0
- package/providers/strava.d.ts.map +1 -0
- package/providers/strava.js +2 -0
- package/providers/tiktok.d.ts +3 -0
- package/providers/tiktok.d.ts.map +1 -0
- package/providers/tiktok.js +2 -0
- package/providers/todoist.d.ts +3 -0
- package/providers/todoist.d.ts.map +1 -0
- package/providers/todoist.js +2 -0
- package/providers/trakt.d.ts +3 -0
- package/providers/trakt.d.ts.map +1 -0
- package/providers/trakt.js +2 -0
- package/providers/twitch.d.ts +3 -0
- package/providers/twitch.d.ts.map +1 -0
- package/providers/twitch.js +2 -0
- package/providers/twitter.d.ts +3 -0
- package/providers/twitter.d.ts.map +1 -0
- package/providers/twitter.js +2 -0
- package/providers/united-effects.d.ts +3 -0
- package/providers/united-effects.d.ts.map +1 -0
- package/providers/united-effects.js +2 -0
- package/providers/vk.d.ts +3 -0
- package/providers/vk.d.ts.map +1 -0
- package/providers/vk.js +2 -0
- package/providers/webauthn.d.ts +3 -0
- package/providers/webauthn.d.ts.map +1 -0
- package/providers/webauthn.js +2 -0
- package/providers/webex.d.ts +3 -0
- package/providers/webex.d.ts.map +1 -0
- package/providers/webex.js +2 -0
- package/providers/wikimedia.d.ts +3 -0
- package/providers/wikimedia.d.ts.map +1 -0
- package/providers/wikimedia.js +2 -0
- package/providers/wordpress.d.ts +3 -0
- package/providers/wordpress.d.ts.map +1 -0
- package/providers/wordpress.js +2 -0
- package/providers/workos.d.ts +3 -0
- package/providers/workos.d.ts.map +1 -0
- package/providers/workos.js +2 -0
- package/providers/yandex.d.ts +3 -0
- package/providers/yandex.d.ts.map +1 -0
- package/providers/yandex.js +2 -0
- package/providers/zitadel.d.ts +3 -0
- package/providers/zitadel.d.ts.map +1 -0
- package/providers/zitadel.js +2 -0
- package/providers/zoho.d.ts +3 -0
- package/providers/zoho.d.ts.map +1 -0
- package/providers/zoho.js +2 -0
- package/providers/zoom.d.ts +3 -0
- package/providers/zoom.d.ts.map +1 -0
- package/providers/zoom.js +2 -0
- package/src/index.ts +373 -0
- package/src/providers/42-school.ts +2 -0
- package/src/providers/apple.ts +2 -0
- package/src/providers/asgardeo.ts +2 -0
- package/src/providers/auth0.ts +2 -0
- package/src/providers/authentik.ts +2 -0
- package/src/providers/azure-ad-b2c.ts +2 -0
- package/src/providers/azure-ad.ts +2 -0
- package/src/providers/azure-devops.ts +2 -0
- package/src/providers/bankid-no.ts +2 -0
- package/src/providers/battlenet.ts +2 -0
- package/src/providers/beyondidentity.ts +2 -0
- package/src/providers/box.ts +2 -0
- package/src/providers/boxyhq-saml.ts +2 -0
- package/src/providers/bungie.ts +2 -0
- package/src/providers/click-up.ts +2 -0
- package/src/providers/cognito.ts +2 -0
- package/src/providers/coinbase.ts +2 -0
- package/src/providers/credentials.ts +2 -0
- package/src/providers/descope.ts +2 -0
- package/src/providers/discord.ts +2 -0
- package/src/providers/dribbble.ts +2 -0
- package/src/providers/dropbox.ts +2 -0
- package/src/providers/duende-identity-server6.ts +2 -0
- package/src/providers/email.ts +2 -0
- package/src/providers/eveonline.ts +2 -0
- package/src/providers/facebook.ts +2 -0
- package/src/providers/faceit.ts +2 -0
- package/src/providers/foursquare.ts +2 -0
- package/src/providers/freshbooks.ts +2 -0
- package/src/providers/fusionauth.ts +2 -0
- package/src/providers/github.ts +2 -0
- package/src/providers/gitlab.ts +2 -0
- package/src/providers/google.ts +2 -0
- package/src/providers/hubspot.ts +2 -0
- package/src/providers/identity-server4.ts +2 -0
- package/src/providers/index.ts +1 -0
- package/src/providers/instagram.ts +2 -0
- package/src/providers/kakao.ts +2 -0
- package/src/providers/keycloak.ts +2 -0
- package/src/providers/line.ts +2 -0
- package/src/providers/linkedin.ts +2 -0
- package/src/providers/mailchimp.ts +2 -0
- package/src/providers/mailru.ts +2 -0
- package/src/providers/mastodon.ts +2 -0
- package/src/providers/mattermost.ts +2 -0
- package/src/providers/medium.ts +2 -0
- package/src/providers/microsoft-entra-id.ts +2 -0
- package/src/providers/naver.ts +2 -0
- package/src/providers/netlify.ts +2 -0
- package/src/providers/netsuite.ts +2 -0
- package/src/providers/nodemailer.ts +2 -0
- package/src/providers/notion.ts +2 -0
- package/src/providers/okta.ts +2 -0
- package/src/providers/onelogin.ts +2 -0
- package/src/providers/ory-hydra.ts +2 -0
- package/src/providers/osso.ts +2 -0
- package/src/providers/osu.ts +2 -0
- package/src/providers/passage.ts +2 -0
- package/src/providers/passkey.ts +2 -0
- package/src/providers/patreon.ts +2 -0
- package/src/providers/pinterest.ts +2 -0
- package/src/providers/pipedrive.ts +2 -0
- package/src/providers/postmark.ts +2 -0
- package/src/providers/reddit.ts +2 -0
- package/src/providers/resend.ts +2 -0
- package/src/providers/salesforce.ts +2 -0
- package/src/providers/sendgrid.ts +2 -0
- package/src/providers/simplelogin.ts +2 -0
- package/src/providers/slack.ts +2 -0
- package/src/providers/spotify.ts +2 -0
- package/src/providers/strava.ts +2 -0
- package/src/providers/tiktok.ts +2 -0
- package/src/providers/todoist.ts +2 -0
- package/src/providers/trakt.ts +2 -0
- package/src/providers/twitch.ts +2 -0
- package/src/providers/twitter.ts +2 -0
- package/src/providers/united-effects.ts +2 -0
- package/src/providers/vk.ts +2 -0
- package/src/providers/webauthn.ts +2 -0
- package/src/providers/webex.ts +2 -0
- package/src/providers/wikimedia.ts +2 -0
- package/src/providers/wordpress.ts +2 -0
- package/src/providers/workos.ts +2 -0
- package/src/providers/yandex.ts +2 -0
- package/src/providers/zitadel.ts +2 -0
- package/src/providers/zoho.ts +2 -0
- 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 @@
|
|
|
1
|
+
export * from "@auth/core/providers"
|