mulguard 1.1.7 → 1.1.8
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 +21 -582
- package/adapters.d.ts +2 -0
- package/adapters.d.ts.map +1 -0
- package/adapters.js +1 -0
- package/index.d.ts +329 -0
- package/index.d.ts.map +1 -0
- package/index.js +145 -0
- package/jwt.d.ts +9 -0
- package/jwt.d.ts.map +1 -0
- package/jwt.js +8 -0
- package/lib/actions.d.ts +13 -0
- package/lib/actions.d.ts.map +1 -0
- package/lib/actions.js +86 -0
- package/lib/client.d.ts +104 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +95 -0
- package/lib/env.d.ts +12 -0
- package/lib/env.d.ts.map +1 -0
- package/lib/env.js +38 -0
- package/lib/index.d.ts +56 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +187 -0
- package/lib/types.d.ts +24 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +1 -0
- package/middleware.d.ts +9 -0
- package/middleware.d.ts.map +1 -0
- package/middleware.js +12 -0
- package/next.d.ts +9 -0
- package/next.d.ts.map +1 -0
- package/next.js +12 -0
- package/package.json +117 -126
- package/providers/42-school.d.ts +3 -0
- package/providers/42-school.d.ts.map +1 -0
- package/providers/42-school.js +2 -0
- package/providers/apple.d.ts +3 -0
- package/providers/apple.d.ts.map +1 -0
- package/providers/apple.js +2 -0
- package/providers/asgardeo.d.ts +3 -0
- package/providers/asgardeo.d.ts.map +1 -0
- package/providers/asgardeo.js +2 -0
- package/providers/atlassian.d.ts +3 -0
- package/providers/atlassian.d.ts.map +1 -0
- package/providers/atlassian.js +2 -0
- package/providers/auth0.d.ts +3 -0
- package/providers/auth0.d.ts.map +1 -0
- package/providers/auth0.js +2 -0
- package/providers/authentik.d.ts +3 -0
- package/providers/authentik.d.ts.map +1 -0
- package/providers/authentik.js +2 -0
- package/providers/azure-ad-b2c.d.ts +3 -0
- package/providers/azure-ad-b2c.d.ts.map +1 -0
- package/providers/azure-ad-b2c.js +2 -0
- package/providers/azure-ad.d.ts +3 -0
- package/providers/azure-ad.d.ts.map +1 -0
- package/providers/azure-ad.js +2 -0
- package/providers/azure-devops.d.ts +3 -0
- package/providers/azure-devops.d.ts.map +1 -0
- package/providers/azure-devops.js +2 -0
- package/providers/bankid-no.d.ts +3 -0
- package/providers/bankid-no.d.ts.map +1 -0
- package/providers/bankid-no.js +2 -0
- package/providers/battlenet.d.ts +3 -0
- package/providers/battlenet.d.ts.map +1 -0
- package/providers/battlenet.js +2 -0
- package/providers/beyondidentity.d.ts +3 -0
- package/providers/beyondidentity.d.ts.map +1 -0
- package/providers/beyondidentity.js +2 -0
- package/providers/bitbucket.d.ts +3 -0
- package/providers/bitbucket.d.ts.map +1 -0
- package/providers/bitbucket.js +2 -0
- package/providers/box.d.ts +3 -0
- package/providers/box.d.ts.map +1 -0
- package/providers/box.js +2 -0
- package/providers/boxyhq-saml.d.ts +3 -0
- package/providers/boxyhq-saml.d.ts.map +1 -0
- package/providers/boxyhq-saml.js +2 -0
- package/providers/bungie.d.ts +3 -0
- package/providers/bungie.d.ts.map +1 -0
- package/providers/bungie.js +2 -0
- package/providers/click-up.d.ts +3 -0
- package/providers/click-up.d.ts.map +1 -0
- package/providers/click-up.js +2 -0
- package/providers/cognito.d.ts +3 -0
- package/providers/cognito.d.ts.map +1 -0
- package/providers/cognito.js +2 -0
- package/providers/coinbase.d.ts +3 -0
- package/providers/coinbase.d.ts.map +1 -0
- package/providers/coinbase.js +2 -0
- package/providers/concept2.d.ts +3 -0
- package/providers/concept2.d.ts.map +1 -0
- package/providers/concept2.js +2 -0
- package/providers/credentials.d.ts +3 -0
- package/providers/credentials.d.ts.map +1 -0
- package/providers/credentials.js +2 -0
- package/providers/descope.d.ts +3 -0
- package/providers/descope.d.ts.map +1 -0
- package/providers/descope.js +2 -0
- package/providers/discord.d.ts +3 -0
- package/providers/discord.d.ts.map +1 -0
- package/providers/discord.js +2 -0
- package/providers/dribbble.d.ts +3 -0
- package/providers/dribbble.d.ts.map +1 -0
- package/providers/dribbble.js +2 -0
- package/providers/dropbox.d.ts +3 -0
- package/providers/dropbox.d.ts.map +1 -0
- package/providers/dropbox.js +2 -0
- package/providers/duende-identity-server6.d.ts +3 -0
- package/providers/duende-identity-server6.d.ts.map +1 -0
- package/providers/duende-identity-server6.js +2 -0
- package/providers/email.d.ts +3 -0
- package/providers/email.d.ts.map +1 -0
- package/providers/email.js +2 -0
- package/providers/eventbrite.d.ts +3 -0
- package/providers/eventbrite.d.ts.map +1 -0
- package/providers/eventbrite.js +2 -0
- package/providers/eveonline.d.ts +3 -0
- package/providers/eveonline.d.ts.map +1 -0
- package/providers/eveonline.js +2 -0
- package/providers/facebook.d.ts +3 -0
- package/providers/facebook.d.ts.map +1 -0
- package/providers/facebook.js +2 -0
- package/providers/faceit.d.ts +3 -0
- package/providers/faceit.d.ts.map +1 -0
- package/providers/faceit.js +2 -0
- package/providers/figma.d.ts +3 -0
- package/providers/figma.d.ts.map +1 -0
- package/providers/figma.js +2 -0
- package/providers/forwardemail.d.ts +3 -0
- package/providers/forwardemail.d.ts.map +1 -0
- package/providers/forwardemail.js +2 -0
- package/providers/foursquare.d.ts +3 -0
- package/providers/foursquare.d.ts.map +1 -0
- package/providers/foursquare.js +2 -0
- package/providers/freshbooks.d.ts +3 -0
- package/providers/freshbooks.d.ts.map +1 -0
- package/providers/freshbooks.js +2 -0
- package/providers/frontegg.d.ts +3 -0
- package/providers/frontegg.d.ts.map +1 -0
- package/providers/frontegg.js +2 -0
- package/providers/fusionauth.d.ts +3 -0
- package/providers/fusionauth.d.ts.map +1 -0
- package/providers/fusionauth.js +2 -0
- package/providers/github.d.ts +3 -0
- package/providers/github.d.ts.map +1 -0
- package/providers/github.js +2 -0
- package/providers/gitlab.d.ts +3 -0
- package/providers/gitlab.d.ts.map +1 -0
- package/providers/gitlab.js +2 -0
- package/providers/google.d.ts +3 -0
- package/providers/google.d.ts.map +1 -0
- package/providers/google.js +2 -0
- package/providers/hubspot.d.ts +3 -0
- package/providers/hubspot.d.ts.map +1 -0
- package/providers/hubspot.js +2 -0
- package/providers/huggingface.d.ts +3 -0
- package/providers/huggingface.d.ts.map +1 -0
- package/providers/huggingface.js +2 -0
- package/providers/identity-server4.d.ts +3 -0
- package/providers/identity-server4.d.ts.map +1 -0
- package/providers/identity-server4.js +2 -0
- package/providers/index.d.ts +2 -0
- package/providers/index.d.ts.map +1 -0
- package/providers/index.js +1 -0
- package/providers/instagram.d.ts +3 -0
- package/providers/instagram.d.ts.map +1 -0
- package/providers/instagram.js +2 -0
- package/providers/kakao.d.ts +3 -0
- package/providers/kakao.d.ts.map +1 -0
- package/providers/kakao.js +2 -0
- package/providers/keycloak.d.ts +3 -0
- package/providers/keycloak.d.ts.map +1 -0
- package/providers/keycloak.js +2 -0
- package/providers/kinde.d.ts +3 -0
- package/providers/kinde.d.ts.map +1 -0
- package/providers/kinde.js +2 -0
- package/providers/line.d.ts +3 -0
- package/providers/line.d.ts.map +1 -0
- package/providers/line.js +2 -0
- package/providers/linkedin.d.ts +3 -0
- package/providers/linkedin.d.ts.map +1 -0
- package/providers/linkedin.js +2 -0
- package/providers/logto.d.ts +3 -0
- package/providers/logto.d.ts.map +1 -0
- package/providers/logto.js +2 -0
- package/providers/loops.d.ts +3 -0
- package/providers/loops.d.ts.map +1 -0
- package/providers/loops.js +2 -0
- package/providers/mailchimp.d.ts +3 -0
- package/providers/mailchimp.d.ts.map +1 -0
- package/providers/mailchimp.js +2 -0
- package/providers/mailgun.d.ts +3 -0
- package/providers/mailgun.d.ts.map +1 -0
- package/providers/mailgun.js +2 -0
- package/providers/mailru.d.ts +3 -0
- package/providers/mailru.d.ts.map +1 -0
- package/providers/mailru.js +2 -0
- package/providers/mastodon.d.ts +3 -0
- package/providers/mastodon.d.ts.map +1 -0
- package/providers/mastodon.js +2 -0
- package/providers/mattermost.d.ts +3 -0
- package/providers/mattermost.d.ts.map +1 -0
- package/providers/mattermost.js +2 -0
- package/providers/medium.d.ts +3 -0
- package/providers/medium.d.ts.map +1 -0
- package/providers/medium.js +2 -0
- package/providers/microsoft-entra-id.d.ts +3 -0
- package/providers/microsoft-entra-id.d.ts.map +1 -0
- package/providers/microsoft-entra-id.js +2 -0
- package/providers/naver.d.ts +3 -0
- package/providers/naver.d.ts.map +1 -0
- package/providers/naver.js +2 -0
- package/providers/netlify.d.ts +3 -0
- package/providers/netlify.d.ts.map +1 -0
- package/providers/netlify.js +2 -0
- package/providers/netsuite.d.ts +3 -0
- package/providers/netsuite.d.ts.map +1 -0
- package/providers/netsuite.js +2 -0
- package/providers/nextcloud.d.ts +3 -0
- package/providers/nextcloud.d.ts.map +1 -0
- package/providers/nextcloud.js +2 -0
- package/providers/nodemailer.d.ts +3 -0
- package/providers/nodemailer.d.ts.map +1 -0
- package/providers/nodemailer.js +2 -0
- package/providers/notion.d.ts +3 -0
- package/providers/notion.d.ts.map +1 -0
- package/providers/notion.js +2 -0
- package/providers/okta.d.ts +3 -0
- package/providers/okta.d.ts.map +1 -0
- package/providers/okta.js +2 -0
- package/providers/onelogin.d.ts +3 -0
- package/providers/onelogin.d.ts.map +1 -0
- package/providers/onelogin.js +2 -0
- package/providers/ory-hydra.d.ts +3 -0
- package/providers/ory-hydra.d.ts.map +1 -0
- package/providers/ory-hydra.js +2 -0
- package/providers/osso.d.ts +3 -0
- package/providers/osso.d.ts.map +1 -0
- package/providers/osso.js +2 -0
- package/providers/osu.d.ts +3 -0
- package/providers/osu.d.ts.map +1 -0
- package/providers/osu.js +2 -0
- package/providers/passage.d.ts +3 -0
- package/providers/passage.d.ts.map +1 -0
- package/providers/passage.js +2 -0
- package/providers/passkey.d.ts +3 -0
- package/providers/passkey.d.ts.map +1 -0
- package/providers/passkey.js +2 -0
- package/providers/patreon.d.ts +3 -0
- package/providers/patreon.d.ts.map +1 -0
- package/providers/patreon.js +2 -0
- package/providers/ping-id.d.ts +3 -0
- package/providers/ping-id.d.ts.map +1 -0
- package/providers/ping-id.js +2 -0
- package/providers/pinterest.d.ts +3 -0
- package/providers/pinterest.d.ts.map +1 -0
- package/providers/pinterest.js +2 -0
- package/providers/pipedrive.d.ts +3 -0
- package/providers/pipedrive.d.ts.map +1 -0
- package/providers/pipedrive.js +2 -0
- package/providers/postmark.d.ts +3 -0
- package/providers/postmark.d.ts.map +1 -0
- package/providers/postmark.js +2 -0
- package/providers/reddit.d.ts +3 -0
- package/providers/reddit.d.ts.map +1 -0
- package/providers/reddit.js +2 -0
- package/providers/resend.d.ts +3 -0
- package/providers/resend.d.ts.map +1 -0
- package/providers/resend.js +2 -0
- package/providers/roblox.d.ts +3 -0
- package/providers/roblox.d.ts.map +1 -0
- package/providers/roblox.js +2 -0
- package/providers/salesforce.d.ts +3 -0
- package/providers/salesforce.d.ts.map +1 -0
- package/providers/salesforce.js +2 -0
- package/providers/sendgrid.d.ts +3 -0
- package/providers/sendgrid.d.ts.map +1 -0
- package/providers/sendgrid.js +2 -0
- package/providers/simplelogin.d.ts +3 -0
- package/providers/simplelogin.d.ts.map +1 -0
- package/providers/simplelogin.js +2 -0
- package/providers/slack.d.ts +3 -0
- package/providers/slack.d.ts.map +1 -0
- package/providers/slack.js +2 -0
- package/providers/spotify.d.ts +3 -0
- package/providers/spotify.d.ts.map +1 -0
- package/providers/spotify.js +2 -0
- package/providers/strava.d.ts +3 -0
- package/providers/strava.d.ts.map +1 -0
- package/providers/strava.js +2 -0
- package/providers/threads.d.ts +3 -0
- package/providers/threads.d.ts.map +1 -0
- package/providers/threads.js +2 -0
- package/providers/tiktok.d.ts +3 -0
- package/providers/tiktok.d.ts.map +1 -0
- package/providers/tiktok.js +2 -0
- package/providers/todoist.d.ts +3 -0
- package/providers/todoist.d.ts.map +1 -0
- package/providers/todoist.js +2 -0
- package/providers/trakt.d.ts +3 -0
- package/providers/trakt.d.ts.map +1 -0
- package/providers/trakt.js +2 -0
- package/providers/twitch.d.ts +3 -0
- package/providers/twitch.d.ts.map +1 -0
- package/providers/twitch.js +2 -0
- package/providers/twitter.d.ts +3 -0
- package/providers/twitter.d.ts.map +1 -0
- package/providers/twitter.js +2 -0
- package/providers/united-effects.d.ts +3 -0
- package/providers/united-effects.d.ts.map +1 -0
- package/providers/united-effects.js +2 -0
- package/providers/vipps.d.ts +3 -0
- package/providers/vipps.d.ts.map +1 -0
- package/providers/vipps.js +2 -0
- package/providers/vk.d.ts +3 -0
- package/providers/vk.d.ts.map +1 -0
- package/providers/vk.js +2 -0
- package/providers/webauthn.d.ts +3 -0
- package/providers/webauthn.d.ts.map +1 -0
- package/providers/webauthn.js +2 -0
- package/providers/webex.d.ts +3 -0
- package/providers/webex.d.ts.map +1 -0
- package/providers/webex.js +2 -0
- package/providers/wechat.d.ts +3 -0
- package/providers/wechat.d.ts.map +1 -0
- package/providers/wechat.js +2 -0
- package/providers/wikimedia.d.ts +3 -0
- package/providers/wikimedia.d.ts.map +1 -0
- package/providers/wikimedia.js +2 -0
- package/providers/wordpress.d.ts +3 -0
- package/providers/wordpress.d.ts.map +1 -0
- package/providers/wordpress.js +2 -0
- package/providers/workos.d.ts +3 -0
- package/providers/workos.d.ts.map +1 -0
- package/providers/workos.js +2 -0
- package/providers/yandex.d.ts +3 -0
- package/providers/yandex.d.ts.map +1 -0
- package/providers/yandex.js +2 -0
- package/providers/zitadel.d.ts +3 -0
- package/providers/zitadel.d.ts.map +1 -0
- package/providers/zitadel.js +2 -0
- package/providers/zoho.d.ts +3 -0
- package/providers/zoho.d.ts.map +1 -0
- package/providers/zoho.js +2 -0
- package/providers/zoom.d.ts +3 -0
- package/providers/zoom.d.ts.map +1 -0
- package/providers/zoom.js +2 -0
- package/react.d.ts +102 -0
- package/react.d.ts.map +1 -0
- package/react.js +361 -0
- package/src/adapters.ts +1 -0
- package/src/index.ts +430 -0
- package/src/jwt.ts +9 -0
- package/src/lib/actions.ts +144 -0
- package/src/lib/client.ts +245 -0
- package/src/lib/env.ts +36 -0
- package/src/lib/index.ts +313 -0
- package/src/lib/types.ts +30 -0
- package/src/middleware.ts +16 -0
- package/src/next.ts +16 -0
- package/src/providers/42-school.ts +2 -0
- package/src/providers/apple.ts +2 -0
- package/src/providers/asgardeo.ts +2 -0
- package/src/providers/atlassian.ts +2 -0
- package/src/providers/auth0.ts +2 -0
- package/src/providers/authentik.ts +2 -0
- package/src/providers/azure-ad-b2c.ts +2 -0
- package/src/providers/azure-ad.ts +2 -0
- package/src/providers/azure-devops.ts +2 -0
- package/src/providers/bankid-no.ts +2 -0
- package/src/providers/battlenet.ts +2 -0
- package/src/providers/beyondidentity.ts +2 -0
- package/src/providers/bitbucket.ts +2 -0
- package/src/providers/box.ts +2 -0
- package/src/providers/boxyhq-saml.ts +2 -0
- package/src/providers/bungie.ts +2 -0
- package/src/providers/click-up.ts +2 -0
- package/src/providers/cognito.ts +2 -0
- package/src/providers/coinbase.ts +2 -0
- package/src/providers/concept2.ts +2 -0
- package/src/providers/credentials.ts +2 -0
- package/src/providers/descope.ts +2 -0
- package/src/providers/discord.ts +2 -0
- package/src/providers/dribbble.ts +2 -0
- package/src/providers/dropbox.ts +2 -0
- package/src/providers/duende-identity-server6.ts +2 -0
- package/src/providers/email.ts +2 -0
- package/src/providers/eventbrite.ts +2 -0
- package/src/providers/eveonline.ts +2 -0
- package/src/providers/facebook.ts +2 -0
- package/src/providers/faceit.ts +2 -0
- package/src/providers/figma.ts +2 -0
- package/src/providers/forwardemail.ts +2 -0
- package/src/providers/foursquare.ts +2 -0
- package/src/providers/freshbooks.ts +2 -0
- package/src/providers/frontegg.ts +2 -0
- package/src/providers/fusionauth.ts +2 -0
- package/src/providers/github.ts +2 -0
- package/src/providers/gitlab.ts +2 -0
- package/src/providers/google.ts +2 -0
- package/src/providers/hubspot.ts +2 -0
- package/src/providers/huggingface.ts +2 -0
- package/src/providers/identity-server4.ts +2 -0
- package/src/providers/index.ts +1 -0
- package/src/providers/instagram.ts +2 -0
- package/src/providers/kakao.ts +2 -0
- package/src/providers/keycloak.ts +2 -0
- package/src/providers/kinde.ts +2 -0
- package/src/providers/line.ts +2 -0
- package/src/providers/linkedin.ts +2 -0
- package/src/providers/logto.ts +2 -0
- package/src/providers/loops.ts +2 -0
- package/src/providers/mailchimp.ts +2 -0
- package/src/providers/mailgun.ts +2 -0
- package/src/providers/mailru.ts +2 -0
- package/src/providers/mastodon.ts +2 -0
- package/src/providers/mattermost.ts +2 -0
- package/src/providers/medium.ts +2 -0
- package/src/providers/microsoft-entra-id.ts +2 -0
- package/src/providers/naver.ts +2 -0
- package/src/providers/netlify.ts +2 -0
- package/src/providers/netsuite.ts +2 -0
- package/src/providers/nextcloud.ts +2 -0
- package/src/providers/nodemailer.ts +2 -0
- package/src/providers/notion.ts +2 -0
- package/src/providers/okta.ts +2 -0
- package/src/providers/onelogin.ts +2 -0
- package/src/providers/ory-hydra.ts +2 -0
- package/src/providers/osso.ts +2 -0
- package/src/providers/osu.ts +2 -0
- package/src/providers/passage.ts +2 -0
- package/src/providers/passkey.ts +2 -0
- package/src/providers/patreon.ts +2 -0
- package/src/providers/ping-id.ts +2 -0
- package/src/providers/pinterest.ts +2 -0
- package/src/providers/pipedrive.ts +2 -0
- package/src/providers/postmark.ts +2 -0
- package/src/providers/reddit.ts +2 -0
- package/src/providers/resend.ts +2 -0
- package/src/providers/roblox.ts +2 -0
- package/src/providers/salesforce.ts +2 -0
- package/src/providers/sendgrid.ts +2 -0
- package/src/providers/simplelogin.ts +2 -0
- package/src/providers/slack.ts +2 -0
- package/src/providers/spotify.ts +2 -0
- package/src/providers/strava.ts +2 -0
- package/src/providers/threads.ts +2 -0
- package/src/providers/tiktok.ts +2 -0
- package/src/providers/todoist.ts +2 -0
- package/src/providers/trakt.ts +2 -0
- package/src/providers/twitch.ts +2 -0
- package/src/providers/twitter.ts +2 -0
- package/src/providers/united-effects.ts +2 -0
- package/src/providers/vipps.ts +2 -0
- package/src/providers/vk.ts +2 -0
- package/src/providers/webauthn.ts +2 -0
- package/src/providers/webex.ts +2 -0
- package/src/providers/wechat.ts +2 -0
- package/src/providers/wikimedia.ts +2 -0
- package/src/providers/wordpress.ts +2 -0
- package/src/providers/workos.ts +2 -0
- package/src/providers/yandex.ts +2 -0
- package/src/providers/zitadel.ts +2 -0
- package/src/providers/zoho.ts +2 -0
- package/src/providers/zoom.ts +2 -0
- package/src/react.tsx +546 -0
- package/src/webauthn.ts +152 -0
- package/webauthn.d.ts +9 -0
- package/webauthn.d.ts.map +1 -0
- package/webauthn.js +92 -0
- package/LICENSE +0 -70
- package/dist/actions-CMtg7FGv.js +0 -1
- package/dist/actions-CjQUKaXF.mjs +0 -200
- package/dist/client/index.js +0 -1
- package/dist/client/index.mjs +0 -484
- package/dist/components/AccountPicker.d.ts +0 -11
- package/dist/components/OAuthButton.d.ts +0 -11
- package/dist/components/PassKeyButton.d.ts +0 -11
- package/dist/components/PassKeyRegister.d.ts +0 -10
- package/dist/components/TwoFactorSetup.d.ts +0 -8
- package/dist/components/TwoFactorVerify.d.ts +0 -9
- package/dist/core/account-picker/encryption.d.ts +0 -22
- package/dist/core/account-picker/index.d.ts +0 -22
- package/dist/core/auth/email-password.d.ts +0 -145
- package/dist/core/auth/oauth/index.d.ts +0 -14
- package/dist/core/auth/oauth/oauth-handler.d.ts +0 -172
- package/dist/core/auth/oauth/pkce.d.ts +0 -168
- package/dist/core/auth/oauth/providers.d.ts +0 -198
- package/dist/core/auth/oauth/state-store-cookie.d.ts +0 -83
- package/dist/core/auth/oauth/state-store-redis.d.ts +0 -25
- package/dist/core/auth/oauth/state-store.d.ts +0 -48
- package/dist/core/auth/otp.d.ts +0 -184
- package/dist/core/auth/passkey.d.ts +0 -35
- package/dist/core/auth/password.d.ts +0 -22
- package/dist/core/auth/signin-unified.d.ts +0 -33
- package/dist/core/auth/two-factor.d.ts +0 -28
- package/dist/core/client/index.d.ts +0 -132
- package/dist/core/client/token-refresh-manager.d.ts +0 -48
- package/dist/core/errors/index.d.ts +0 -269
- package/dist/core/index.d.ts +0 -9
- package/dist/core/logger/index.d.ts +0 -147
- package/dist/core/mulguard/auth-handlers.d.ts +0 -100
- package/dist/core/mulguard/defaults.d.ts +0 -58
- package/dist/core/mulguard/index.d.ts +0 -9
- package/dist/core/mulguard/integration.d.ts +0 -104
- package/dist/core/mulguard/oauth-handler.d.ts +0 -93
- package/dist/core/mulguard/session-manager.d.ts +0 -94
- package/dist/core/security/csrf.d.ts +0 -46
- package/dist/core/security/headers.d.ts +0 -24
- package/dist/core/security/index.d.ts +0 -132
- package/dist/core/security/rate-limit.d.ts +0 -39
- package/dist/core/security/security-manager.d.ts +0 -236
- package/dist/core/security/validation.d.ts +0 -251
- package/dist/core/security/xss.d.ts +0 -20
- package/dist/core/session/index.d.ts +0 -35
- package/dist/core/session/session-manager.d.ts +0 -235
- package/dist/core/types/auth.d.ts +0 -290
- package/dist/core/types/errors.d.ts +0 -200
- package/dist/core/types/index.d.ts +0 -484
- package/dist/core/utils/auth-helpers.d.ts +0 -136
- package/dist/core/utils/logger.d.ts +0 -121
- package/dist/index/index.js +0 -1
- package/dist/index/index.mjs +0 -2736
- package/dist/index.d.ts +0 -18
- package/dist/mulguard.d.ts +0 -373
- package/dist/nextjs/client/hooks.d.ts +0 -122
- package/dist/nextjs/client/index.d.ts +0 -13
- package/dist/nextjs/client/provider.d.ts +0 -69
- package/dist/nextjs/client/server-actions-helper.d.ts +0 -22
- package/dist/nextjs/handlers/api.d.ts +0 -10
- package/dist/nextjs/handlers/index.d.ts +0 -9
- package/dist/nextjs/handlers/route.d.ts +0 -76
- package/dist/nextjs/index.d.ts +0 -15
- package/dist/nextjs/proxy/index.d.ts +0 -149
- package/dist/nextjs/proxy/security.d.ts +0 -9
- package/dist/nextjs/server/actions.d.ts +0 -30
- package/dist/nextjs/server/auth.d.ts +0 -65
- package/dist/nextjs/server/cookies.d.ts +0 -41
- package/dist/nextjs/server/index.d.ts +0 -18
- package/dist/nextjs/server/oauth-state.d.ts +0 -32
- package/dist/nextjs/server/session-helpers.d.ts +0 -24
- package/dist/nextjs/server/session.d.ts +0 -144
- package/dist/oauth-state-Drwz6fES.js +0 -1
- package/dist/oauth-state-pdypStuS.mjs +0 -210
- package/dist/server/index.js +0 -1
- package/dist/server/index.mjs +0 -29
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import type { ProviderId, ProviderType } from "@mulverse/mulguard-core/providers"
|
|
5
|
+
import type { LoggerInstance, Session } from "@mulverse/mulguard-core/types"
|
|
6
|
+
import { AuthError } from "@mulverse/mulguard-core/errors"
|
|
7
|
+
|
|
8
|
+
/** @todo */
|
|
9
|
+
class ClientFetchError extends AuthError {}
|
|
10
|
+
|
|
11
|
+
/** @todo */
|
|
12
|
+
export class ClientSessionError extends AuthError {}
|
|
13
|
+
|
|
14
|
+
export interface AuthClientConfig {
|
|
15
|
+
baseUrl: string
|
|
16
|
+
basePath: string
|
|
17
|
+
baseUrlServer: string
|
|
18
|
+
basePathServer: string
|
|
19
|
+
/** Stores last session response */
|
|
20
|
+
_session?: Session | null | undefined
|
|
21
|
+
/** Used for timestamp since last sycned (in seconds) */
|
|
22
|
+
_lastSync: number
|
|
23
|
+
/**
|
|
24
|
+
* Stores the `SessionProvider`'s session update method to be able to
|
|
25
|
+
* trigger session updates from places like `signIn` or `signOut`
|
|
26
|
+
*/
|
|
27
|
+
_getSession: (...args: any[]) => any
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface UseSessionOptions<R extends boolean> {
|
|
31
|
+
required: R
|
|
32
|
+
/** Defaults to `signIn` */
|
|
33
|
+
onUnauthenticated?: () => void
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ClientSafeProvider {
|
|
37
|
+
id: ProviderId
|
|
38
|
+
name: string
|
|
39
|
+
type: ProviderType
|
|
40
|
+
signinUrl: string
|
|
41
|
+
callbackUrl: string
|
|
42
|
+
redirectTo: string
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface SignInOptions<Redirect extends boolean = true>
|
|
46
|
+
extends Record<string, unknown> {
|
|
47
|
+
/** @deprecated Use `redirectTo` instead. */
|
|
48
|
+
callbackUrl?: string
|
|
49
|
+
/**
|
|
50
|
+
* Specify where the user should be redirected to after a successful signin.
|
|
51
|
+
*
|
|
52
|
+
* By default, it is the page the sign-in was initiated from.
|
|
53
|
+
*/
|
|
54
|
+
redirectTo?: string
|
|
55
|
+
/**
|
|
56
|
+
* You might want to deal with the signin response on the same page, instead of redirecting to another page.
|
|
57
|
+
* For example, if an error occurs (like wrong credentials given by the user), you might want to show an inline error message on the input field.
|
|
58
|
+
*
|
|
59
|
+
* For this purpose, you can set this to option `redirect: false`.
|
|
60
|
+
*/
|
|
61
|
+
redirect?: Redirect
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface SignInResponse {
|
|
65
|
+
error: string | undefined
|
|
66
|
+
code: string | undefined
|
|
67
|
+
status: number
|
|
68
|
+
ok: boolean
|
|
69
|
+
url: string | null
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Match `inputType` of `new URLSearchParams(inputType)`
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
export type SignInAuthorizationParams =
|
|
77
|
+
| string
|
|
78
|
+
| string[][]
|
|
79
|
+
| Record<string, string>
|
|
80
|
+
| URLSearchParams
|
|
81
|
+
|
|
82
|
+
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1) */
|
|
83
|
+
export interface SignOutResponse {
|
|
84
|
+
url: string
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface SignOutParams<Redirect extends boolean = true> {
|
|
88
|
+
/** @deprecated Use `redirectTo` instead. */
|
|
89
|
+
callbackUrl?: string
|
|
90
|
+
/**
|
|
91
|
+
* If you pass `redirect: false`, the page will not reload.
|
|
92
|
+
* The session will be deleted, and `useSession` is notified, so any indication about the user will be shown as logged out automatically.
|
|
93
|
+
* It can give a very nice experience for the user.
|
|
94
|
+
*/
|
|
95
|
+
redirectTo?: string
|
|
96
|
+
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */
|
|
97
|
+
redirect?: Redirect
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
|
|
102
|
+
* If you have session expiry times of 30 days (the default) or more, then you probably don't need to change any of the default options.
|
|
103
|
+
*
|
|
104
|
+
* However, if you need to customize the session behavior and/or are using short session expiry times, you can pass options to the provider to customize the behavior of the {@link useSession} hook.
|
|
105
|
+
*/
|
|
106
|
+
export interface SessionProviderProps {
|
|
107
|
+
children: React.ReactNode
|
|
108
|
+
session?: Session | null
|
|
109
|
+
baseUrl?: string
|
|
110
|
+
basePath?: string
|
|
111
|
+
/**
|
|
112
|
+
* A time interval (in seconds) after which the session will be re-fetched.
|
|
113
|
+
* If set to `0` (default), the session is not polled.
|
|
114
|
+
*/
|
|
115
|
+
refetchInterval?: number
|
|
116
|
+
/**
|
|
117
|
+
* `SessionProvider` automatically refetches the session when the user switches between windows.
|
|
118
|
+
* This option activates this behaviour if set to `true` (default).
|
|
119
|
+
*/
|
|
120
|
+
refetchOnWindowFocus?: boolean
|
|
121
|
+
/**
|
|
122
|
+
* Set to `false` to stop polling when the device has no internet access offline (determined by `navigator.onLine`)
|
|
123
|
+
*
|
|
124
|
+
* [`navigator.onLine` documentation](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine)
|
|
125
|
+
*/
|
|
126
|
+
refetchWhenOffline?: false
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ------------------------ Internal ------------------------
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* If passed 'appContext' via getInitialProps() in _app.js
|
|
133
|
+
* then get the req object from ctx and use that for the
|
|
134
|
+
* req value to allow `fetchData` to
|
|
135
|
+
* work seemlessly in getInitialProps() on server side
|
|
136
|
+
* pages *and* in _app.js.
|
|
137
|
+
* @internal
|
|
138
|
+
*/
|
|
139
|
+
export async function fetchData<T = any>(
|
|
140
|
+
path: string,
|
|
141
|
+
__NEXTAUTH: AuthClientConfig,
|
|
142
|
+
logger: LoggerInstance,
|
|
143
|
+
req: any = {}
|
|
144
|
+
): Promise<T | null> {
|
|
145
|
+
const url = `${apiBaseUrl(__NEXTAUTH)}/${path}`
|
|
146
|
+
try {
|
|
147
|
+
const options: RequestInit = {
|
|
148
|
+
headers: {
|
|
149
|
+
"Content-Type": "application/json",
|
|
150
|
+
...(req?.headers?.cookie ? { cookie: req.headers.cookie } : {}),
|
|
151
|
+
},
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (req?.body) {
|
|
155
|
+
options.body = JSON.stringify(req.body)
|
|
156
|
+
options.method = "POST"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const res = await fetch(url, options)
|
|
160
|
+
const data = await res.json()
|
|
161
|
+
if (!res.ok) throw data
|
|
162
|
+
return data
|
|
163
|
+
} catch (error) {
|
|
164
|
+
logger.error(new ClientFetchError((error as Error).message, error as any))
|
|
165
|
+
return null
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** @internal */
|
|
170
|
+
export function apiBaseUrl(__NEXTAUTH: AuthClientConfig) {
|
|
171
|
+
if (typeof window === "undefined") {
|
|
172
|
+
// Return absolute path when called server side
|
|
173
|
+
return `${__NEXTAUTH.baseUrlServer}${__NEXTAUTH.basePathServer}`
|
|
174
|
+
}
|
|
175
|
+
// Return relative path when called client side
|
|
176
|
+
return __NEXTAUTH.basePath
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** @internal */
|
|
180
|
+
export function useOnline() {
|
|
181
|
+
const [isOnline, setIsOnline] = React.useState(
|
|
182
|
+
typeof navigator !== "undefined" ? navigator.onLine : false
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
const setOnline = () => setIsOnline(true)
|
|
186
|
+
const setOffline = () => setIsOnline(false)
|
|
187
|
+
|
|
188
|
+
React.useEffect(() => {
|
|
189
|
+
window.addEventListener("online", setOnline)
|
|
190
|
+
window.addEventListener("offline", setOffline)
|
|
191
|
+
|
|
192
|
+
return () => {
|
|
193
|
+
window.removeEventListener("online", setOnline)
|
|
194
|
+
window.removeEventListener("offline", setOffline)
|
|
195
|
+
}
|
|
196
|
+
}, [])
|
|
197
|
+
|
|
198
|
+
return isOnline
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC.
|
|
203
|
+
* @internal
|
|
204
|
+
*/
|
|
205
|
+
export function now() {
|
|
206
|
+
return Math.floor(Date.now() / 1000)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Returns an `URL` like object to make requests/redirects from server-side
|
|
211
|
+
* @internal
|
|
212
|
+
*/
|
|
213
|
+
export function parseUrl(url?: string): {
|
|
214
|
+
/** @default "http://localhost:3000" */
|
|
215
|
+
origin: string
|
|
216
|
+
/** @default "localhost:3000" */
|
|
217
|
+
host: string
|
|
218
|
+
/** @default "/api/auth" */
|
|
219
|
+
path: string
|
|
220
|
+
/** @default "http://localhost:3000/api/auth" */
|
|
221
|
+
base: string
|
|
222
|
+
/** @default "http://localhost:3000/api/auth" */
|
|
223
|
+
toString: () => string
|
|
224
|
+
} {
|
|
225
|
+
const defaultUrl = new URL("http://localhost:3000/api/auth")
|
|
226
|
+
|
|
227
|
+
if (url && !url.startsWith("http")) {
|
|
228
|
+
url = `https://${url}`
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const _url = new URL(url || defaultUrl)
|
|
232
|
+
const path = (_url.pathname === "/" ? defaultUrl.pathname : _url.pathname)
|
|
233
|
+
// Remove trailing slash
|
|
234
|
+
.replace(/\/$/, "")
|
|
235
|
+
|
|
236
|
+
const base = `${_url.origin}${path}`
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
origin: _url.origin,
|
|
240
|
+
host: _url.host,
|
|
241
|
+
path,
|
|
242
|
+
base,
|
|
243
|
+
toString: () => base,
|
|
244
|
+
}
|
|
245
|
+
}
|
package/src/lib/env.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
|
|
2
|
+
import { NextRequest } from "next/server"
|
|
3
|
+
import type { MulGuardConfig } from "./index.js"
|
|
4
|
+
import { setEnvDefaults as coreSetEnvDefaults } from "@mulverse/mulguard-core"
|
|
5
|
+
|
|
6
|
+
/** If `MULGUARD_URL`, `AUTH_URL`, or `NEXTAUTH_URL` is defined, override the request's URL. */
|
|
7
|
+
export function reqWithEnvURL(req: NextRequest): NextRequest {
|
|
8
|
+
const url = process.env.MULGUARD_URL ?? process.env.AUTH_URL ?? process.env.NEXTAUTH_URL
|
|
9
|
+
if (!url) return req
|
|
10
|
+
const { origin: envOrigin } = new URL(url)
|
|
11
|
+
const { href, origin } = req.nextUrl
|
|
12
|
+
return new NextRequest(href.replace(origin, envOrigin), req)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* MulGuard checks for `MULGUARD_URL` and `MULGUARD_SECRET` first.
|
|
17
|
+
* For backwards compatibility, it also checks for `AUTH_URL`/`AUTH_SECRET` and `NEXTAUTH_URL`/`NEXTAUTH_SECRET`.
|
|
18
|
+
* The `basePath` by default is `/api/auth` instead of `/auth`
|
|
19
|
+
* (which is the default for all other Auth.js integrations).
|
|
20
|
+
*/
|
|
21
|
+
export function setEnvDefaults(config: MulGuardConfig) {
|
|
22
|
+
try {
|
|
23
|
+
config.secret ??= process.env.MULGUARD_SECRET ?? process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
|
|
24
|
+
const url = process.env.MULGUARD_URL ?? process.env.AUTH_URL ?? process.env.NEXTAUTH_URL
|
|
25
|
+
if (!url) return
|
|
26
|
+
const { pathname } = new URL(url)
|
|
27
|
+
if (pathname === "/") return
|
|
28
|
+
config.basePath ||= pathname
|
|
29
|
+
} catch {
|
|
30
|
+
// Catching and swallowing potential URL parsing errors, we'll fall
|
|
31
|
+
// back to `/api/auth` below.
|
|
32
|
+
} finally {
|
|
33
|
+
config.basePath ||= "/api/auth"
|
|
34
|
+
coreSetEnvDefaults(process.env, config, true)
|
|
35
|
+
}
|
|
36
|
+
}
|
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { Auth, createActionURL, type AuthConfig } from "@mulverse/mulguard-core"
|
|
2
|
+
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
|
|
3
|
+
import { headers } from "next/headers"
|
|
4
|
+
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
|
|
5
|
+
import { NextResponse } from "next/server"
|
|
6
|
+
import { reqWithEnvURL } from "./env.js"
|
|
7
|
+
|
|
8
|
+
import type { AuthAction, Awaitable, Session } from "@mulverse/mulguard-core/types"
|
|
9
|
+
import type {
|
|
10
|
+
GetServerSidePropsContext,
|
|
11
|
+
NextApiRequest,
|
|
12
|
+
NextApiResponse,
|
|
13
|
+
} from "next"
|
|
14
|
+
import type { AppRouteHandlerFn } from "./types.js"
|
|
15
|
+
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
|
|
16
|
+
import type { NextFetchEvent, NextMiddleware, NextRequest } from "next/server"
|
|
17
|
+
|
|
18
|
+
/** Configure MulGuard. */
|
|
19
|
+
export interface MulGuardConfig extends Omit<AuthConfig, "raw"> {
|
|
20
|
+
/**
|
|
21
|
+
* Callbacks are asynchronous functions you can use to control what happens when an auth-related action is performed.
|
|
22
|
+
* Callbacks **allow you to implement access controls without a database** or to **integrate with external databases or APIs**.
|
|
23
|
+
*/
|
|
24
|
+
callbacks?: AuthConfig["callbacks"] & {
|
|
25
|
+
/**
|
|
26
|
+
* Invoked when a user needs authorization, using [Middleware](https://nextjs.org/docs/advanced-features/middleware).
|
|
27
|
+
*
|
|
28
|
+
* You can override this behavior by returning a {@link NextResponse}.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts title="app/auth.ts"
|
|
32
|
+
* async authorized({ request, auth }) {
|
|
33
|
+
* const url = request.nextUrl
|
|
34
|
+
*
|
|
35
|
+
* if(request.method === "POST") {
|
|
36
|
+
* const { authToken } = (await request.json()) ?? {}
|
|
37
|
+
* // If the request has a valid auth token, it is authorized
|
|
38
|
+
* const valid = await validateAuthToken(authToken)
|
|
39
|
+
* if(valid) return true
|
|
40
|
+
* return NextResponse.json("Invalid auth token", { status: 401 })
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* // Logged in users are authenticated, otherwise redirect to login page
|
|
44
|
+
* return !!auth.user
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* :::warning
|
|
49
|
+
* If you are returning a redirect response, make sure that the page you are redirecting to is not protected by this callback,
|
|
50
|
+
* otherwise you could end up in an infinite redirect loop.
|
|
51
|
+
* :::
|
|
52
|
+
*/
|
|
53
|
+
authorized?: (params: {
|
|
54
|
+
/** The request to be authorized. */
|
|
55
|
+
request: NextRequest
|
|
56
|
+
/** The authenticated user or token, if any. */
|
|
57
|
+
auth: Session | null
|
|
58
|
+
}) => Awaitable<boolean | NextResponse | Response | undefined>
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function getSession(headers: Headers, config: MulGuardConfig) {
|
|
63
|
+
const url = createActionURL(
|
|
64
|
+
"session",
|
|
65
|
+
// @ts-expect-error `x-forwarded-proto` is not nullable, next.js sets it by default
|
|
66
|
+
headers.get("x-forwarded-proto"),
|
|
67
|
+
headers,
|
|
68
|
+
process.env,
|
|
69
|
+
config
|
|
70
|
+
)
|
|
71
|
+
const request = new Request(url, {
|
|
72
|
+
headers: { cookie: headers.get("cookie") ?? "" },
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return Auth(request, {
|
|
76
|
+
...config,
|
|
77
|
+
callbacks: {
|
|
78
|
+
...config.callbacks,
|
|
79
|
+
// Since we are server-side, we don't need to filter out the session data
|
|
80
|
+
// See https://authjs.dev/getting-started/migrating-to-v5#authenticating-server-side
|
|
81
|
+
// TODO: Taint the session data to prevent accidental leakage to the client
|
|
82
|
+
// https://react.dev/reference/react/experimental_taintObjectReference
|
|
83
|
+
async session(...args) {
|
|
84
|
+
const session =
|
|
85
|
+
// If the user defined a custom session callback, use that instead
|
|
86
|
+
(await config.callbacks?.session?.(...args)) ?? {
|
|
87
|
+
...args[0].session,
|
|
88
|
+
expires:
|
|
89
|
+
args[0].session.expires?.toISOString?.() ??
|
|
90
|
+
args[0].session.expires,
|
|
91
|
+
}
|
|
92
|
+
const user = args[0].user ?? args[0].token
|
|
93
|
+
return { user, ...session } satisfies Session
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
}) as Promise<Response>
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MulGuardRequest extends NextRequest {
|
|
100
|
+
auth: Session | null
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type MulGuardMiddleware = (
|
|
104
|
+
request: MulGuardRequest,
|
|
105
|
+
event: NextFetchEvent
|
|
106
|
+
) => ReturnType<NextMiddleware>
|
|
107
|
+
|
|
108
|
+
export type WithAuthArgs =
|
|
109
|
+
| [MulGuardRequest, any]
|
|
110
|
+
| [MulGuardMiddleware]
|
|
111
|
+
| [AppRouteHandlerFn]
|
|
112
|
+
| [NextApiRequest, NextApiResponse]
|
|
113
|
+
| [GetServerSidePropsContext]
|
|
114
|
+
| []
|
|
115
|
+
|
|
116
|
+
function isReqWrapper(arg: any): arg is MulGuardMiddleware | AppRouteHandlerFn {
|
|
117
|
+
return typeof arg === "function"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function initAuth(
|
|
121
|
+
config:
|
|
122
|
+
| MulGuardConfig
|
|
123
|
+
| ((request: NextRequest | undefined) => Awaitable<MulGuardConfig>),
|
|
124
|
+
onLazyLoad?: (config: MulGuardConfig) => void // To set the default env vars
|
|
125
|
+
) {
|
|
126
|
+
if (typeof config === "function") {
|
|
127
|
+
return async (...args: WithAuthArgs) => {
|
|
128
|
+
if (!args.length) {
|
|
129
|
+
// React Server Components
|
|
130
|
+
const _headers = await headers()
|
|
131
|
+
const _config = await config(undefined) // Review: Should we pass headers() here instead?
|
|
132
|
+
onLazyLoad?.(_config)
|
|
133
|
+
|
|
134
|
+
return getSession(_headers, _config).then((r) => r.json())
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (args[0] instanceof Request) {
|
|
138
|
+
// middleware.ts inline
|
|
139
|
+
// export { auth as default } from "auth"
|
|
140
|
+
const req = args[0]
|
|
141
|
+
const ev = args[1]
|
|
142
|
+
const _config = await config(req)
|
|
143
|
+
onLazyLoad?.(_config)
|
|
144
|
+
|
|
145
|
+
// args[0] is supposed to be NextRequest but the instanceof check is failing.
|
|
146
|
+
return handleAuth([req, ev], _config)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (isReqWrapper(args[0])) {
|
|
150
|
+
// middleware.ts wrapper/route.ts
|
|
151
|
+
// import { auth } from "auth"
|
|
152
|
+
// export default auth((req) => { console.log(req.auth) }})
|
|
153
|
+
const userMiddlewareOrRoute = args[0]
|
|
154
|
+
return async (
|
|
155
|
+
...args: Parameters<MulGuardMiddleware | AppRouteHandlerFn>
|
|
156
|
+
) => {
|
|
157
|
+
const _config = await config(args[0])
|
|
158
|
+
onLazyLoad?.(_config)
|
|
159
|
+
return handleAuth(args, _config, userMiddlewareOrRoute)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// API Routes, getServerSideProps
|
|
163
|
+
const request = "req" in args[0] ? args[0].req : args[0]
|
|
164
|
+
const response: any = "res" in args[0] ? args[0].res : args[1]
|
|
165
|
+
const _config = await config(request)
|
|
166
|
+
onLazyLoad?.(_config)
|
|
167
|
+
|
|
168
|
+
// @ts-expect-error -- request is NextRequest
|
|
169
|
+
return getSession(new Headers(request.headers), _config).then(
|
|
170
|
+
async (authResponse) => {
|
|
171
|
+
const auth = await authResponse.json()
|
|
172
|
+
|
|
173
|
+
for (const cookie of authResponse.headers.getSetCookie())
|
|
174
|
+
if ("headers" in response)
|
|
175
|
+
response.headers.append("set-cookie", cookie)
|
|
176
|
+
else response.appendHeader("set-cookie", cookie)
|
|
177
|
+
|
|
178
|
+
return auth satisfies Session | null
|
|
179
|
+
}
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return (...args: WithAuthArgs) => {
|
|
184
|
+
if (!args.length) {
|
|
185
|
+
// React Server Components
|
|
186
|
+
return Promise.resolve(headers()).then((h: Headers) =>
|
|
187
|
+
getSession(h, config).then((r) => r.json())
|
|
188
|
+
)
|
|
189
|
+
}
|
|
190
|
+
if (args[0] instanceof Request) {
|
|
191
|
+
// middleware.ts inline
|
|
192
|
+
// export { auth as default } from "auth"
|
|
193
|
+
const req = args[0]
|
|
194
|
+
const ev = args[1]
|
|
195
|
+
return handleAuth([req, ev], config)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (isReqWrapper(args[0])) {
|
|
199
|
+
// middleware.ts wrapper/route.ts
|
|
200
|
+
// import { auth } from "auth"
|
|
201
|
+
// export default auth((req) => { console.log(req.auth) }})
|
|
202
|
+
const userMiddlewareOrRoute = args[0]
|
|
203
|
+
return async (
|
|
204
|
+
...args: Parameters<MulGuardMiddleware | AppRouteHandlerFn>
|
|
205
|
+
) => {
|
|
206
|
+
return handleAuth(args, config, userMiddlewareOrRoute).then((res) => {
|
|
207
|
+
return res
|
|
208
|
+
})
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// API Routes, getServerSideProps
|
|
213
|
+
const request = "req" in args[0] ? args[0].req : args[0]
|
|
214
|
+
const response: any = "res" in args[0] ? args[0].res : args[1]
|
|
215
|
+
|
|
216
|
+
return getSession(
|
|
217
|
+
// @ts-expect-error
|
|
218
|
+
new Headers(request.headers),
|
|
219
|
+
config
|
|
220
|
+
).then(async (authResponse) => {
|
|
221
|
+
const auth = await authResponse.json()
|
|
222
|
+
|
|
223
|
+
for (const cookie of authResponse.headers.getSetCookie())
|
|
224
|
+
if ("headers" in response) response.headers.append("set-cookie", cookie)
|
|
225
|
+
else response.appendHeader("set-cookie", cookie)
|
|
226
|
+
|
|
227
|
+
return auth satisfies Session | null
|
|
228
|
+
})
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function handleAuth(
|
|
233
|
+
args: Parameters<NextMiddleware | AppRouteHandlerFn>,
|
|
234
|
+
config: MulGuardConfig,
|
|
235
|
+
userMiddlewareOrRoute?: MulGuardMiddleware | AppRouteHandlerFn
|
|
236
|
+
) {
|
|
237
|
+
const request = reqWithEnvURL(args[0])
|
|
238
|
+
const sessionResponse = await getSession(request.headers, config)
|
|
239
|
+
const auth = await sessionResponse.json()
|
|
240
|
+
|
|
241
|
+
let authorized: boolean | NextResponse | Response | undefined = true
|
|
242
|
+
|
|
243
|
+
if (config.callbacks?.authorized) {
|
|
244
|
+
authorized = await config.callbacks.authorized({ request, auth })
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
let response: any = NextResponse.next?.()
|
|
248
|
+
|
|
249
|
+
if (authorized instanceof Response) {
|
|
250
|
+
// User returned a custom response, like redirecting to a page or 401, respect it
|
|
251
|
+
response = authorized
|
|
252
|
+
|
|
253
|
+
const redirect = authorized.headers.get("Location")
|
|
254
|
+
const { pathname } = request.nextUrl
|
|
255
|
+
// If the user is redirecting to the same MulGuard action path as the current request,
|
|
256
|
+
// don't allow the redirect to prevent an infinite loop
|
|
257
|
+
if (
|
|
258
|
+
redirect &&
|
|
259
|
+
isSameAuthAction(pathname, new URL(redirect).pathname, config)
|
|
260
|
+
) {
|
|
261
|
+
authorized = true
|
|
262
|
+
}
|
|
263
|
+
} else if (userMiddlewareOrRoute) {
|
|
264
|
+
// Execute user's middleware/handler with the augmented request
|
|
265
|
+
const augmentedReq = request as MulGuardRequest
|
|
266
|
+
augmentedReq.auth = auth
|
|
267
|
+
response =
|
|
268
|
+
(await userMiddlewareOrRoute(augmentedReq, args[1])) ??
|
|
269
|
+
NextResponse.next()
|
|
270
|
+
} else if (!authorized) {
|
|
271
|
+
const signInPage = config.pages?.signIn ?? `${config.basePath}/signin`
|
|
272
|
+
if (request.nextUrl.pathname !== signInPage) {
|
|
273
|
+
// Redirect to signin page by default if not authorized
|
|
274
|
+
const signInUrl = request.nextUrl.clone()
|
|
275
|
+
signInUrl.pathname = signInPage
|
|
276
|
+
signInUrl.searchParams.set("callbackUrl", request.nextUrl.href)
|
|
277
|
+
response = NextResponse.redirect(signInUrl)
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const finalResponse = new Response(response?.body, response)
|
|
282
|
+
|
|
283
|
+
// Preserve cookies from the session response
|
|
284
|
+
for (const cookie of sessionResponse.headers.getSetCookie())
|
|
285
|
+
finalResponse.headers.append("set-cookie", cookie)
|
|
286
|
+
|
|
287
|
+
return finalResponse
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function isSameAuthAction(
|
|
291
|
+
requestPath: string,
|
|
292
|
+
redirectPath: string,
|
|
293
|
+
config: MulGuardConfig
|
|
294
|
+
) {
|
|
295
|
+
const action = redirectPath.replace(`${requestPath}/`, "") as AuthAction
|
|
296
|
+
const pages = Object.values(config.pages ?? {})
|
|
297
|
+
|
|
298
|
+
return (
|
|
299
|
+
(actions.has(action) || pages.includes(redirectPath)) &&
|
|
300
|
+
redirectPath === requestPath
|
|
301
|
+
)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const actions = new Set<AuthAction>([
|
|
305
|
+
"providers",
|
|
306
|
+
"session",
|
|
307
|
+
"csrf",
|
|
308
|
+
"signin",
|
|
309
|
+
"signout",
|
|
310
|
+
"callback",
|
|
311
|
+
"verify-request",
|
|
312
|
+
"error",
|
|
313
|
+
])
|
package/src/lib/types.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// @ts-expect-error Next.js does not yet correctly use the `package.json#exports` field
|
|
2
|
+
import type { NextRequest } from "next/server"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* AppRouteHandlerFnContext is the context that is passed to the handler as the
|
|
6
|
+
* second argument.
|
|
7
|
+
*/
|
|
8
|
+
export type AppRouteHandlerFnContext = {
|
|
9
|
+
params: Promise<any>
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Handler function for app routes. If a non-Response value is returned, an error
|
|
13
|
+
* will be thrown.
|
|
14
|
+
*/
|
|
15
|
+
export type AppRouteHandlerFn = (
|
|
16
|
+
/**
|
|
17
|
+
* Incoming request object.
|
|
18
|
+
*/
|
|
19
|
+
req: NextRequest,
|
|
20
|
+
/**
|
|
21
|
+
* Context properties on the request (including the parameters if this was a
|
|
22
|
+
* dynamic route).
|
|
23
|
+
*/
|
|
24
|
+
ctx: AppRouteHandlerFnContext
|
|
25
|
+
) => void | Response | Promise<void | Response>
|
|
26
|
+
|
|
27
|
+
export type AppRouteHandlers = Record<
|
|
28
|
+
"GET" | "POST",
|
|
29
|
+
(req: NextRequest) => Promise<Response>
|
|
30
|
+
>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* :::warning Deprecated
|
|
3
|
+
* This module is replaced in v5. Read more at: https://authjs.dev/getting-started/migrating-to-v5#authenticating-server-side
|
|
4
|
+
* :::
|
|
5
|
+
*
|
|
6
|
+
* @module middleware
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
throw new ReferenceError(
|
|
10
|
+
[
|
|
11
|
+
'"mulguard/middleware" is deprecated. If you are not ready to migrate, keep using "next-auth@4".',
|
|
12
|
+
"Read more on https://mulverse.com",
|
|
13
|
+
].join("\n")
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
export {}
|
package/src/next.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* :::warning Deprecated
|
|
3
|
+
* This module is replaced in v5. Read more at: https://authjs.dev/getting-started/migrating-to-v5#authenticating-server-side
|
|
4
|
+
* :::
|
|
5
|
+
*
|
|
6
|
+
* @module next
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
throw new ReferenceError(
|
|
10
|
+
[
|
|
11
|
+
'"mulguard/next" is deprecated. If you are not ready to migrate, keep using "next-auth@4".',
|
|
12
|
+
"Read more on https://mulverse.com",
|
|
13
|
+
].join("\n")
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
export {}
|