@mulverse/mulguard-core 1.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/README.md +24 -0
- package/adapters.d.ts +522 -0
- package/adapters.d.ts.map +1 -0
- package/adapters.js +170 -0
- package/errors.d.ts +429 -0
- package/errors.d.ts.map +1 -0
- package/errors.js +473 -0
- package/index.d.ts +547 -0
- package/index.d.ts.map +1 -0
- package/index.js +142 -0
- package/jwt.d.ts +132 -0
- package/jwt.d.ts.map +1 -0
- package/jwt.js +123 -0
- package/lib/actions/callback/handle-login.d.ts +35 -0
- package/lib/actions/callback/handle-login.d.ts.map +1 -0
- package/lib/actions/callback/handle-login.js +275 -0
- package/lib/actions/callback/index.d.ts +5 -0
- package/lib/actions/callback/index.d.ts.map +1 -0
- package/lib/actions/callback/index.js +409 -0
- package/lib/actions/callback/oauth/callback.d.ts +36 -0
- package/lib/actions/callback/oauth/callback.d.ts.map +1 -0
- package/lib/actions/callback/oauth/callback.js +248 -0
- package/lib/actions/callback/oauth/checks.d.ts +70 -0
- package/lib/actions/callback/oauth/checks.d.ts.map +1 -0
- package/lib/actions/callback/oauth/checks.js +188 -0
- package/lib/actions/callback/oauth/csrf-token.d.ts +33 -0
- package/lib/actions/callback/oauth/csrf-token.d.ts.map +1 -0
- package/lib/actions/callback/oauth/csrf-token.js +39 -0
- package/lib/actions/index.d.ts +6 -0
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +5 -0
- package/lib/actions/session.d.ts +5 -0
- package/lib/actions/session.d.ts.map +1 -0
- package/lib/actions/session.js +127 -0
- package/lib/actions/signin/authorization-url.d.ts +12 -0
- package/lib/actions/signin/authorization-url.d.ts.map +1 -0
- package/lib/actions/signin/authorization-url.js +94 -0
- package/lib/actions/signin/index.d.ts +4 -0
- package/lib/actions/signin/index.d.ts.map +1 -0
- package/lib/actions/signin/index.js +22 -0
- package/lib/actions/signin/send-token.d.ts +10 -0
- package/lib/actions/signin/send-token.d.ts.map +1 -0
- package/lib/actions/signin/send-token.js +98 -0
- package/lib/actions/signout.d.ts +11 -0
- package/lib/actions/signout.d.ts.map +1 -0
- package/lib/actions/signout.js +30 -0
- package/lib/actions/webauthn-options.d.ts +8 -0
- package/lib/actions/webauthn-options.d.ts.map +1 -0
- package/lib/actions/webauthn-options.js +60 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +70 -0
- package/lib/init.d.ts +25 -0
- package/lib/init.d.ts.map +1 -0
- package/lib/init.js +172 -0
- package/lib/pages/error.d.ts +17 -0
- package/lib/pages/error.d.ts.map +1 -0
- package/lib/pages/error.js +40 -0
- package/lib/pages/index.d.ts +42 -0
- package/lib/pages/index.d.ts.map +1 -0
- package/lib/pages/index.js +136 -0
- package/lib/pages/signin.d.ts +10 -0
- package/lib/pages/signin.d.ts.map +1 -0
- package/lib/pages/signin.js +75 -0
- package/lib/pages/signout.d.ts +8 -0
- package/lib/pages/signout.d.ts.map +1 -0
- package/lib/pages/signout.js +17 -0
- package/lib/pages/styles.d.ts +3 -0
- package/lib/pages/styles.d.ts.map +1 -0
- package/lib/pages/styles.js +381 -0
- package/lib/pages/verify-request.d.ts +8 -0
- package/lib/pages/verify-request.d.ts.map +1 -0
- package/lib/pages/verify-request.js +11 -0
- package/lib/symbols.d.ts +50 -0
- package/lib/symbols.d.ts.map +1 -0
- package/lib/symbols.js +57 -0
- package/lib/utils/actions.d.ts +3 -0
- package/lib/utils/actions.d.ts.map +1 -0
- package/lib/utils/actions.js +14 -0
- package/lib/utils/assert.d.ts +14 -0
- package/lib/utils/assert.d.ts.map +1 -0
- package/lib/utils/assert.js +168 -0
- package/lib/utils/callback-url.d.ts +17 -0
- package/lib/utils/callback-url.d.ts.map +1 -0
- package/lib/utils/callback-url.js +27 -0
- package/lib/utils/cookie.d.ts +111 -0
- package/lib/utils/cookie.d.ts.map +1 -0
- package/lib/utils/cookie.js +205 -0
- package/lib/utils/date.d.ts +7 -0
- package/lib/utils/date.d.ts.map +1 -0
- package/lib/utils/date.js +8 -0
- package/lib/utils/email.d.ts +20 -0
- package/lib/utils/email.d.ts.map +1 -0
- package/lib/utils/email.js +57 -0
- package/lib/utils/env.d.ts +9 -0
- package/lib/utils/env.d.ts.map +1 -0
- package/lib/utils/env.js +96 -0
- package/lib/utils/logger.d.ts +18 -0
- package/lib/utils/logger.d.ts.map +1 -0
- package/lib/utils/logger.js +50 -0
- package/lib/utils/merge.d.ts +3 -0
- package/lib/utils/merge.d.ts.map +1 -0
- package/lib/utils/merge.js +23 -0
- package/lib/utils/providers.d.ts +19 -0
- package/lib/utils/providers.d.ts.map +1 -0
- package/lib/utils/providers.js +149 -0
- package/lib/utils/session.d.ts +7 -0
- package/lib/utils/session.d.ts.map +1 -0
- package/lib/utils/session.js +29 -0
- package/lib/utils/web.d.ts +10 -0
- package/lib/utils/web.d.ts.map +1 -0
- package/lib/utils/web.js +109 -0
- package/lib/utils/webauthn-client.d.ts +30 -0
- package/lib/utils/webauthn-client.d.ts.map +1 -0
- package/lib/utils/webauthn-client.js +197 -0
- package/lib/utils/webauthn-utils.d.ts +81 -0
- package/lib/utils/webauthn-utils.d.ts.map +1 -0
- package/lib/utils/webauthn-utils.js +343 -0
- package/lib/vendored/cookie.d.ts +120 -0
- package/lib/vendored/cookie.d.ts.map +1 -0
- package/lib/vendored/cookie.js +237 -0
- package/package.json +118 -0
- package/providers/42-school.d.ts +240 -0
- package/providers/42-school.d.ts.map +1 -0
- package/providers/42-school.js +78 -0
- package/providers/apple.d.ts +149 -0
- package/providers/apple.d.ts.map +1 -0
- package/providers/apple.js +104 -0
- package/providers/asgardeo.d.ts +102 -0
- package/providers/asgardeo.d.ts.map +1 -0
- package/providers/asgardeo.js +93 -0
- package/providers/atlassian.d.ts +94 -0
- package/providers/atlassian.d.ts.map +1 -0
- package/providers/atlassian.js +84 -0
- package/providers/auth0.d.ts +116 -0
- package/providers/auth0.d.ts.map +1 -0
- package/providers/auth0.js +49 -0
- package/providers/authentik.d.ts +90 -0
- package/providers/authentik.d.ts.map +1 -0
- package/providers/authentik.js +65 -0
- package/providers/azure-ad-b2c.d.ts +104 -0
- package/providers/azure-ad-b2c.d.ts.map +1 -0
- package/providers/azure-ad-b2c.js +100 -0
- package/providers/azure-ad.d.ts +19 -0
- package/providers/azure-ad.d.ts.map +1 -0
- package/providers/azure-ad.js +23 -0
- package/providers/azure-devops.d.ts +128 -0
- package/providers/azure-devops.d.ts.map +1 -0
- package/providers/azure-devops.js +158 -0
- package/providers/bankid-no.d.ts +134 -0
- package/providers/bankid-no.d.ts.map +1 -0
- package/providers/bankid-no.js +65 -0
- package/providers/battlenet.d.ts +85 -0
- package/providers/battlenet.d.ts.map +1 -0
- package/providers/battlenet.js +81 -0
- package/providers/beyondidentity.d.ts +77 -0
- package/providers/beyondidentity.d.ts.map +1 -0
- package/providers/beyondidentity.js +84 -0
- package/providers/bitbucket.d.ts +89 -0
- package/providers/bitbucket.d.ts.map +1 -0
- package/providers/bitbucket.js +92 -0
- package/providers/box.d.ts +63 -0
- package/providers/box.d.ts.map +1 -0
- package/providers/box.js +73 -0
- package/providers/boxyhq-saml.d.ts +121 -0
- package/providers/boxyhq-saml.d.ts.map +1 -0
- package/providers/boxyhq-saml.js +127 -0
- package/providers/bungie.d.ts +167 -0
- package/providers/bungie.d.ts.map +1 -0
- package/providers/bungie.js +174 -0
- package/providers/click-up.d.ts +75 -0
- package/providers/click-up.d.ts.map +1 -0
- package/providers/click-up.js +89 -0
- package/providers/cognito.d.ts +81 -0
- package/providers/cognito.d.ts.map +1 -0
- package/providers/cognito.js +73 -0
- package/providers/coinbase.d.ts +69 -0
- package/providers/coinbase.d.ts.map +1 -0
- package/providers/coinbase.js +78 -0
- package/providers/concept2.d.ts +81 -0
- package/providers/concept2.d.ts.map +1 -0
- package/providers/concept2.js +86 -0
- package/providers/credentials.d.ts +132 -0
- package/providers/credentials.d.ts.map +1 -0
- package/providers/credentials.js +74 -0
- package/providers/descope.d.ts +91 -0
- package/providers/descope.d.ts.map +1 -0
- package/providers/descope.js +78 -0
- package/providers/discord.d.ts +139 -0
- package/providers/discord.d.ts.map +1 -0
- package/providers/discord.js +86 -0
- package/providers/dribbble.d.ts +88 -0
- package/providers/dribbble.d.ts.map +1 -0
- package/providers/dribbble.js +85 -0
- package/providers/dropbox.d.ts +65 -0
- package/providers/dropbox.d.ts.map +1 -0
- package/providers/dropbox.js +88 -0
- package/providers/duende-identity-server6.d.ts +91 -0
- package/providers/duende-identity-server6.d.ts.map +1 -0
- package/providers/duende-identity-server6.js +80 -0
- package/providers/email.d.ts +41 -0
- package/providers/email.d.ts.map +1 -0
- package/providers/email.js +18 -0
- package/providers/eventbrite.d.ts +78 -0
- package/providers/eventbrite.d.ts.map +1 -0
- package/providers/eventbrite.js +88 -0
- package/providers/eveonline.d.ts +94 -0
- package/providers/eveonline.d.ts.map +1 -0
- package/providers/eveonline.js +92 -0
- package/providers/facebook.d.ts +84 -0
- package/providers/facebook.d.ts.map +1 -0
- package/providers/facebook.js +93 -0
- package/providers/faceit.d.ts +64 -0
- package/providers/faceit.d.ts.map +1 -0
- package/providers/faceit.js +74 -0
- package/providers/figma.d.ts +75 -0
- package/providers/figma.d.ts.map +1 -0
- package/providers/figma.js +81 -0
- package/providers/forwardemail.d.ts +4 -0
- package/providers/forwardemail.d.ts.map +1 -0
- package/providers/forwardemail.js +32 -0
- package/providers/foursquare.d.ts +71 -0
- package/providers/foursquare.d.ts.map +1 -0
- package/providers/foursquare.js +91 -0
- package/providers/freshbooks.d.ts +66 -0
- package/providers/freshbooks.d.ts.map +1 -0
- package/providers/freshbooks.js +76 -0
- package/providers/frontegg.d.ts +95 -0
- package/providers/frontegg.d.ts.map +1 -0
- package/providers/frontegg.js +88 -0
- package/providers/fusionauth.d.ts +279 -0
- package/providers/fusionauth.d.ts.map +1 -0
- package/providers/fusionauth.js +292 -0
- package/providers/github.d.ts +127 -0
- package/providers/github.d.ts.map +1 -0
- package/providers/github.js +115 -0
- package/providers/gitlab.d.ts +115 -0
- package/providers/gitlab.d.ts.map +1 -0
- package/providers/gitlab.js +75 -0
- package/providers/google.d.ts +138 -0
- package/providers/google.d.ts.map +1 -0
- package/providers/google.js +119 -0
- package/providers/hubspot.d.ts +76 -0
- package/providers/hubspot.d.ts.map +1 -0
- package/providers/hubspot.js +93 -0
- package/providers/huggingface.d.ts +216 -0
- package/providers/huggingface.d.ts.map +1 -0
- package/providers/huggingface.js +101 -0
- package/providers/identity-server4.d.ts +69 -0
- package/providers/identity-server4.d.ts.map +1 -0
- package/providers/identity-server4.js +64 -0
- package/providers/index.d.ts +61 -0
- package/providers/index.d.ts.map +1 -0
- package/providers/index.js +3 -0
- package/providers/instagram.d.ts +74 -0
- package/providers/instagram.d.ts.map +1 -0
- package/providers/instagram.js +87 -0
- package/providers/kakao.d.ts +148 -0
- package/providers/kakao.d.ts.map +1 -0
- package/providers/kakao.js +103 -0
- package/providers/keycloak.d.ts +100 -0
- package/providers/keycloak.d.ts.map +1 -0
- package/providers/keycloak.js +73 -0
- package/providers/kinde.d.ts +73 -0
- package/providers/kinde.d.ts.map +1 -0
- package/providers/kinde.js +51 -0
- package/providers/line.d.ts +83 -0
- package/providers/line.d.ts.map +1 -0
- package/providers/line.js +73 -0
- package/providers/linkedin.d.ts +77 -0
- package/providers/linkedin.d.ts.map +1 -0
- package/providers/linkedin.js +65 -0
- package/providers/logto.d.ts +98 -0
- package/providers/logto.d.ts.map +1 -0
- package/providers/logto.js +81 -0
- package/providers/loops.d.ts +40 -0
- package/providers/loops.d.ts.map +1 -0
- package/providers/loops.js +59 -0
- package/providers/mailchimp.d.ts +66 -0
- package/providers/mailchimp.d.ts.map +1 -0
- package/providers/mailchimp.js +76 -0
- package/providers/mailgun.d.ts +55 -0
- package/providers/mailgun.d.ts.map +1 -0
- package/providers/mailgun.js +74 -0
- package/providers/mailru.d.ts +63 -0
- package/providers/mailru.d.ts.map +1 -0
- package/providers/mailru.js +61 -0
- package/providers/mastodon.d.ts +90 -0
- package/providers/mastodon.d.ts.map +1 -0
- package/providers/mastodon.js +75 -0
- package/providers/mattermost.d.ts +132 -0
- package/providers/mattermost.d.ts.map +1 -0
- package/providers/mattermost.js +83 -0
- package/providers/medium.d.ts +68 -0
- package/providers/medium.d.ts.map +1 -0
- package/providers/medium.js +84 -0
- package/providers/microsoft-entra-id.d.ts +428 -0
- package/providers/microsoft-entra-id.d.ts.map +1 -0
- package/providers/microsoft-entra-id.js +156 -0
- package/providers/naver.d.ts +80 -0
- package/providers/naver.d.ts.map +1 -0
- package/providers/naver.js +79 -0
- package/providers/netlify.d.ts +66 -0
- package/providers/netlify.d.ts.map +1 -0
- package/providers/netlify.js +85 -0
- package/providers/netsuite.d.ts +189 -0
- package/providers/netsuite.d.ts.map +1 -0
- package/providers/netsuite.js +170 -0
- package/providers/nextcloud.d.ts +150 -0
- package/providers/nextcloud.d.ts.map +1 -0
- package/providers/nextcloud.js +99 -0
- package/providers/nodemailer.d.ts +27 -0
- package/providers/nodemailer.d.ts.map +1 -0
- package/providers/nodemailer.js +34 -0
- package/providers/notion.d.ts +99 -0
- package/providers/notion.d.ts.map +1 -0
- package/providers/notion.js +110 -0
- package/providers/oauth.d.ts +188 -0
- package/providers/oauth.d.ts.map +1 -0
- package/providers/oauth.js +1 -0
- package/providers/okta.d.ts +99 -0
- package/providers/okta.d.ts.map +1 -0
- package/providers/okta.js +63 -0
- package/providers/onelogin.d.ts +65 -0
- package/providers/onelogin.d.ts.map +1 -0
- package/providers/onelogin.js +61 -0
- package/providers/ory-hydra.d.ts +79 -0
- package/providers/ory-hydra.d.ts.map +1 -0
- package/providers/ory-hydra.js +67 -0
- package/providers/osso.d.ts +79 -0
- package/providers/osso.d.ts.map +1 -0
- package/providers/osso.js +77 -0
- package/providers/osu.d.ts +116 -0
- package/providers/osu.d.ts.map +1 -0
- package/providers/osu.js +75 -0
- package/providers/passage.d.ts +88 -0
- package/providers/passage.d.ts.map +1 -0
- package/providers/passage.js +75 -0
- package/providers/passkey.d.ts +65 -0
- package/providers/passkey.d.ts.map +1 -0
- package/providers/passkey.js +87 -0
- package/providers/patreon.d.ts +73 -0
- package/providers/patreon.d.ts.map +1 -0
- package/providers/patreon.js +77 -0
- package/providers/ping-id.d.ts +57 -0
- package/providers/ping-id.d.ts.map +1 -0
- package/providers/ping-id.js +40 -0
- package/providers/pinterest.d.ts +79 -0
- package/providers/pinterest.d.ts.map +1 -0
- package/providers/pinterest.js +85 -0
- package/providers/pipedrive.d.ts +99 -0
- package/providers/pipedrive.d.ts.map +1 -0
- package/providers/pipedrive.js +71 -0
- package/providers/postmark.d.ts +4 -0
- package/providers/postmark.d.ts.map +1 -0
- package/providers/postmark.js +36 -0
- package/providers/provider-types.d.ts +3 -0
- package/providers/provider-types.d.ts.map +1 -0
- package/providers/provider-types.js +1 -0
- package/providers/reddit.d.ts +88 -0
- package/providers/reddit.d.ts.map +1 -0
- package/providers/reddit.js +90 -0
- package/providers/resend.d.ts +4 -0
- package/providers/resend.d.ts.map +1 -0
- package/providers/resend.js +32 -0
- package/providers/roblox.d.ts +67 -0
- package/providers/roblox.d.ts.map +1 -0
- package/providers/roblox.js +53 -0
- package/providers/salesforce.d.ts +59 -0
- package/providers/salesforce.d.ts.map +1 -0
- package/providers/salesforce.js +52 -0
- package/providers/sendgrid.d.ts +4 -0
- package/providers/sendgrid.d.ts.map +1 -0
- package/providers/sendgrid.js +35 -0
- package/providers/simplelogin.d.ts +87 -0
- package/providers/simplelogin.d.ts.map +1 -0
- package/providers/simplelogin.js +83 -0
- package/providers/slack.d.ts +102 -0
- package/providers/slack.d.ts.map +1 -0
- package/providers/slack.js +69 -0
- package/providers/spotify.d.ts +75 -0
- package/providers/spotify.d.ts.map +1 -0
- package/providers/spotify.js +73 -0
- package/providers/strava.d.ts +68 -0
- package/providers/strava.d.ts.map +1 -0
- package/providers/strava.js +80 -0
- package/providers/threads.d.ts +108 -0
- package/providers/threads.d.ts.map +1 -0
- package/providers/threads.js +89 -0
- package/providers/tiktok.d.ts +248 -0
- package/providers/tiktok.d.ts.map +1 -0
- package/providers/tiktok.js +195 -0
- package/providers/todoist.d.ts +76 -0
- package/providers/todoist.d.ts.map +1 -0
- package/providers/todoist.js +97 -0
- package/providers/trakt.d.ts +93 -0
- package/providers/trakt.d.ts.map +1 -0
- package/providers/trakt.js +91 -0
- package/providers/twitch.d.ts +71 -0
- package/providers/twitch.d.ts.map +1 -0
- package/providers/twitch.js +96 -0
- package/providers/twitter.d.ts +183 -0
- package/providers/twitter.d.ts.map +1 -0
- package/providers/twitter.js +100 -0
- package/providers/united-effects.d.ts +80 -0
- package/providers/united-effects.d.ts.map +1 -0
- package/providers/united-effects.js +72 -0
- package/providers/vipps.d.ts +71 -0
- package/providers/vipps.d.ts.map +1 -0
- package/providers/vipps.js +33 -0
- package/providers/vk.d.ts +334 -0
- package/providers/vk.d.ts.map +1 -0
- package/providers/vk.js +103 -0
- package/providers/webauthn.d.ts +148 -0
- package/providers/webauthn.d.ts.map +1 -0
- package/providers/webauthn.js +128 -0
- package/providers/webex.d.ts +78 -0
- package/providers/webex.d.ts.map +1 -0
- package/providers/webex.js +73 -0
- package/providers/wechat.d.ts +78 -0
- package/providers/wechat.d.ts.map +1 -0
- package/providers/wechat.js +105 -0
- package/providers/wikimedia.d.ts +99 -0
- package/providers/wikimedia.d.ts.map +1 -0
- package/providers/wikimedia.js +90 -0
- package/providers/wordpress.d.ts +65 -0
- package/providers/wordpress.d.ts.map +1 -0
- package/providers/wordpress.js +71 -0
- package/providers/workos.d.ts +154 -0
- package/providers/workos.d.ts.map +1 -0
- package/providers/workos.js +143 -0
- package/providers/yandex.d.ts +131 -0
- package/providers/yandex.d.ts.map +1 -0
- package/providers/yandex.js +80 -0
- package/providers/zitadel.d.ts +117 -0
- package/providers/zitadel.d.ts.map +1 -0
- package/providers/zitadel.js +95 -0
- package/providers/zoho.d.ts +63 -0
- package/providers/zoho.d.ts.map +1 -0
- package/providers/zoho.js +79 -0
- package/providers/zoom.d.ts +93 -0
- package/providers/zoom.d.ts.map +1 -0
- package/providers/zoom.js +82 -0
- package/src/adapters/server-actions-helpers.ts +126 -0
- package/src/adapters.ts +603 -0
- package/src/errors.ts +551 -0
- package/src/index.ts +689 -0
- package/src/jwt.ts +283 -0
- package/src/lib/actions/callback/handle-login.ts +334 -0
- package/src/lib/actions/callback/index.ts +554 -0
- package/src/lib/actions/callback/oauth/callback.ts +347 -0
- package/src/lib/actions/callback/oauth/checks.ts +258 -0
- package/src/lib/actions/callback/oauth/csrf-token.ts +60 -0
- package/src/lib/actions/index.ts +5 -0
- package/src/lib/actions/session.ts +167 -0
- package/src/lib/actions/signin/authorization-url.ts +123 -0
- package/src/lib/actions/signin/index.ts +37 -0
- package/src/lib/actions/signin/send-token.ts +124 -0
- package/src/lib/actions/signout.ts +38 -0
- package/src/lib/actions/webauthn-options.ts +100 -0
- package/src/lib/index.ts +97 -0
- package/src/lib/init.ts +236 -0
- package/src/lib/pages/error.tsx +106 -0
- package/src/lib/pages/index.ts +181 -0
- package/src/lib/pages/signin.tsx +255 -0
- package/src/lib/pages/signout.tsx +49 -0
- package/src/lib/pages/styles.css +377 -0
- package/src/lib/pages/styles.ts +381 -0
- package/src/lib/pages/verify-request.tsx +36 -0
- package/src/lib/symbols.ts +60 -0
- package/src/lib/utils/actions.ts +17 -0
- package/src/lib/utils/assert.ts +259 -0
- package/src/lib/utils/callback-url.ts +42 -0
- package/src/lib/utils/cookie.ts +248 -0
- package/src/lib/utils/date.ts +8 -0
- package/src/lib/utils/email.ts +65 -0
- package/src/lib/utils/env.ts +113 -0
- package/src/lib/utils/logger.ts +75 -0
- package/src/lib/utils/merge.ts +30 -0
- package/src/lib/utils/providers.ts +203 -0
- package/src/lib/utils/session.ts +41 -0
- package/src/lib/utils/web.ts +151 -0
- package/src/lib/utils/webauthn-client.js +229 -0
- package/src/lib/utils/webauthn-utils.ts +531 -0
- package/src/lib/vendored/cookie.ts +383 -0
- package/src/providers/42-school.ts +256 -0
- package/src/providers/apple.ts +206 -0
- package/src/providers/asgardeo.ts +118 -0
- package/src/providers/atlassian.ts +120 -0
- package/src/providers/auth0.ts +127 -0
- package/src/providers/authentik.ts +100 -0
- package/src/providers/azure-ad-b2c.ts +124 -0
- package/src/providers/azure-ad.ts +30 -0
- package/src/providers/azure-devops.ts +184 -0
- package/src/providers/bankid-no.ts +161 -0
- package/src/providers/battlenet.ts +107 -0
- package/src/providers/beyondidentity.ts +102 -0
- package/src/providers/bitbucket.ts +122 -0
- package/src/providers/box.ts +87 -0
- package/src/providers/boxyhq-saml.ts +148 -0
- package/src/providers/bungie.ts +192 -0
- package/src/providers/click-up.ts +104 -0
- package/src/providers/cognito.ts +94 -0
- package/src/providers/coinbase.ts +93 -0
- package/src/providers/concept2.ts +108 -0
- package/src/providers/credentials.ts +157 -0
- package/src/providers/descope.ts +105 -0
- package/src/providers/discord.ts +176 -0
- package/src/providers/dribbble.ts +122 -0
- package/src/providers/dropbox.ts +102 -0
- package/src/providers/duende-identity-server6.ts +101 -0
- package/src/providers/email.ts +60 -0
- package/src/providers/eventbrite.ts +105 -0
- package/src/providers/eveonline.ts +117 -0
- package/src/providers/facebook.ts +119 -0
- package/src/providers/faceit.ts +90 -0
- package/src/providers/figma.ts +105 -0
- package/src/providers/forwardemail.ts +37 -0
- package/src/providers/foursquare.ts +105 -0
- package/src/providers/freshbooks.ts +90 -0
- package/src/providers/frontegg.ts +111 -0
- package/src/providers/fusionauth.ts +336 -0
- package/src/providers/github.ts +187 -0
- package/src/providers/gitlab.ts +140 -0
- package/src/providers/google.ts +152 -0
- package/src/providers/hubspot.ts +117 -0
- package/src/providers/huggingface.ts +234 -0
- package/src/providers/identity-server4.ts +78 -0
- package/src/providers/index.ts +115 -0
- package/src/providers/instagram.ts +103 -0
- package/src/providers/kakao.ts +184 -0
- package/src/providers/keycloak.ts +111 -0
- package/src/providers/kinde.ts +85 -0
- package/src/providers/line.ts +99 -0
- package/src/providers/linkedin.ts +91 -0
- package/src/providers/logto.ts +122 -0
- package/src/providers/loops.ts +79 -0
- package/src/providers/mailchimp.ts +90 -0
- package/src/providers/mailgun.ts +98 -0
- package/src/providers/mailru.ts +75 -0
- package/src/providers/mastodon.ts +112 -0
- package/src/providers/mattermost.ts +154 -0
- package/src/providers/medium.ts +89 -0
- package/src/providers/microsoft-entra-id.ts +497 -0
- package/src/providers/naver.ts +102 -0
- package/src/providers/netlify.ts +90 -0
- package/src/providers/netsuite.ts +225 -0
- package/src/providers/nextcloud.ts +207 -0
- package/src/providers/nodemailer.ts +84 -0
- package/src/providers/notion.ts +166 -0
- package/src/providers/oauth.ts +310 -0
- package/src/providers/okta.ts +111 -0
- package/src/providers/onelogin.ts +75 -0
- package/src/providers/ory-hydra.ts +93 -0
- package/src/providers/osso.ts +91 -0
- package/src/providers/osu.ts +138 -0
- package/src/providers/passage.ts +103 -0
- package/src/providers/passkey.ts +94 -0
- package/src/providers/patreon.ts +98 -0
- package/src/providers/ping-id.ts +68 -0
- package/src/providers/pinterest.ts +106 -0
- package/src/providers/pipedrive.ts +120 -0
- package/src/providers/postmark.ts +38 -0
- package/src/providers/provider-types.ts +107 -0
- package/src/providers/reddit.ts +104 -0
- package/src/providers/resend.ts +35 -0
- package/src/providers/roblox.ts +94 -0
- package/src/providers/salesforce.ts +73 -0
- package/src/providers/sendgrid.ts +36 -0
- package/src/providers/simplelogin.ts +107 -0
- package/src/providers/slack.ts +115 -0
- package/src/providers/spotify.ts +99 -0
- package/src/providers/strava.ts +101 -0
- package/src/providers/threads.ts +135 -0
- package/src/providers/tiktok.ts +319 -0
- package/src/providers/todoist.ts +122 -0
- package/src/providers/trakt.ts +120 -0
- package/src/providers/twitch.ts +121 -0
- package/src/providers/twitter.ts +207 -0
- package/src/providers/united-effects.ts +89 -0
- package/src/providers/vipps.ts +86 -0
- package/src/providers/vk.ts +401 -0
- package/src/providers/webauthn.ts +296 -0
- package/src/providers/webex.ts +102 -0
- package/src/providers/wechat.ts +141 -0
- package/src/providers/wikimedia.ts +258 -0
- package/src/providers/wordpress.ts +86 -0
- package/src/providers/workos.ts +180 -0
- package/src/providers/yandex.ts +159 -0
- package/src/providers/zitadel.ts +128 -0
- package/src/providers/zoho.ts +84 -0
- package/src/providers/zoom.ts +119 -0
- package/src/types.ts +430 -0
- package/src/warnings.ts +21 -0
- package/types.d.ts +309 -0
- package/types.d.ts.map +1 -0
- package/types.js +53 -0
- package/warnings.d.ts +17 -0
- package/warnings.d.ts.map +1 -0
- package/warnings.js +1 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
// TODO: Make this file smaller
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AuthError,
|
|
5
|
+
AccessDenied,
|
|
6
|
+
CallbackRouteError,
|
|
7
|
+
CredentialsSignin,
|
|
8
|
+
InvalidProvider,
|
|
9
|
+
Verification,
|
|
10
|
+
} from "../../../errors.js"
|
|
11
|
+
import { handleLoginOrRegister } from "./handle-login.js"
|
|
12
|
+
import { handleOAuth } from "./oauth/callback.js"
|
|
13
|
+
import { state } from "./oauth/checks.js"
|
|
14
|
+
import { createHash } from "../../utils/web.js"
|
|
15
|
+
|
|
16
|
+
import type { AdapterSession } from "../../../adapters.js"
|
|
17
|
+
import type {
|
|
18
|
+
Account,
|
|
19
|
+
Authenticator,
|
|
20
|
+
InternalOptions,
|
|
21
|
+
RequestInternal,
|
|
22
|
+
ResponseInternal,
|
|
23
|
+
User,
|
|
24
|
+
} from "../../../types.js"
|
|
25
|
+
import type { Cookie, SessionStore } from "../../utils/cookie.js"
|
|
26
|
+
import {
|
|
27
|
+
assertInternalOptionsWebAuthn,
|
|
28
|
+
verifyAuthenticate,
|
|
29
|
+
verifyRegister,
|
|
30
|
+
} from "../../utils/webauthn-utils.js"
|
|
31
|
+
|
|
32
|
+
/** Handle callbacks from login services */
|
|
33
|
+
export async function callback(
|
|
34
|
+
request: RequestInternal,
|
|
35
|
+
options: InternalOptions,
|
|
36
|
+
sessionStore: SessionStore,
|
|
37
|
+
cookies: Cookie[]
|
|
38
|
+
): Promise<ResponseInternal> {
|
|
39
|
+
if (!options.provider)
|
|
40
|
+
throw new InvalidProvider("Callback route called without provider")
|
|
41
|
+
const { query, body, method, headers } = request
|
|
42
|
+
const {
|
|
43
|
+
provider,
|
|
44
|
+
adapter,
|
|
45
|
+
url,
|
|
46
|
+
callbackUrl,
|
|
47
|
+
pages,
|
|
48
|
+
jwt,
|
|
49
|
+
events,
|
|
50
|
+
callbacks,
|
|
51
|
+
session: { strategy: sessionStrategy, maxAge: sessionMaxAge },
|
|
52
|
+
logger,
|
|
53
|
+
} = options
|
|
54
|
+
|
|
55
|
+
const useJwtSession = sessionStrategy === "jwt"
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
if (provider.type === "oauth" || provider.type === "oidc") {
|
|
59
|
+
// Use body if the response mode is set to form_post. For all other cases, use query
|
|
60
|
+
const params =
|
|
61
|
+
provider.authorization?.url.searchParams.get("response_mode") ===
|
|
62
|
+
"form_post"
|
|
63
|
+
? body
|
|
64
|
+
: query
|
|
65
|
+
|
|
66
|
+
// If we have a state and we are on a redirect proxy, we try to parse it
|
|
67
|
+
// and see if it contains a valid origin to redirect to. If it does, we
|
|
68
|
+
// redirect the user to that origin with the original state.
|
|
69
|
+
if (options.isOnRedirectProxy && params?.state) {
|
|
70
|
+
// NOTE: We rely on the state being encrypted using a shared secret
|
|
71
|
+
// between the proxy and the original server.
|
|
72
|
+
const parsedState = await state.decode(params.state, options)
|
|
73
|
+
const shouldRedirect =
|
|
74
|
+
parsedState?.origin &&
|
|
75
|
+
new URL(parsedState.origin).origin !== options.url.origin
|
|
76
|
+
if (shouldRedirect) {
|
|
77
|
+
const proxyRedirect = `${parsedState.origin}?${new URLSearchParams(params)}`
|
|
78
|
+
logger.debug("Proxy redirecting to", proxyRedirect)
|
|
79
|
+
return { redirect: proxyRedirect, cookies }
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const authorizationResult = await handleOAuth(
|
|
84
|
+
params,
|
|
85
|
+
request.cookies,
|
|
86
|
+
options
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if (authorizationResult.cookies.length) {
|
|
90
|
+
cookies.push(...authorizationResult.cookies)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
logger.debug("authorization result", authorizationResult)
|
|
94
|
+
|
|
95
|
+
const {
|
|
96
|
+
user: userFromProvider,
|
|
97
|
+
account,
|
|
98
|
+
profile: OAuthProfile,
|
|
99
|
+
} = authorizationResult
|
|
100
|
+
|
|
101
|
+
// If we don't have a profile object then either something went wrong
|
|
102
|
+
// or the user cancelled signing in. We don't know which, so we just
|
|
103
|
+
// direct the user to the signin page for now. We could do something
|
|
104
|
+
// else in future.
|
|
105
|
+
// TODO: Handle user cancelling signin
|
|
106
|
+
if (!userFromProvider || !account || !OAuthProfile) {
|
|
107
|
+
return { redirect: `${url}/signin`, cookies }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Check if user is allowed to sign in
|
|
111
|
+
// Attempt to get Profile from OAuth provider details before invoking
|
|
112
|
+
// signIn callback - but if no user object is returned, that is fine
|
|
113
|
+
// (that just means it's a new user signing in for the first time).
|
|
114
|
+
let userByAccount
|
|
115
|
+
if (adapter) {
|
|
116
|
+
const { getUserByAccount } = adapter
|
|
117
|
+
userByAccount = await getUserByAccount({
|
|
118
|
+
providerAccountId: account.providerAccountId,
|
|
119
|
+
provider: provider.id,
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const redirect = await handleAuthorized(
|
|
124
|
+
{
|
|
125
|
+
user: userByAccount ?? userFromProvider,
|
|
126
|
+
account,
|
|
127
|
+
profile: OAuthProfile,
|
|
128
|
+
},
|
|
129
|
+
options
|
|
130
|
+
)
|
|
131
|
+
if (redirect) return { redirect, cookies }
|
|
132
|
+
|
|
133
|
+
const { user, session, isNewUser } = await handleLoginOrRegister(
|
|
134
|
+
sessionStore.value,
|
|
135
|
+
userFromProvider,
|
|
136
|
+
account,
|
|
137
|
+
options
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
if (useJwtSession) {
|
|
141
|
+
const defaultToken = {
|
|
142
|
+
name: user.name,
|
|
143
|
+
email: user.email,
|
|
144
|
+
picture: user.image,
|
|
145
|
+
sub: user.id?.toString(),
|
|
146
|
+
}
|
|
147
|
+
const token = await callbacks.jwt({
|
|
148
|
+
token: defaultToken,
|
|
149
|
+
user,
|
|
150
|
+
account,
|
|
151
|
+
profile: OAuthProfile,
|
|
152
|
+
isNewUser,
|
|
153
|
+
trigger: isNewUser ? "signUp" : "signIn",
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
// Clear cookies if token is null
|
|
157
|
+
if (token === null) {
|
|
158
|
+
cookies.push(...sessionStore.clean())
|
|
159
|
+
} else {
|
|
160
|
+
const salt = options.cookies.sessionToken.name
|
|
161
|
+
// Encode token
|
|
162
|
+
const newToken = await jwt.encode({ ...jwt, token, salt })
|
|
163
|
+
|
|
164
|
+
// Set cookie expiry date
|
|
165
|
+
const cookieExpires = new Date()
|
|
166
|
+
cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
|
|
167
|
+
|
|
168
|
+
const sessionCookies = sessionStore.chunk(newToken, {
|
|
169
|
+
expires: cookieExpires,
|
|
170
|
+
})
|
|
171
|
+
cookies.push(...sessionCookies)
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
// Save Session Token in cookie
|
|
175
|
+
cookies.push({
|
|
176
|
+
name: options.cookies.sessionToken.name,
|
|
177
|
+
value: (session as AdapterSession).sessionToken,
|
|
178
|
+
options: {
|
|
179
|
+
...options.cookies.sessionToken.options,
|
|
180
|
+
expires: (session as AdapterSession).expires,
|
|
181
|
+
},
|
|
182
|
+
})
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
await events.signIn?.({
|
|
186
|
+
user,
|
|
187
|
+
account,
|
|
188
|
+
profile: OAuthProfile,
|
|
189
|
+
isNewUser,
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
// Handle first logins on new accounts
|
|
193
|
+
// e.g. option to send users to a new account landing page on initial login
|
|
194
|
+
// Note that the callback URL is preserved, so the journey can still be resumed
|
|
195
|
+
if (isNewUser && pages.newUser) {
|
|
196
|
+
return {
|
|
197
|
+
redirect: `${pages.newUser}${
|
|
198
|
+
pages.newUser.includes("?") ? "&" : "?"
|
|
199
|
+
}${new URLSearchParams({ callbackUrl })}`,
|
|
200
|
+
cookies,
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return { redirect: callbackUrl, cookies }
|
|
205
|
+
} else if (provider.type === "email") {
|
|
206
|
+
const paramToken = query?.token as string | undefined
|
|
207
|
+
const paramIdentifier = query?.email as string | undefined
|
|
208
|
+
|
|
209
|
+
if (!paramToken) {
|
|
210
|
+
const e = new TypeError(
|
|
211
|
+
"Missing token. The sign-in URL was manually opened without token or the link was not sent correctly in the email.",
|
|
212
|
+
{ cause: { hasToken: !!paramToken } }
|
|
213
|
+
)
|
|
214
|
+
e.name = "Configuration"
|
|
215
|
+
throw e
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const secret = provider.secret ?? options.secret
|
|
219
|
+
// @ts-expect-error -- Verified in `assertConfig`.
|
|
220
|
+
const invite = await adapter.useVerificationToken({
|
|
221
|
+
// @ts-expect-error User-land adapters might decide to omit the identifier during lookup
|
|
222
|
+
identifier: paramIdentifier, // TODO: Drop this requirement for lookup in official adapters too
|
|
223
|
+
token: await createHash(`${paramToken}${secret}`),
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
const hasInvite = !!invite
|
|
227
|
+
const expired = hasInvite && invite.expires.valueOf() < Date.now()
|
|
228
|
+
const invalidInvite =
|
|
229
|
+
!hasInvite ||
|
|
230
|
+
expired ||
|
|
231
|
+
// The user might have configured the link to not contain the identifier
|
|
232
|
+
// so we only compare if it exists
|
|
233
|
+
(paramIdentifier && invite.identifier !== paramIdentifier)
|
|
234
|
+
if (invalidInvite) throw new Verification({ hasInvite, expired })
|
|
235
|
+
|
|
236
|
+
const { identifier } = invite
|
|
237
|
+
const user = (await adapter!.getUserByEmail(identifier)) ?? {
|
|
238
|
+
id: crypto.randomUUID(),
|
|
239
|
+
email: identifier,
|
|
240
|
+
emailVerified: null,
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const account: Account = {
|
|
244
|
+
providerAccountId: user.email,
|
|
245
|
+
userId: user.id,
|
|
246
|
+
type: "email" as const,
|
|
247
|
+
provider: provider.id,
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const redirect = await handleAuthorized({ user, account }, options)
|
|
251
|
+
if (redirect) return { redirect, cookies }
|
|
252
|
+
|
|
253
|
+
// Sign user in
|
|
254
|
+
const {
|
|
255
|
+
user: loggedInUser,
|
|
256
|
+
session,
|
|
257
|
+
isNewUser,
|
|
258
|
+
} = await handleLoginOrRegister(
|
|
259
|
+
sessionStore.value,
|
|
260
|
+
user,
|
|
261
|
+
account,
|
|
262
|
+
options
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
if (useJwtSession) {
|
|
266
|
+
const defaultToken = {
|
|
267
|
+
name: loggedInUser.name,
|
|
268
|
+
email: loggedInUser.email,
|
|
269
|
+
picture: loggedInUser.image,
|
|
270
|
+
sub: loggedInUser.id?.toString(),
|
|
271
|
+
}
|
|
272
|
+
const token = await callbacks.jwt({
|
|
273
|
+
token: defaultToken,
|
|
274
|
+
user: loggedInUser,
|
|
275
|
+
account,
|
|
276
|
+
isNewUser,
|
|
277
|
+
trigger: isNewUser ? "signUp" : "signIn",
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
// Clear cookies if token is null
|
|
281
|
+
if (token === null) {
|
|
282
|
+
cookies.push(...sessionStore.clean())
|
|
283
|
+
} else {
|
|
284
|
+
const salt = options.cookies.sessionToken.name
|
|
285
|
+
// Encode token
|
|
286
|
+
const newToken = await jwt.encode({ ...jwt, token, salt })
|
|
287
|
+
|
|
288
|
+
// Set cookie expiry date
|
|
289
|
+
const cookieExpires = new Date()
|
|
290
|
+
cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
|
|
291
|
+
|
|
292
|
+
const sessionCookies = sessionStore.chunk(newToken, {
|
|
293
|
+
expires: cookieExpires,
|
|
294
|
+
})
|
|
295
|
+
cookies.push(...sessionCookies)
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
// Save Session Token in cookie
|
|
299
|
+
cookies.push({
|
|
300
|
+
name: options.cookies.sessionToken.name,
|
|
301
|
+
value: (session as AdapterSession).sessionToken,
|
|
302
|
+
options: {
|
|
303
|
+
...options.cookies.sessionToken.options,
|
|
304
|
+
expires: (session as AdapterSession).expires,
|
|
305
|
+
},
|
|
306
|
+
})
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
await events.signIn?.({ user: loggedInUser, account, isNewUser })
|
|
310
|
+
|
|
311
|
+
// Handle first logins on new accounts
|
|
312
|
+
// e.g. option to send users to a new account landing page on initial login
|
|
313
|
+
// Note that the callback URL is preserved, so the journey can still be resumed
|
|
314
|
+
if (isNewUser && pages.newUser) {
|
|
315
|
+
return {
|
|
316
|
+
redirect: `${pages.newUser}${
|
|
317
|
+
pages.newUser.includes("?") ? "&" : "?"
|
|
318
|
+
}${new URLSearchParams({ callbackUrl })}`,
|
|
319
|
+
cookies,
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Callback URL is already verified at this point, so safe to use if specified
|
|
324
|
+
return { redirect: callbackUrl, cookies }
|
|
325
|
+
} else if (provider.type === "credentials" && method === "POST") {
|
|
326
|
+
const credentials = body ?? {}
|
|
327
|
+
|
|
328
|
+
// TODO: Forward the original request as is, instead of reconstructing it
|
|
329
|
+
Object.entries(query ?? {}).forEach(([k, v]) =>
|
|
330
|
+
url.searchParams.set(k, v)
|
|
331
|
+
)
|
|
332
|
+
const userFromAuthorize = await provider.authorize(
|
|
333
|
+
credentials,
|
|
334
|
+
// prettier-ignore
|
|
335
|
+
new Request(url, { headers, method, body: JSON.stringify(body) })
|
|
336
|
+
)
|
|
337
|
+
const user = userFromAuthorize
|
|
338
|
+
|
|
339
|
+
if (!user) throw new CredentialsSignin()
|
|
340
|
+
else user.id = user.id?.toString() ?? crypto.randomUUID()
|
|
341
|
+
|
|
342
|
+
const account = {
|
|
343
|
+
providerAccountId: user.id,
|
|
344
|
+
type: "credentials",
|
|
345
|
+
provider: provider.id,
|
|
346
|
+
} satisfies Account
|
|
347
|
+
|
|
348
|
+
const redirect = await handleAuthorized(
|
|
349
|
+
{ user, account, credentials },
|
|
350
|
+
options
|
|
351
|
+
)
|
|
352
|
+
if (redirect) return { redirect, cookies }
|
|
353
|
+
|
|
354
|
+
const defaultToken = {
|
|
355
|
+
name: user.name,
|
|
356
|
+
email: user.email,
|
|
357
|
+
picture: user.image,
|
|
358
|
+
sub: user.id,
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const token = await callbacks.jwt({
|
|
362
|
+
token: defaultToken,
|
|
363
|
+
user,
|
|
364
|
+
account,
|
|
365
|
+
isNewUser: false,
|
|
366
|
+
trigger: "signIn",
|
|
367
|
+
})
|
|
368
|
+
|
|
369
|
+
// Clear cookies if token is null
|
|
370
|
+
if (token === null) {
|
|
371
|
+
cookies.push(...sessionStore.clean())
|
|
372
|
+
} else {
|
|
373
|
+
const salt = options.cookies.sessionToken.name
|
|
374
|
+
// Encode token
|
|
375
|
+
const newToken = await jwt.encode({ ...jwt, token, salt })
|
|
376
|
+
|
|
377
|
+
// Set cookie expiry date
|
|
378
|
+
const cookieExpires = new Date()
|
|
379
|
+
cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
|
|
380
|
+
|
|
381
|
+
const sessionCookies = sessionStore.chunk(newToken, {
|
|
382
|
+
expires: cookieExpires,
|
|
383
|
+
})
|
|
384
|
+
|
|
385
|
+
cookies.push(...sessionCookies)
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
await events.signIn?.({ user, account })
|
|
389
|
+
|
|
390
|
+
return { redirect: callbackUrl, cookies }
|
|
391
|
+
} else if (provider.type === "webauthn" && method === "POST") {
|
|
392
|
+
// Get callback action from request. It should be either "authenticate" or "register"
|
|
393
|
+
const action = request.body?.action
|
|
394
|
+
if (
|
|
395
|
+
typeof action !== "string" ||
|
|
396
|
+
(action !== "authenticate" && action !== "register")
|
|
397
|
+
) {
|
|
398
|
+
throw new AuthError("Invalid action parameter")
|
|
399
|
+
}
|
|
400
|
+
// Return an error if the adapter is missing or if the provider
|
|
401
|
+
// is not a webauthn provider.
|
|
402
|
+
const localOptions = assertInternalOptionsWebAuthn(options)
|
|
403
|
+
|
|
404
|
+
// Verify request to get user, account and authenticator
|
|
405
|
+
let user: User
|
|
406
|
+
let account: Account
|
|
407
|
+
let authenticator: Authenticator | undefined
|
|
408
|
+
switch (action) {
|
|
409
|
+
case "authenticate": {
|
|
410
|
+
const verified = await verifyAuthenticate(
|
|
411
|
+
localOptions,
|
|
412
|
+
request,
|
|
413
|
+
cookies
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
user = verified.user
|
|
417
|
+
account = verified.account
|
|
418
|
+
|
|
419
|
+
break
|
|
420
|
+
}
|
|
421
|
+
case "register": {
|
|
422
|
+
const verified = await verifyRegister(options, request, cookies)
|
|
423
|
+
|
|
424
|
+
user = verified.user
|
|
425
|
+
account = verified.account
|
|
426
|
+
authenticator = verified.authenticator
|
|
427
|
+
|
|
428
|
+
break
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// Check if user is allowed to sign in
|
|
433
|
+
await handleAuthorized({ user, account }, options)
|
|
434
|
+
|
|
435
|
+
// Sign user in, creating them and their account if needed
|
|
436
|
+
const {
|
|
437
|
+
user: loggedInUser,
|
|
438
|
+
isNewUser,
|
|
439
|
+
session,
|
|
440
|
+
account: currentAccount,
|
|
441
|
+
} = await handleLoginOrRegister(
|
|
442
|
+
sessionStore.value,
|
|
443
|
+
user,
|
|
444
|
+
account,
|
|
445
|
+
options
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
if (!currentAccount) {
|
|
449
|
+
// This is mostly for type checking. It should never actually happen.
|
|
450
|
+
throw new AuthError("Error creating or finding account")
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Create new authenticator if needed
|
|
454
|
+
if (authenticator && loggedInUser.id) {
|
|
455
|
+
await localOptions.adapter.createAuthenticator({
|
|
456
|
+
...authenticator,
|
|
457
|
+
userId: loggedInUser.id,
|
|
458
|
+
})
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Do the session registering dance
|
|
462
|
+
if (useJwtSession) {
|
|
463
|
+
const defaultToken = {
|
|
464
|
+
name: loggedInUser.name,
|
|
465
|
+
email: loggedInUser.email,
|
|
466
|
+
picture: loggedInUser.image,
|
|
467
|
+
sub: loggedInUser.id?.toString(),
|
|
468
|
+
}
|
|
469
|
+
const token = await callbacks.jwt({
|
|
470
|
+
token: defaultToken,
|
|
471
|
+
user: loggedInUser,
|
|
472
|
+
account: currentAccount,
|
|
473
|
+
isNewUser,
|
|
474
|
+
trigger: isNewUser ? "signUp" : "signIn",
|
|
475
|
+
})
|
|
476
|
+
|
|
477
|
+
// Clear cookies if token is null
|
|
478
|
+
if (token === null) {
|
|
479
|
+
cookies.push(...sessionStore.clean())
|
|
480
|
+
} else {
|
|
481
|
+
const salt = options.cookies.sessionToken.name
|
|
482
|
+
// Encode token
|
|
483
|
+
const newToken = await jwt.encode({ ...jwt, token, salt })
|
|
484
|
+
|
|
485
|
+
// Set cookie expiry date
|
|
486
|
+
const cookieExpires = new Date()
|
|
487
|
+
cookieExpires.setTime(cookieExpires.getTime() + sessionMaxAge * 1000)
|
|
488
|
+
|
|
489
|
+
const sessionCookies = sessionStore.chunk(newToken, {
|
|
490
|
+
expires: cookieExpires,
|
|
491
|
+
})
|
|
492
|
+
cookies.push(...sessionCookies)
|
|
493
|
+
}
|
|
494
|
+
} else {
|
|
495
|
+
// Save Session Token in cookie
|
|
496
|
+
cookies.push({
|
|
497
|
+
name: options.cookies.sessionToken.name,
|
|
498
|
+
value: (session as AdapterSession).sessionToken,
|
|
499
|
+
options: {
|
|
500
|
+
...options.cookies.sessionToken.options,
|
|
501
|
+
expires: (session as AdapterSession).expires,
|
|
502
|
+
},
|
|
503
|
+
})
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
await events.signIn?.({
|
|
507
|
+
user: loggedInUser,
|
|
508
|
+
account: currentAccount,
|
|
509
|
+
isNewUser,
|
|
510
|
+
})
|
|
511
|
+
|
|
512
|
+
// Handle first logins on new accounts
|
|
513
|
+
// e.g. option to send users to a new account landing page on initial login
|
|
514
|
+
// Note that the callback URL is preserved, so the journey can still be resumed
|
|
515
|
+
if (isNewUser && pages.newUser) {
|
|
516
|
+
return {
|
|
517
|
+
redirect: `${pages.newUser}${
|
|
518
|
+
pages.newUser.includes("?") ? "&" : "?"
|
|
519
|
+
}${new URLSearchParams({ callbackUrl })}`,
|
|
520
|
+
cookies,
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Callback URL is already verified at this point, so safe to use if specified
|
|
525
|
+
return { redirect: callbackUrl, cookies }
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
throw new InvalidProvider(
|
|
529
|
+
`Callback for provider type (${provider.type}) is not supported`
|
|
530
|
+
)
|
|
531
|
+
} catch (e) {
|
|
532
|
+
if (e instanceof AuthError) throw e
|
|
533
|
+
const error = new CallbackRouteError(e as Error, { provider: provider.id })
|
|
534
|
+
logger.debug("callback route error details", { method, query, body })
|
|
535
|
+
throw error
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
async function handleAuthorized(
|
|
540
|
+
params: Parameters<InternalOptions["callbacks"]["signIn"]>[0],
|
|
541
|
+
config: InternalOptions
|
|
542
|
+
): Promise<string | undefined> {
|
|
543
|
+
let authorized
|
|
544
|
+
const { signIn, redirect } = config.callbacks
|
|
545
|
+
try {
|
|
546
|
+
authorized = await signIn(params)
|
|
547
|
+
} catch (e) {
|
|
548
|
+
if (e instanceof AuthError) throw e
|
|
549
|
+
throw new AccessDenied(e as Error)
|
|
550
|
+
}
|
|
551
|
+
if (!authorized) throw new AccessDenied("AccessDenied")
|
|
552
|
+
if (typeof authorized !== "string") return
|
|
553
|
+
return await redirect({ url: authorized, baseUrl: config.url.origin })
|
|
554
|
+
}
|