@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,113 @@
|
|
|
1
|
+
import type { AuthAction } from "../../types.js"
|
|
2
|
+
import type { AuthConfig } from "../../index.js"
|
|
3
|
+
import { setLogger } from "./logger.js"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Set default env variables on the config object
|
|
7
|
+
* @param suppressWarnings intended for framework authors.
|
|
8
|
+
*/
|
|
9
|
+
export function setEnvDefaults(
|
|
10
|
+
envObject: any,
|
|
11
|
+
config: AuthConfig,
|
|
12
|
+
suppressBasePathWarning = false
|
|
13
|
+
) {
|
|
14
|
+
try {
|
|
15
|
+
const url = envObject.AUTH_URL
|
|
16
|
+
if (url) {
|
|
17
|
+
if (config.basePath) {
|
|
18
|
+
if (!suppressBasePathWarning) {
|
|
19
|
+
const logger = setLogger(config)
|
|
20
|
+
logger.warn("env-url-basepath-redundant")
|
|
21
|
+
}
|
|
22
|
+
} else {
|
|
23
|
+
config.basePath = new URL(url).pathname
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
} catch {
|
|
27
|
+
// Catching and swallowing potential URL parsing errors, we'll fall
|
|
28
|
+
// back to `/auth` below.
|
|
29
|
+
} finally {
|
|
30
|
+
config.basePath ??= `/auth`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!config.secret?.length) {
|
|
34
|
+
config.secret = []
|
|
35
|
+
const secret = envObject.AUTH_SECRET
|
|
36
|
+
if (secret) config.secret.push(secret)
|
|
37
|
+
for (const i of [1, 2, 3]) {
|
|
38
|
+
const secret = envObject[`AUTH_SECRET_${i}`]
|
|
39
|
+
if (secret) config.secret.unshift(secret)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
config.redirectProxyUrl ??= envObject.AUTH_REDIRECT_PROXY_URL
|
|
44
|
+
config.trustHost ??= !!(
|
|
45
|
+
envObject.AUTH_URL ??
|
|
46
|
+
envObject.AUTH_TRUST_HOST ??
|
|
47
|
+
envObject.VERCEL ??
|
|
48
|
+
envObject.CF_PAGES ??
|
|
49
|
+
envObject.NODE_ENV !== "production"
|
|
50
|
+
)
|
|
51
|
+
config.providers = config.providers.map((provider) => {
|
|
52
|
+
const { id } = typeof provider === "function" ? provider({}) : provider
|
|
53
|
+
const ID = id.toUpperCase().replace(/-/g, "_")
|
|
54
|
+
const clientId = envObject[`AUTH_${ID}_ID`]
|
|
55
|
+
const clientSecret = envObject[`AUTH_${ID}_SECRET`]
|
|
56
|
+
const issuer = envObject[`AUTH_${ID}_ISSUER`]
|
|
57
|
+
const apiKey = envObject[`AUTH_${ID}_KEY`]
|
|
58
|
+
const finalProvider =
|
|
59
|
+
typeof provider === "function"
|
|
60
|
+
? provider({ clientId, clientSecret, issuer, apiKey })
|
|
61
|
+
: provider
|
|
62
|
+
if (finalProvider.type === "oauth" || finalProvider.type === "oidc") {
|
|
63
|
+
finalProvider.clientId ??= clientId
|
|
64
|
+
finalProvider.clientSecret ??= clientSecret
|
|
65
|
+
finalProvider.issuer ??= issuer
|
|
66
|
+
} else if (finalProvider.type === "email") {
|
|
67
|
+
finalProvider.apiKey ??= apiKey
|
|
68
|
+
}
|
|
69
|
+
return finalProvider
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function createActionURL(
|
|
74
|
+
action: AuthAction,
|
|
75
|
+
protocol: string,
|
|
76
|
+
headers: Headers,
|
|
77
|
+
envObject: any,
|
|
78
|
+
config: Pick<AuthConfig, "basePath" | "logger">
|
|
79
|
+
): URL {
|
|
80
|
+
const basePath = config?.basePath
|
|
81
|
+
const envUrl = envObject.AUTH_URL ?? envObject.NEXTAUTH_URL
|
|
82
|
+
|
|
83
|
+
let url: URL
|
|
84
|
+
if (envUrl) {
|
|
85
|
+
url = new URL(envUrl)
|
|
86
|
+
if (basePath && basePath !== "/" && url.pathname !== "/") {
|
|
87
|
+
if (url.pathname !== basePath) {
|
|
88
|
+
const logger = setLogger(config)
|
|
89
|
+
logger.warn("env-url-basepath-mismatch")
|
|
90
|
+
}
|
|
91
|
+
url.pathname = "/"
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
const detectedHost = headers.get("x-forwarded-host") ?? headers.get("host")
|
|
95
|
+
const detectedProtocol =
|
|
96
|
+
headers.get("x-forwarded-proto") ?? protocol ?? "https"
|
|
97
|
+
const _protocol = detectedProtocol.endsWith(":")
|
|
98
|
+
? detectedProtocol
|
|
99
|
+
: detectedProtocol + ":"
|
|
100
|
+
|
|
101
|
+
url = new URL(`${_protocol}//${detectedHost}`)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// remove trailing slash
|
|
105
|
+
const sanitizedUrl = url.toString().replace(/\/$/, "")
|
|
106
|
+
|
|
107
|
+
if (basePath) {
|
|
108
|
+
// remove leading and trailing slash
|
|
109
|
+
const sanitizedBasePath = basePath?.replace(/(^\/|\/$)/g, "") ?? ""
|
|
110
|
+
return new URL(`${sanitizedUrl}/${sanitizedBasePath}/${action}`)
|
|
111
|
+
}
|
|
112
|
+
return new URL(`${sanitizedUrl}/${action}`)
|
|
113
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { AuthError } from "../../errors.js"
|
|
2
|
+
import type { WarningCode } from "../../warnings.js"
|
|
3
|
+
import type { AuthConfig } from "../../index.js"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Override any of the methods, and the rest will use the default logger.
|
|
7
|
+
*
|
|
8
|
+
* [Documentation](https://authjs.dev/reference/core#authconfig#logger)
|
|
9
|
+
*/
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
11
|
+
export interface LoggerInstance extends Record<string, Function> {
|
|
12
|
+
warn: (code: WarningCode) => void
|
|
13
|
+
error: (error: Error) => void
|
|
14
|
+
debug: (message: string, metadata?: unknown) => void
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const red = "\x1b[31m"
|
|
18
|
+
const yellow = "\x1b[33m"
|
|
19
|
+
const grey = "\x1b[90m"
|
|
20
|
+
const reset = "\x1b[0m"
|
|
21
|
+
|
|
22
|
+
const defaultLogger: LoggerInstance = {
|
|
23
|
+
error(error) {
|
|
24
|
+
const name = error instanceof AuthError ? error.type : error.name
|
|
25
|
+
console.error(`${red}[auth][error]${reset} ${name}: ${error.message}`)
|
|
26
|
+
if (
|
|
27
|
+
error.cause &&
|
|
28
|
+
typeof error.cause === "object" &&
|
|
29
|
+
"err" in error.cause &&
|
|
30
|
+
error.cause.err instanceof Error
|
|
31
|
+
) {
|
|
32
|
+
const { err, ...data } = error.cause
|
|
33
|
+
console.error(`${red}[auth][cause]${reset}:`, err.stack)
|
|
34
|
+
if (data)
|
|
35
|
+
console.error(
|
|
36
|
+
`${red}[auth][details]${reset}:`,
|
|
37
|
+
JSON.stringify(data, null, 2)
|
|
38
|
+
)
|
|
39
|
+
} else if (error.stack) {
|
|
40
|
+
console.error(error.stack.replace(/.*/, "").substring(1))
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
warn(code) {
|
|
44
|
+
const url = `https://warnings.authjs.dev`
|
|
45
|
+
console.warn(`${yellow}[auth][warn][${code}]${reset}`, `Read more: ${url}`)
|
|
46
|
+
},
|
|
47
|
+
debug(message, metadata) {
|
|
48
|
+
console.log(
|
|
49
|
+
`${grey}[auth][debug]:${reset} ${message}`,
|
|
50
|
+
JSON.stringify(metadata, null, 2)
|
|
51
|
+
)
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Override the built-in logger with user's implementation.
|
|
57
|
+
* Any `undefined` level will use the default logger.
|
|
58
|
+
*/
|
|
59
|
+
export function setLogger(
|
|
60
|
+
config: Pick<AuthConfig, "logger" | "debug">
|
|
61
|
+
): LoggerInstance {
|
|
62
|
+
const newLogger: LoggerInstance = {
|
|
63
|
+
...defaultLogger,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Turn off debug logging if `debug` isn't set to `true`
|
|
67
|
+
if (!config.debug) newLogger.debug = () => {}
|
|
68
|
+
|
|
69
|
+
if (config.logger?.error) newLogger.error = config.logger.error
|
|
70
|
+
if (config.logger?.warn) newLogger.warn = config.logger.warn
|
|
71
|
+
if (config.logger?.debug) newLogger.debug = config.logger.debug
|
|
72
|
+
|
|
73
|
+
config.logger ??= newLogger
|
|
74
|
+
return newLogger
|
|
75
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function isObject(item: unknown): item is object {
|
|
2
|
+
return item !== null && typeof item === "object"
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
/** Deep merge two or more objects */
|
|
6
|
+
export function merge<T extends Record<string, unknown>>(
|
|
7
|
+
target: T,
|
|
8
|
+
...sources: Array<Record<string, unknown> | undefined>
|
|
9
|
+
): T & Record<string, unknown> {
|
|
10
|
+
if (!sources.length) return target
|
|
11
|
+
const source = sources.shift()
|
|
12
|
+
|
|
13
|
+
if (isObject(target) && isObject(source)) {
|
|
14
|
+
for (const key in source) {
|
|
15
|
+
if (isObject(source[key])) {
|
|
16
|
+
if (!isObject(target[key]))
|
|
17
|
+
(target as Record<string, unknown>)[key] = Array.isArray(source[key])
|
|
18
|
+
? []
|
|
19
|
+
: {}
|
|
20
|
+
merge(
|
|
21
|
+
(target as Record<string, unknown>)[key] as T,
|
|
22
|
+
source[key] as Record<string, unknown>
|
|
23
|
+
)
|
|
24
|
+
} else if (source[key] !== undefined)
|
|
25
|
+
(target as Record<string, unknown>)[key] = source[key]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return merge(target, ...sources)
|
|
30
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { merge } from "./merge.js"
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
AccountCallback,
|
|
5
|
+
OAuthConfig,
|
|
6
|
+
OAuthConfigInternal,
|
|
7
|
+
OAuthEndpointType,
|
|
8
|
+
OAuthUserConfig,
|
|
9
|
+
ProfileCallback,
|
|
10
|
+
} from "../../providers/index.js"
|
|
11
|
+
import type { InternalProvider, Profile } from "../../types.js"
|
|
12
|
+
import { type AuthConfig } from "../../index.js"
|
|
13
|
+
import { customFetch } from "../symbols.js"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Adds `signinUrl` and `callbackUrl` to each provider
|
|
17
|
+
* and deep merge user-defined options.
|
|
18
|
+
*/
|
|
19
|
+
export default function parseProviders(params: {
|
|
20
|
+
url: URL
|
|
21
|
+
providerId?: string
|
|
22
|
+
config: AuthConfig
|
|
23
|
+
}): {
|
|
24
|
+
providers: InternalProvider[]
|
|
25
|
+
provider?: InternalProvider
|
|
26
|
+
} {
|
|
27
|
+
const { providerId, config } = params
|
|
28
|
+
const url = new URL(config.basePath ?? "/auth", params.url.origin)
|
|
29
|
+
|
|
30
|
+
const providers = config.providers.map((p) => {
|
|
31
|
+
const provider = typeof p === "function" ? p() : p
|
|
32
|
+
const { options: userOptions, ...defaults } = provider
|
|
33
|
+
|
|
34
|
+
const id = (userOptions?.id ?? defaults.id) as string
|
|
35
|
+
// TODO: Support if properties have different types, e.g. authorization: string or object
|
|
36
|
+
const merged = merge(defaults, userOptions, {
|
|
37
|
+
signinUrl: `${url}/signin/${id}`,
|
|
38
|
+
callbackUrl: `${url}/callback/${id}`,
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
if (provider.type === "oauth" || provider.type === "oidc") {
|
|
42
|
+
merged.redirectProxyUrl ??=
|
|
43
|
+
userOptions?.redirectProxyUrl ?? config.redirectProxyUrl
|
|
44
|
+
|
|
45
|
+
const normalized = normalizeOAuth(merged) as InternalProvider<
|
|
46
|
+
"oauth" | "oidc"
|
|
47
|
+
>
|
|
48
|
+
// We currently don't support redirect proxies for response_mode=form_post
|
|
49
|
+
if (
|
|
50
|
+
normalized.authorization?.url.searchParams.get("response_mode") ===
|
|
51
|
+
"form_post"
|
|
52
|
+
) {
|
|
53
|
+
delete normalized.redirectProxyUrl
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// @ts-expect-error Symbols don't get merged by the `merge` function
|
|
57
|
+
// so we need to do it manually.
|
|
58
|
+
normalized[customFetch] ??= userOptions?.[customFetch]
|
|
59
|
+
return normalized
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return merged as InternalProvider
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const provider = providers.find(({ id }) => id === providerId)
|
|
66
|
+
if (providerId && !provider) {
|
|
67
|
+
const availableProviders = providers.map((p) => p.id).join(", ")
|
|
68
|
+
throw new Error(
|
|
69
|
+
`Provider with id "${providerId}" not found. Available providers: [${availableProviders}].`
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return { providers, provider }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// TODO: Also add discovery here, if some endpoints/config are missing.
|
|
77
|
+
// We should return both a client and authorization server config.
|
|
78
|
+
function normalizeOAuth(
|
|
79
|
+
c: OAuthConfig<any> | OAuthUserConfig<any>
|
|
80
|
+
): OAuthConfigInternal<any> | object {
|
|
81
|
+
if (c.issuer) c.wellKnown ??= `${c.issuer}/.well-known/openid-configuration`
|
|
82
|
+
|
|
83
|
+
const authorization = normalizeEndpoint(c.authorization, c.issuer)
|
|
84
|
+
if (authorization && !authorization.url?.searchParams.has("scope")) {
|
|
85
|
+
authorization.url.searchParams.set("scope", "openid profile email")
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const token = normalizeEndpoint(c.token, c.issuer)
|
|
89
|
+
|
|
90
|
+
const userinfo = normalizeEndpoint(c.userinfo, c.issuer)
|
|
91
|
+
|
|
92
|
+
const checks = c.checks ?? ["pkce"]
|
|
93
|
+
if (c.redirectProxyUrl) {
|
|
94
|
+
if (!checks.includes("state")) checks.push("state")
|
|
95
|
+
c.redirectProxyUrl = `${c.redirectProxyUrl}/callback/${c.id}`
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
...c,
|
|
100
|
+
authorization,
|
|
101
|
+
token,
|
|
102
|
+
checks,
|
|
103
|
+
userinfo,
|
|
104
|
+
profile: c.profile ?? defaultProfile,
|
|
105
|
+
account: c.account ?? defaultAccount,
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Returns basic user profile from the userinfo response/`id_token` claims.
|
|
111
|
+
* The returned `id` will become the `account.providerAccountId`. `user.id`
|
|
112
|
+
* and `account.id` are auto-generated UUID's.
|
|
113
|
+
*
|
|
114
|
+
* The result if this function is used to create the `User` in the database.
|
|
115
|
+
* @see https://authjs.dev/reference/core/adapters#user
|
|
116
|
+
* @see https://openid.net/specs/openid-connect-core-1_0.html#IDToken
|
|
117
|
+
* @see https://openid.net/specs/openid-connect-core-1_0.html#
|
|
118
|
+
*/
|
|
119
|
+
const defaultProfile: ProfileCallback<Profile> = (profile) => {
|
|
120
|
+
return stripUndefined({
|
|
121
|
+
id: profile.sub ?? profile.id ?? crypto.randomUUID(),
|
|
122
|
+
name: profile.name ?? profile.nickname ?? profile.preferred_username,
|
|
123
|
+
email: profile.email,
|
|
124
|
+
image: profile.picture,
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Returns basic OAuth/OIDC values from the token response.
|
|
130
|
+
* @see https://www.ietf.org/rfc/rfc6749.html#section-5.1
|
|
131
|
+
* @see https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse
|
|
132
|
+
* @see https://authjs.dev/reference/core/adapters#account
|
|
133
|
+
*/
|
|
134
|
+
const defaultAccount: AccountCallback = (account) => {
|
|
135
|
+
return stripUndefined({
|
|
136
|
+
access_token: account.access_token,
|
|
137
|
+
id_token: account.id_token,
|
|
138
|
+
refresh_token: account.refresh_token,
|
|
139
|
+
expires_at: account.expires_at,
|
|
140
|
+
scope: account.scope,
|
|
141
|
+
token_type: account.token_type,
|
|
142
|
+
session_state: account.session_state,
|
|
143
|
+
})
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function stripUndefined<T extends object>(o: T): T {
|
|
147
|
+
const result = {} as any
|
|
148
|
+
for (const [k, v] of Object.entries(o)) {
|
|
149
|
+
if (v !== undefined) result[k] = v
|
|
150
|
+
}
|
|
151
|
+
return result as T
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function normalizeEndpoint(
|
|
155
|
+
e?: OAuthConfig<any>[OAuthEndpointType],
|
|
156
|
+
issuer?: string
|
|
157
|
+
): OAuthConfigInternal<any>[OAuthEndpointType] {
|
|
158
|
+
if (!e && issuer) return
|
|
159
|
+
if (typeof e === "string") {
|
|
160
|
+
return { url: new URL(e) }
|
|
161
|
+
}
|
|
162
|
+
// If e.url is undefined, it's because the provider config
|
|
163
|
+
// assumes that we will use the issuer endpoint.
|
|
164
|
+
// The existence of either e.url or provider.issuer is checked in
|
|
165
|
+
// assert.ts. We fallback to "https://authjs.dev" to be able to pass around
|
|
166
|
+
// a valid URL even if the user only provided params.
|
|
167
|
+
// NOTE: This need to be checked when constructing the URL
|
|
168
|
+
// for the authorization, token and userinfo endpoints.
|
|
169
|
+
const url = new URL(e?.url ?? "https://authjs.dev")
|
|
170
|
+
if (e?.params != null) {
|
|
171
|
+
for (let [key, value] of Object.entries(e.params)) {
|
|
172
|
+
if (key === "claims") {
|
|
173
|
+
value = JSON.stringify(value)
|
|
174
|
+
}
|
|
175
|
+
url.searchParams.set(key, String(value))
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
url,
|
|
180
|
+
request: e?.request,
|
|
181
|
+
conform: e?.conform,
|
|
182
|
+
...(e?.clientPrivateKey ? { clientPrivateKey: e?.clientPrivateKey } : null),
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function isOIDCProvider(
|
|
187
|
+
provider: InternalProvider<"oidc" | "oauth">
|
|
188
|
+
): provider is InternalProvider<"oidc"> {
|
|
189
|
+
return provider.type === "oidc"
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function isOAuth2Provider(
|
|
193
|
+
provider: InternalProvider<"oidc" | "oauth">
|
|
194
|
+
): provider is InternalProvider<"oauth"> {
|
|
195
|
+
return provider.type === "oauth"
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** Either OAuth 2 or OIDC */
|
|
199
|
+
export function isOAuthProvider(
|
|
200
|
+
provider: InternalProvider<any>
|
|
201
|
+
): provider is InternalProvider<"oauth" | "oidc"> {
|
|
202
|
+
return provider.type === "oauth" || provider.type === "oidc"
|
|
203
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { InternalOptions, User } from "../../types.js"
|
|
2
|
+
import type { SessionStore } from "./cookie.js"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns the currently logged in user, if any.
|
|
6
|
+
*/
|
|
7
|
+
export async function getLoggedInUser(
|
|
8
|
+
options: InternalOptions,
|
|
9
|
+
sessionStore: SessionStore
|
|
10
|
+
): Promise<User | null> {
|
|
11
|
+
const {
|
|
12
|
+
adapter,
|
|
13
|
+
jwt,
|
|
14
|
+
session: { strategy: sessionStrategy },
|
|
15
|
+
} = options
|
|
16
|
+
|
|
17
|
+
const sessionToken = sessionStore.value
|
|
18
|
+
if (!sessionToken) return null
|
|
19
|
+
|
|
20
|
+
// Try to decode JWT
|
|
21
|
+
if (sessionStrategy === "jwt") {
|
|
22
|
+
const salt = options.cookies.sessionToken.name
|
|
23
|
+
const payload = await jwt.decode({ ...jwt, token: sessionToken, salt })
|
|
24
|
+
|
|
25
|
+
if (payload && payload.sub) {
|
|
26
|
+
return {
|
|
27
|
+
id: payload.sub,
|
|
28
|
+
name: payload.name,
|
|
29
|
+
email: payload.email,
|
|
30
|
+
image: payload.picture,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
const userAndSession = await adapter?.getSessionAndUser(sessionToken)
|
|
35
|
+
if (userAndSession) {
|
|
36
|
+
return userAndSession.user
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return null
|
|
41
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as cookie from "../vendored/cookie.js"
|
|
2
|
+
import { UnknownAction } from "../../errors.js"
|
|
3
|
+
import { setLogger } from "./logger.js"
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
AuthAction,
|
|
7
|
+
RequestInternal,
|
|
8
|
+
ResponseInternal,
|
|
9
|
+
} from "../../types.js"
|
|
10
|
+
import { isAuthAction } from "./actions.js"
|
|
11
|
+
import type { AuthConfig } from "../../index.js"
|
|
12
|
+
|
|
13
|
+
const { parse: parseCookie, serialize: serializeCookie } = cookie
|
|
14
|
+
|
|
15
|
+
async function getBody(req: Request): Promise<Record<string, any> | undefined> {
|
|
16
|
+
if (!("body" in req) || !req.body || req.method !== "POST") return
|
|
17
|
+
|
|
18
|
+
const contentType = req.headers.get("content-type")
|
|
19
|
+
if (contentType?.includes("application/json")) {
|
|
20
|
+
return await req.json()
|
|
21
|
+
} else if (contentType?.includes("application/x-www-form-urlencoded")) {
|
|
22
|
+
const params = new URLSearchParams(await req.text())
|
|
23
|
+
return Object.fromEntries(params)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export async function toInternalRequest(
|
|
28
|
+
req: Request,
|
|
29
|
+
config: AuthConfig
|
|
30
|
+
): Promise<RequestInternal | undefined> {
|
|
31
|
+
try {
|
|
32
|
+
if (req.method !== "GET" && req.method !== "POST")
|
|
33
|
+
throw new UnknownAction("Only GET and POST requests are supported")
|
|
34
|
+
|
|
35
|
+
// Defaults are usually set in the `init` function, but this is needed below
|
|
36
|
+
config.basePath ??= "/auth"
|
|
37
|
+
|
|
38
|
+
const url = new URL(req.url)
|
|
39
|
+
|
|
40
|
+
const { action, providerId } = parseActionAndProviderId(
|
|
41
|
+
url.pathname,
|
|
42
|
+
config.basePath
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
url,
|
|
47
|
+
action,
|
|
48
|
+
providerId,
|
|
49
|
+
method: req.method,
|
|
50
|
+
headers: Object.fromEntries(req.headers),
|
|
51
|
+
body: req.body ? await getBody(req) : undefined,
|
|
52
|
+
cookies: parseCookie(req.headers.get("cookie") ?? "") ?? {},
|
|
53
|
+
error: url.searchParams.get("error") ?? undefined,
|
|
54
|
+
query: Object.fromEntries(url.searchParams),
|
|
55
|
+
}
|
|
56
|
+
} catch (e) {
|
|
57
|
+
const logger = setLogger(config)
|
|
58
|
+
logger.error(e as Error)
|
|
59
|
+
logger.debug("request", req)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function toRequest(request: RequestInternal): Request {
|
|
64
|
+
return new Request(request.url, {
|
|
65
|
+
headers: request.headers,
|
|
66
|
+
method: request.method,
|
|
67
|
+
body:
|
|
68
|
+
request.method === "POST"
|
|
69
|
+
? JSON.stringify(request.body ?? {})
|
|
70
|
+
: undefined,
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function toResponse(res: ResponseInternal): Response {
|
|
75
|
+
const headers = new Headers(res.headers)
|
|
76
|
+
|
|
77
|
+
res.cookies?.forEach((cookie) => {
|
|
78
|
+
const { name, value, options } = cookie
|
|
79
|
+
const cookieHeader = serializeCookie(name, value, options)
|
|
80
|
+
if (headers.has("Set-Cookie")) headers.append("Set-Cookie", cookieHeader)
|
|
81
|
+
else headers.set("Set-Cookie", cookieHeader)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
let body = res.body
|
|
85
|
+
|
|
86
|
+
if (headers.get("content-type") === "application/json")
|
|
87
|
+
body = JSON.stringify(res.body)
|
|
88
|
+
else if (headers.get("content-type") === "application/x-www-form-urlencoded")
|
|
89
|
+
body = new URLSearchParams(res.body).toString()
|
|
90
|
+
|
|
91
|
+
const status = res.redirect ? 302 : (res.status ?? 200)
|
|
92
|
+
const response = new Response(body, { headers, status })
|
|
93
|
+
|
|
94
|
+
if (res.redirect) response.headers.set("Location", res.redirect)
|
|
95
|
+
|
|
96
|
+
return response
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Web compatible method to create a hash, using SHA256 */
|
|
100
|
+
export async function createHash(message: string) {
|
|
101
|
+
const data = new TextEncoder().encode(message)
|
|
102
|
+
const hash = await crypto.subtle.digest("SHA-256", data)
|
|
103
|
+
return Array.from(new Uint8Array(hash))
|
|
104
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
105
|
+
.join("")
|
|
106
|
+
.toString()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Web compatible method to create a random string of a given length */
|
|
110
|
+
export function randomString(size: number) {
|
|
111
|
+
const i2hex = (i: number) => ("0" + i.toString(16)).slice(-2)
|
|
112
|
+
const r = (a: string, i: number): string => a + i2hex(i)
|
|
113
|
+
const bytes = crypto.getRandomValues(new Uint8Array(size))
|
|
114
|
+
return Array.from(bytes).reduce(r, "")
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** @internal Parse the action and provider id from a URL pathname. */
|
|
118
|
+
export function parseActionAndProviderId(
|
|
119
|
+
pathname: string,
|
|
120
|
+
base: string
|
|
121
|
+
): {
|
|
122
|
+
action: AuthAction
|
|
123
|
+
providerId?: string
|
|
124
|
+
} {
|
|
125
|
+
const a = pathname.match(new RegExp(`^${base}(.+)`))
|
|
126
|
+
|
|
127
|
+
if (a === null) throw new UnknownAction(`Cannot parse action at ${pathname}`)
|
|
128
|
+
|
|
129
|
+
const actionAndProviderId = a.at(-1)!
|
|
130
|
+
|
|
131
|
+
const b = actionAndProviderId.replace(/^\//, "").split("/").filter(Boolean)
|
|
132
|
+
|
|
133
|
+
if (b.length !== 1 && b.length !== 2)
|
|
134
|
+
throw new UnknownAction(`Cannot parse action at ${pathname}`)
|
|
135
|
+
|
|
136
|
+
const [action, providerId] = b
|
|
137
|
+
|
|
138
|
+
if (!isAuthAction(action))
|
|
139
|
+
throw new UnknownAction(`Cannot parse action at ${pathname}`)
|
|
140
|
+
|
|
141
|
+
if (
|
|
142
|
+
providerId &&
|
|
143
|
+
!["signin", "callback", "webauthn-options"].includes(action)
|
|
144
|
+
)
|
|
145
|
+
throw new UnknownAction(`Cannot parse action at ${pathname}`)
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
action,
|
|
149
|
+
providerId: providerId == "undefined" ? undefined : providerId,
|
|
150
|
+
}
|
|
151
|
+
}
|