@masheev/better-auth 0.0.0-stage → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +20 -0
- package/README.md +31 -2
- package/TYPE-PATCH-NOTICE.md +9 -0
- package/TYPE-PATCH-PROVENANCE.json +267 -0
- package/dist/_virtual/_rolldown/runtime.mjs +27 -0
- package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
- package/dist/adapters/drizzle-adapter/index.mjs +2 -0
- package/dist/adapters/index.d.mts +26 -0
- package/dist/adapters/index.mjs +9 -0
- package/dist/adapters/kysely-adapter/index.d.mts +1 -0
- package/dist/adapters/kysely-adapter/index.mjs +2 -0
- package/dist/adapters/memory-adapter/index.d.mts +1 -0
- package/dist/adapters/memory-adapter/index.mjs +2 -0
- package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
- package/dist/adapters/mongodb-adapter/index.mjs +2 -0
- package/dist/adapters/prisma-adapter/index.d.mts +1 -0
- package/dist/adapters/prisma-adapter/index.mjs +2 -0
- package/dist/api/dispatch.d.mts +34 -0
- package/dist/api/dispatch.mjs +275 -0
- package/dist/api/index.d.mts +4053 -0
- package/dist/api/index.mjs +220 -0
- package/dist/api/middlewares/authorization.d.mts +69 -0
- package/dist/api/middlewares/authorization.mjs +78 -0
- package/dist/api/middlewares/index.d.mts +2 -0
- package/dist/api/middlewares/origin-check.d.mts +17 -0
- package/dist/api/middlewares/origin-check.mjs +155 -0
- package/dist/api/rate-limiter/index.mjs +318 -0
- package/dist/api/routes/account.d.mts +413 -0
- package/dist/api/routes/account.mjs +619 -0
- package/dist/api/routes/callback.d.mts +32 -0
- package/dist/api/routes/callback.mjs +261 -0
- package/dist/api/routes/email-verification.d.mts +160 -0
- package/dist/api/routes/email-verification.mjs +324 -0
- package/dist/api/routes/error.d.mts +27 -0
- package/dist/api/routes/error.mjs +387 -0
- package/dist/api/routes/index.d.mts +12 -0
- package/dist/api/routes/ok.d.mts +35 -0
- package/dist/api/routes/ok.mjs +27 -0
- package/dist/api/routes/password.d.mts +182 -0
- package/dist/api/routes/password.mjs +206 -0
- package/dist/api/routes/session.d.mts +450 -0
- package/dist/api/routes/session.mjs +481 -0
- package/dist/api/routes/sign-in.d.mts +186 -0
- package/dist/api/routes/sign-in.mjs +368 -0
- package/dist/api/routes/sign-out.d.mts +51 -0
- package/dist/api/routes/sign-out.mjs +96 -0
- package/dist/api/routes/sign-up.d.mts +159 -0
- package/dist/api/routes/sign-up.mjs +275 -0
- package/dist/api/routes/update-session.d.mts +74 -0
- package/dist/api/routes/update-session.mjs +57 -0
- package/dist/api/routes/update-user.d.mts +428 -0
- package/dist/api/routes/update-user.mjs +522 -0
- package/dist/api/state/oauth.d.mts +53 -0
- package/dist/api/state/oauth.mjs +38 -0
- package/dist/api/state/should-session-refresh.d.mts +12 -0
- package/dist/api/state/should-session-refresh.mjs +13 -0
- package/dist/api/to-auth-endpoints.mjs +60 -0
- package/dist/auth/base.mjs +66 -0
- package/dist/auth/full.d.mts +28 -0
- package/dist/auth/full.mjs +29 -0
- package/dist/auth/minimal.d.mts +10 -0
- package/dist/auth/minimal.mjs +11 -0
- package/dist/auth/trusted-origins.mjs +106 -0
- package/dist/client/broadcast-channel.d.mts +19 -0
- package/dist/client/broadcast-channel.mjs +44 -0
- package/dist/client/config.d.mts +90 -0
- package/dist/client/config.mjs +113 -0
- package/dist/client/equality.d.mts +19 -0
- package/dist/client/equality.mjs +42 -0
- package/dist/client/fetch-plugins.mjs +17 -0
- package/dist/client/focus-manager.d.mts +10 -0
- package/dist/client/focus-manager.mjs +30 -0
- package/dist/client/index.d.mts +35 -0
- package/dist/client/index.mjs +22 -0
- package/dist/client/lynx/index.d.mts +43 -0
- package/dist/client/lynx/index.mjs +22 -0
- package/dist/client/lynx/lynx-store.d.mts +46 -0
- package/dist/client/lynx/lynx-store.mjs +44 -0
- package/dist/client/online-manager.d.mts +11 -0
- package/dist/client/online-manager.mjs +33 -0
- package/dist/client/parser.d.mts +10 -0
- package/dist/client/parser.mjs +70 -0
- package/dist/client/path-to-object.d.mts +113 -0
- package/dist/client/plugins/index.d.mts +44 -0
- package/dist/client/plugins/index.mjs +30 -0
- package/dist/client/plugins/infer-plugin.d.mts +16 -0
- package/dist/client/plugins/infer-plugin.mjs +11 -0
- package/dist/client/proxy.mjs +78 -0
- package/dist/client/query.d.mts +23 -0
- package/dist/client/query.mjs +124 -0
- package/dist/client/react/index.d.mts +44 -0
- package/dist/client/react/index.mjs +22 -0
- package/dist/client/react/react-store.d.mts +46 -0
- package/dist/client/react/react-store.mjs +44 -0
- package/dist/client/session-atom.d.mts +11 -0
- package/dist/client/session-atom.mjs +178 -0
- package/dist/client/session-refresh.d.mts +20 -0
- package/dist/client/session-refresh.mjs +131 -0
- package/dist/client/solid/index.d.mts +44 -0
- package/dist/client/solid/index.mjs +22 -0
- package/dist/client/solid/solid-store.mjs +21 -0
- package/dist/client/svelte/index.d.mts +44 -0
- package/dist/client/svelte/index.mjs +18 -0
- package/dist/client/types.d.mts +51 -0
- package/dist/client/vanilla.d.mts +42 -0
- package/dist/client/vanilla.mjs +18 -0
- package/dist/client/vue/index.d.mts +67 -0
- package/dist/client/vue/index.mjs +54 -0
- package/dist/client/vue/vue-store.mjs +23 -0
- package/dist/context/create-context.mjs +235 -0
- package/dist/context/helpers.mjs +158 -0
- package/dist/context/init-minimal.mjs +17 -0
- package/dist/context/init.mjs +19 -0
- package/dist/context/secret-utils.mjs +53 -0
- package/dist/context/store-capabilities.mjs +12 -0
- package/dist/cookies/cache.mjs +33 -0
- package/dist/cookies/cookie-utils.d.mts +72 -0
- package/dist/cookies/cookie-utils.mjs +203 -0
- package/dist/cookies/index.d.mts +124 -0
- package/dist/cookies/index.mjs +350 -0
- package/dist/cookies/jwt.mjs +44 -0
- package/dist/cookies/session-store.d.mts +32 -0
- package/dist/cookies/session-store.mjs +183 -0
- package/dist/crypto/buffer.d.mts +7 -0
- package/dist/crypto/buffer.mjs +16 -0
- package/dist/crypto/index.d.mts +32 -0
- package/dist/crypto/index.mjs +69 -0
- package/dist/crypto/jwt.d.mts +9 -0
- package/dist/crypto/jwt.mjs +141 -0
- package/dist/crypto/password.d.mts +13 -0
- package/dist/crypto/password.mjs +14 -0
- package/dist/crypto/random.d.mts +4 -0
- package/dist/crypto/random.mjs +5 -0
- package/dist/db/adapter-base.d.mts +7 -0
- package/dist/db/adapter-base.mjs +25 -0
- package/dist/db/adapter-kysely.d.mts +7 -0
- package/dist/db/adapter-kysely.mjs +17 -0
- package/dist/db/field-converter.d.mts +7 -0
- package/dist/db/field-converter.mjs +19 -0
- package/dist/db/field.d.mts +41 -0
- package/dist/db/get-migration.d.mts +56 -0
- package/dist/db/get-migration.mjs +685 -0
- package/dist/db/get-schema.d.mts +13 -0
- package/dist/db/get-schema.mjs +39 -0
- package/dist/db/index.d.mts +10 -0
- package/dist/db/index.mjs +35 -0
- package/dist/db/internal-adapter.d.mts +14 -0
- package/dist/db/internal-adapter.mjs +951 -0
- package/dist/db/revoke-unproven-account-access.d.mts +21 -0
- package/dist/db/revoke-unproven-account-access.mjs +58 -0
- package/dist/db/schema.d.mts +62 -0
- package/dist/db/schema.mjs +161 -0
- package/dist/db/to-zod.d.mts +35 -0
- package/dist/db/to-zod.mjs +23 -0
- package/dist/db/verification-token-storage.mjs +25 -0
- package/dist/db/with-hooks.d.mts +37 -0
- package/dist/db/with-hooks.mjs +255 -0
- package/dist/index.d.mts +30 -0
- package/dist/index.mjs +17 -0
- package/dist/integrations/cookie-plugin-guard.mjs +18 -0
- package/dist/integrations/next-js.d.mts +29 -0
- package/dist/integrations/next-js.mjs +105 -0
- package/dist/integrations/node.d.mts +11 -0
- package/dist/integrations/node.mjs +13 -0
- package/dist/integrations/solid-start.d.mts +22 -0
- package/dist/integrations/solid-start.mjs +15 -0
- package/dist/integrations/svelte-kit.d.mts +38 -0
- package/dist/integrations/svelte-kit.mjs +57 -0
- package/dist/integrations/tanstack-start-solid.d.mts +33 -0
- package/dist/integrations/tanstack-start-solid.mjs +57 -0
- package/dist/integrations/tanstack-start.d.mts +33 -0
- package/dist/integrations/tanstack-start.mjs +57 -0
- package/dist/oauth2/account-key.mjs +43 -0
- package/dist/oauth2/errors.mjs +49 -0
- package/dist/oauth2/index.d.mts +5 -0
- package/dist/oauth2/index.mjs +5 -0
- package/dist/oauth2/link-account.d.mts +96 -0
- package/dist/oauth2/link-account.mjs +329 -0
- package/dist/oauth2/state.d.mts +54 -0
- package/dist/oauth2/state.mjs +67 -0
- package/dist/oauth2/utils.d.mts +11 -0
- package/dist/oauth2/utils.mjs +33 -0
- package/dist/package.mjs +4 -0
- package/dist/plugins/access/access.d.mts +17 -0
- package/dist/plugins/access/access.mjs +78 -0
- package/dist/plugins/access/index.d.mts +3 -0
- package/dist/plugins/access/index.mjs +2 -0
- package/dist/plugins/access/types.d.mts +24 -0
- package/dist/plugins/additional-fields/client.d.mts +100 -0
- package/dist/plugins/additional-fields/client.mjs +11 -0
- package/dist/plugins/admin/access/index.d.mts +2 -0
- package/dist/plugins/admin/access/index.mjs +2 -0
- package/dist/plugins/admin/access/statement.d.mts +51 -0
- package/dist/plugins/admin/access/statement.mjs +52 -0
- package/dist/plugins/admin/admin.d.mts +911 -0
- package/dist/plugins/admin/admin.mjs +89 -0
- package/dist/plugins/admin/client.d.mts +81 -0
- package/dist/plugins/admin/client.mjs +39 -0
- package/dist/plugins/admin/error-codes.d.mts +30 -0
- package/dist/plugins/admin/error-codes.mjs +29 -0
- package/dist/plugins/admin/has-permission.mjs +12 -0
- package/dist/plugins/admin/index.d.mts +3 -0
- package/dist/plugins/admin/index.mjs +2 -0
- package/dist/plugins/admin/routes.mjs +919 -0
- package/dist/plugins/admin/schema.d.mts +40 -0
- package/dist/plugins/admin/schema.mjs +33 -0
- package/dist/plugins/admin/types.d.mts +88 -0
- package/dist/plugins/anonymous/client.d.mts +32 -0
- package/dist/plugins/anonymous/client.mjs +21 -0
- package/dist/plugins/anonymous/error-codes.d.mts +15 -0
- package/dist/plugins/anonymous/error-codes.mjs +14 -0
- package/dist/plugins/anonymous/index.d.mts +175 -0
- package/dist/plugins/anonymous/index.mjs +219 -0
- package/dist/plugins/anonymous/schema.d.mts +15 -0
- package/dist/plugins/anonymous/schema.mjs +9 -0
- package/dist/plugins/anonymous/types.d.mts +65 -0
- package/dist/plugins/bearer/index.d.mts +45 -0
- package/dist/plugins/bearer/index.mjs +74 -0
- package/dist/plugins/captcha/constants.d.mts +9 -0
- package/dist/plugins/captcha/constants.mjs +27 -0
- package/dist/plugins/captcha/error-codes.mjs +13 -0
- package/dist/plugins/captcha/index.d.mts +27 -0
- package/dist/plugins/captcha/index.mjs +79 -0
- package/dist/plugins/captcha/types.d.mts +52 -0
- package/dist/plugins/captcha/utils.mjs +9 -0
- package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
- package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
- package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
- package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
- package/dist/plugins/custom-session/client.d.mts +17 -0
- package/dist/plugins/custom-session/client.mjs +7 -0
- package/dist/plugins/custom-session/index.d.mts +73 -0
- package/dist/plugins/custom-session/index.mjs +65 -0
- package/dist/plugins/device-authorization/client.d.mts +17 -0
- package/dist/plugins/device-authorization/client.mjs +18 -0
- package/dist/plugins/device-authorization/error-codes.mjs +19 -0
- package/dist/plugins/device-authorization/index.d.mts +558 -0
- package/dist/plugins/device-authorization/index.mjs +87 -0
- package/dist/plugins/device-authorization/routes.d.mts +32 -0
- package/dist/plugins/device-authorization/routes.mjs +725 -0
- package/dist/plugins/device-authorization/schema.d.mts +18 -0
- package/dist/plugins/device-authorization/schema.mjs +63 -0
- package/dist/plugins/email-otp/client.d.mts +21 -0
- package/dist/plugins/email-otp/client.mjs +17 -0
- package/dist/plugins/email-otp/error-codes.d.mts +10 -0
- package/dist/plugins/email-otp/error-codes.mjs +9 -0
- package/dist/plugins/email-otp/index.d.mts +551 -0
- package/dist/plugins/email-otp/index.mjs +145 -0
- package/dist/plugins/email-otp/otp-token.mjs +55 -0
- package/dist/plugins/email-otp/routes.mjs +784 -0
- package/dist/plugins/email-otp/types.d.mts +109 -0
- package/dist/plugins/email-otp/utils.mjs +17 -0
- package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
- package/dist/plugins/generic-oauth/index.d.mts +52 -0
- package/dist/plugins/generic-oauth/index.mjs +279 -0
- package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
- package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
- package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
- package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
- package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
- package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
- package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
- package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
- package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
- package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
- package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
- package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
- package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
- package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
- package/dist/plugins/generic-oauth/types.d.mts +268 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
- package/dist/plugins/haveibeenpwned/index.mjs +81 -0
- package/dist/plugins/index.d.mts +69 -0
- package/dist/plugins/index.mjs +49 -0
- package/dist/plugins/jwt/adapter.mjs +68 -0
- package/dist/plugins/jwt/client.d.mts +41 -0
- package/dist/plugins/jwt/client.mjs +19 -0
- package/dist/plugins/jwt/cookie-cache.mjs +77 -0
- package/dist/plugins/jwt/index.d.mts +246 -0
- package/dist/plugins/jwt/index.mjs +214 -0
- package/dist/plugins/jwt/schema.d.mts +33 -0
- package/dist/plugins/jwt/schema.mjs +29 -0
- package/dist/plugins/jwt/sign.d.mts +128 -0
- package/dist/plugins/jwt/sign.mjs +130 -0
- package/dist/plugins/jwt/types.d.mts +256 -0
- package/dist/plugins/jwt/utils.d.mts +41 -0
- package/dist/plugins/jwt/utils.mjs +64 -0
- package/dist/plugins/jwt/verify.d.mts +11 -0
- package/dist/plugins/jwt/verify.mjs +45 -0
- package/dist/plugins/last-login-method/client.d.mts +48 -0
- package/dist/plugins/last-login-method/client.mjs +48 -0
- package/dist/plugins/last-login-method/index.d.mts +127 -0
- package/dist/plugins/last-login-method/index.mjs +98 -0
- package/dist/plugins/magic-link/client.d.mts +10 -0
- package/dist/plugins/magic-link/client.mjs +11 -0
- package/dist/plugins/magic-link/index.d.mts +213 -0
- package/dist/plugins/magic-link/index.mjs +208 -0
- package/dist/plugins/magic-link/utils.mjs +9 -0
- package/dist/plugins/multi-session/client.d.mts +19 -0
- package/dist/plugins/multi-session/client.mjs +19 -0
- package/dist/plugins/multi-session/error-codes.d.mts +8 -0
- package/dist/plugins/multi-session/error-codes.mjs +5 -0
- package/dist/plugins/multi-session/index.d.mts +212 -0
- package/dist/plugins/multi-session/index.mjs +217 -0
- package/dist/plugins/oauth-popup/client.d.mts +82 -0
- package/dist/plugins/oauth-popup/client.mjs +203 -0
- package/dist/plugins/oauth-popup/constants.d.mts +11 -0
- package/dist/plugins/oauth-popup/constants.mjs +11 -0
- package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
- package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
- package/dist/plugins/oauth-popup/index.d.mts +67 -0
- package/dist/plugins/oauth-popup/index.mjs +232 -0
- package/dist/plugins/oauth-popup/types.d.mts +30 -0
- package/dist/plugins/oauth-proxy/index.d.mts +130 -0
- package/dist/plugins/oauth-proxy/index.mjs +407 -0
- package/dist/plugins/oauth-proxy/utils.mjs +55 -0
- package/dist/plugins/one-tap/client.d.mts +174 -0
- package/dist/plugins/one-tap/client.mjs +208 -0
- package/dist/plugins/one-tap/index.d.mts +82 -0
- package/dist/plugins/one-tap/index.mjs +100 -0
- package/dist/plugins/one-time-token/client.d.mts +10 -0
- package/dist/plugins/one-time-token/client.mjs +11 -0
- package/dist/plugins/one-time-token/index.d.mts +132 -0
- package/dist/plugins/one-time-token/index.mjs +107 -0
- package/dist/plugins/one-time-token/utils.mjs +9 -0
- package/dist/plugins/open-api/generator.d.mts +126 -0
- package/dist/plugins/open-api/generator.mjs +557 -0
- package/dist/plugins/open-api/index.d.mts +97 -0
- package/dist/plugins/open-api/index.mjs +65 -0
- package/dist/plugins/open-api/logo.mjs +13 -0
- package/dist/plugins/organization/access/index.d.mts +2 -0
- package/dist/plugins/organization/access/index.mjs +2 -0
- package/dist/plugins/organization/access/statement.d.mts +113 -0
- package/dist/plugins/organization/access/statement.mjs +77 -0
- package/dist/plugins/organization/adapter.d.mts +815 -0
- package/dist/plugins/organization/adapter.mjs +813 -0
- package/dist/plugins/organization/call.mjs +15 -0
- package/dist/plugins/organization/client.d.mts +375 -0
- package/dist/plugins/organization/client.mjs +104 -0
- package/dist/plugins/organization/error-codes.d.mts +66 -0
- package/dist/plugins/organization/error-codes.mjs +65 -0
- package/dist/plugins/organization/has-permission.d.mts +17 -0
- package/dist/plugins/organization/has-permission.mjs +34 -0
- package/dist/plugins/organization/index.d.mts +6 -0
- package/dist/plugins/organization/index.mjs +4 -0
- package/dist/plugins/organization/organization.d.mts +420 -0
- package/dist/plugins/organization/organization.mjs +886 -0
- package/dist/plugins/organization/permission.d.mts +15 -0
- package/dist/plugins/organization/permission.mjs +14 -0
- package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
- package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
- package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
- package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
- package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
- package/dist/plugins/organization/routes/crud-members.mjs +518 -0
- package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
- package/dist/plugins/organization/routes/crud-org.mjs +455 -0
- package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
- package/dist/plugins/organization/routes/crud-team.mjs +766 -0
- package/dist/plugins/organization/schema.d.mts +390 -0
- package/dist/plugins/organization/schema.mjs +65 -0
- package/dist/plugins/organization/types.d.mts +691 -0
- package/dist/plugins/phone-number/client.d.mts +31 -0
- package/dist/plugins/phone-number/client.mjs +19 -0
- package/dist/plugins/phone-number/error-codes.d.mts +19 -0
- package/dist/plugins/phone-number/error-codes.mjs +18 -0
- package/dist/plugins/phone-number/index.d.mts +360 -0
- package/dist/plugins/phone-number/index.mjs +57 -0
- package/dist/plugins/phone-number/routes.mjs +529 -0
- package/dist/plugins/phone-number/schema.d.mts +22 -0
- package/dist/plugins/phone-number/schema.mjs +18 -0
- package/dist/plugins/phone-number/types.d.mts +116 -0
- package/dist/plugins/siwe/client.d.mts +14 -0
- package/dist/plugins/siwe/client.mjs +15 -0
- package/dist/plugins/siwe/index.d.mts +62 -0
- package/dist/plugins/siwe/index.mjs +272 -0
- package/dist/plugins/siwe/parse-message.mjs +60 -0
- package/dist/plugins/siwe/schema.d.mts +35 -0
- package/dist/plugins/siwe/schema.mjs +30 -0
- package/dist/plugins/siwe/types.d.mts +43 -0
- package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
- package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
- package/dist/plugins/test-utils/db-helpers.mjs +65 -0
- package/dist/plugins/test-utils/factories.mjs +38 -0
- package/dist/plugins/test-utils/index.d.mts +73 -0
- package/dist/plugins/test-utils/index.mjs +97 -0
- package/dist/plugins/test-utils/otp-sink.mjs +21 -0
- package/dist/plugins/test-utils/types.d.mts +51 -0
- package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
- package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
- package/dist/plugins/two-factor/client.d.mts +76 -0
- package/dist/plugins/two-factor/client.mjs +41 -0
- package/dist/plugins/two-factor/constant.mjs +6 -0
- package/dist/plugins/two-factor/error-code.d.mts +20 -0
- package/dist/plugins/two-factor/error-code.mjs +19 -0
- package/dist/plugins/two-factor/index.d.mts +720 -0
- package/dist/plugins/two-factor/index.mjs +349 -0
- package/dist/plugins/two-factor/otp/index.d.mts +216 -0
- package/dist/plugins/two-factor/otp/index.mjs +252 -0
- package/dist/plugins/two-factor/schema.d.mts +59 -0
- package/dist/plugins/two-factor/schema.mjs +53 -0
- package/dist/plugins/two-factor/totp/index.d.mts +219 -0
- package/dist/plugins/two-factor/totp/index.mjs +230 -0
- package/dist/plugins/two-factor/types.d.mts +111 -0
- package/dist/plugins/two-factor/utils.mjs +9 -0
- package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
- package/dist/plugins/username/client.d.mts +38 -0
- package/dist/plugins/username/client.mjs +17 -0
- package/dist/plugins/username/error-codes.d.mts +16 -0
- package/dist/plugins/username/error-codes.mjs +15 -0
- package/dist/plugins/username/index.d.mts +326 -0
- package/dist/plugins/username/index.mjs +312 -0
- package/dist/plugins/username/schema.d.mts +50 -0
- package/dist/plugins/username/schema.mjs +25 -0
- package/dist/social-providers/index.d.mts +1 -0
- package/dist/social-providers/index.mjs +2 -0
- package/dist/state.d.mts +48 -0
- package/dist/state.mjs +149 -0
- package/dist/test-utils/headers.d.mts +8 -0
- package/dist/test-utils/headers.mjs +17 -0
- package/dist/test-utils/http-test-instance.d.mts +413 -0
- package/dist/test-utils/http-test-instance.mjs +107 -0
- package/dist/test-utils/index.d.mts +4 -0
- package/dist/test-utils/index.mjs +4 -0
- package/dist/test-utils/test-instance.d.mts +56 -0
- package/dist/test-utils/test-instance.mjs +242 -0
- package/dist/types/adapter.d.mts +2 -0
- package/dist/types/api.d.mts +28 -0
- package/dist/types/auth.d.mts +32 -0
- package/dist/types/helper.d.mts +26 -0
- package/dist/types/index.d.mts +10 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/models.d.mts +10 -0
- package/dist/types/plugins.d.mts +19 -0
- package/dist/utils/boolean.mjs +6 -0
- package/dist/utils/constants.mjs +4 -0
- package/dist/utils/date.mjs +6 -0
- package/dist/utils/hashing.mjs +18 -0
- package/dist/utils/hide-metadata.d.mts +6 -0
- package/dist/utils/hide-metadata.mjs +4 -0
- package/dist/utils/index.d.mts +4 -0
- package/dist/utils/is-api-error.d.mts +2 -0
- package/dist/utils/is-api-error.mjs +2 -0
- package/dist/utils/is-atom.mjs +6 -0
- package/dist/utils/is-promise.mjs +6 -0
- package/dist/utils/middleware-response.mjs +7 -0
- package/dist/utils/password.mjs +32 -0
- package/dist/utils/plugin-helper.mjs +14 -0
- package/dist/utils/request.mjs +23 -0
- package/dist/utils/shim.mjs +22 -0
- package/dist/utils/time.d.mts +48 -0
- package/dist/utils/time.mjs +98 -0
- package/dist/utils/url.d.mts +78 -0
- package/dist/utils/url.mjs +238 -0
- package/dist/utils/validate-user-info.mjs +44 -0
- package/dist/utils/wildcard.mjs +106 -0
- package/dist/version.mjs +5 -0
- package/package.json +595 -3
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { Session, User } from "../../types/models.mjs";
|
|
2
|
+
import { InferOptionSchema } from "../../types/plugins.mjs";
|
|
3
|
+
import { schema } from "./schema.mjs";
|
|
4
|
+
import { Awaitable, GenericEndpointContext } from "@better-auth/core";
|
|
5
|
+
import { JWTPayload } from "jose";
|
|
6
|
+
|
|
7
|
+
//#region src/plugins/jwt/types.d.ts
|
|
8
|
+
interface JwtOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Use the JWT plugin's locally managed signing keys for JWT session cookie
|
|
11
|
+
* cache values.
|
|
12
|
+
*
|
|
13
|
+
* Requires `session.cookieCache.strategy` to be set to `"jwt"`.
|
|
14
|
+
*
|
|
15
|
+
* @default false
|
|
16
|
+
*/
|
|
17
|
+
sessionCookieCache?: boolean | undefined;
|
|
18
|
+
jwks?: {
|
|
19
|
+
/**
|
|
20
|
+
* Disables the /jwks endpoint and uses this endpoint in discovery.
|
|
21
|
+
*
|
|
22
|
+
* Useful if jwks are not managed at /jwks or
|
|
23
|
+
* if your jwks are signed with a certificate and placed on your CDN.
|
|
24
|
+
*/
|
|
25
|
+
remoteUrl?: string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Key pair configuration
|
|
28
|
+
* @description A subset of the options available for the generateKeyPair function
|
|
29
|
+
*
|
|
30
|
+
* @see https://github.com/panva/jose/blob/main/src/runtime/node/generate.ts
|
|
31
|
+
*
|
|
32
|
+
* @default { alg: 'EdDSA', crv: 'Ed25519' }
|
|
33
|
+
*/
|
|
34
|
+
keyPairConfig?: JWKOptions | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Additional key pair configurations to provision so per-resource
|
|
37
|
+
* `signingAlgorithm` overrides (see the OAuth provider plugin's
|
|
38
|
+
* resource entity) can resolve a key for algorithms other than
|
|
39
|
+
* {@link keyPairConfig}.
|
|
40
|
+
*
|
|
41
|
+
* Lazily minted: the first `signJWT` call that pins an algorithm
|
|
42
|
+
* present here mints the row on demand. Subsequent calls reuse it.
|
|
43
|
+
* This avoids needing to coordinate with migration ordering at
|
|
44
|
+
* plugin init — entries here are only materialized after the
|
|
45
|
+
* `jwks` table exists.
|
|
46
|
+
*
|
|
47
|
+
* Algorithms not present in either {@link keyPairConfig} or this
|
|
48
|
+
* list will throw with a descriptive error message identifying
|
|
49
|
+
* the configured default, so misconfiguration is diagnosable.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* jwt({
|
|
54
|
+
* jwks: {
|
|
55
|
+
* keyPairConfig: { alg: "EdDSA" },
|
|
56
|
+
* keyPairConfigs: [{ alg: "ES256" }, { alg: "RS256" }],
|
|
57
|
+
* },
|
|
58
|
+
* })
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
keyPairConfigs?: readonly JWKOptions[] | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Disable private key encryption
|
|
64
|
+
* @description Disable the encryption of the private key in the database
|
|
65
|
+
*
|
|
66
|
+
* @default false
|
|
67
|
+
*/
|
|
68
|
+
disablePrivateKeyEncryption?: boolean | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* The key rotation interval in seconds.
|
|
71
|
+
*
|
|
72
|
+
* @default undefined (disabled)
|
|
73
|
+
*/
|
|
74
|
+
rotationInterval?: number | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* The grace period in seconds.
|
|
77
|
+
*
|
|
78
|
+
* @default 2592000 (30 days)
|
|
79
|
+
*/
|
|
80
|
+
gracePeriod?: number | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* The path of the endpoint exposing the JWKS.
|
|
83
|
+
* When set, this replaces the default /jwks endpoint.
|
|
84
|
+
* The old endpoint will return 404.
|
|
85
|
+
*
|
|
86
|
+
* @default /jwks
|
|
87
|
+
* @example "/.well-known/jwks.json"
|
|
88
|
+
*/
|
|
89
|
+
jwksPath?: string | undefined;
|
|
90
|
+
} | undefined;
|
|
91
|
+
jwt?: {
|
|
92
|
+
/**
|
|
93
|
+
* The issuer of the JWT
|
|
94
|
+
*/
|
|
95
|
+
issuer?: string | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* The audience of the JWT
|
|
98
|
+
*/
|
|
99
|
+
audience?: string | string[] | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Set the "exp" (Expiration Time) Claim.
|
|
102
|
+
*
|
|
103
|
+
* - If a `number` is passed as an argument it is used as the claim directly.
|
|
104
|
+
* - If a `Date` instance is passed as an argument it is converted to unix timestamp and used as the
|
|
105
|
+
* claim.
|
|
106
|
+
* - If a `string` is passed as an argument it is resolved to a time span, and then added to the
|
|
107
|
+
* current unix timestamp and used as the claim.
|
|
108
|
+
*
|
|
109
|
+
* Format used for time span should be a number followed by a unit, such as "5 minutes" or "1
|
|
110
|
+
* day".
|
|
111
|
+
*
|
|
112
|
+
* Valid units are: "sec", "secs", "second", "seconds", "s", "minute", "minutes", "min", "mins",
|
|
113
|
+
* "m", "hour", "hours", "hr", "hrs", "h", "day", "days", "d", "week", "weeks", "w", "year",
|
|
114
|
+
* "years", "yr", "yrs", and "y". It is not possible to specify months. 365.25 days is used as an
|
|
115
|
+
* alias for a year.
|
|
116
|
+
*
|
|
117
|
+
* If the string is suffixed with "ago", or prefixed with a "-", the resulting time span gets
|
|
118
|
+
* subtracted from the current unix timestamp. A "from now" suffix can also be used for
|
|
119
|
+
* readability when adding to the current unix timestamp.
|
|
120
|
+
*
|
|
121
|
+
* @default 15m
|
|
122
|
+
*/
|
|
123
|
+
expirationTime?: number | string | Date | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* A function that is called to define the payload of the JWT
|
|
126
|
+
*/
|
|
127
|
+
definePayload?: (session: {
|
|
128
|
+
user: User & Record<string, any>;
|
|
129
|
+
session: Session & Record<string, any>;
|
|
130
|
+
}) => Awaitable<Record<string, any>> | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* A function that is called to get the subject of the JWT
|
|
133
|
+
*
|
|
134
|
+
* @default session.user.id
|
|
135
|
+
*/
|
|
136
|
+
getSubject?: (session: {
|
|
137
|
+
user: User & Record<string, any>;
|
|
138
|
+
session: Session & Record<string, any>;
|
|
139
|
+
}) => Awaitable<string> | undefined;
|
|
140
|
+
/**
|
|
141
|
+
* A custom function to remote sign the jwt payload.
|
|
142
|
+
*
|
|
143
|
+
* All headers, such as `alg` and `kid`,
|
|
144
|
+
* MUST be defined within this function.
|
|
145
|
+
* You can safely define the header `typ: 'JWT'`.
|
|
146
|
+
*
|
|
147
|
+
* The optional `header` argument carries extra protected-header
|
|
148
|
+
* parameters the caller requires (e.g. `typ: "logout+jwt"` for
|
|
149
|
+
* OIDC Back-Channel Logout). Merge them into the signed header so
|
|
150
|
+
* such profiles stay conformant; `alg`/`kid` remain yours to set.
|
|
151
|
+
*
|
|
152
|
+
* The optional `signingConfig` third argument carries the
|
|
153
|
+
* per-call signing overrides (e.g. an OAuth protected resource pinned
|
|
154
|
+
* to a specific kid/alg). Implementations are free to ignore
|
|
155
|
+
* it for backward compatibility, but remote KMS integrations
|
|
156
|
+
* SHOULD honor it so per-resource pinning works end-to-end.
|
|
157
|
+
*
|
|
158
|
+
* @requires jwks.remoteUrl
|
|
159
|
+
* @invalidates other jwt.* options
|
|
160
|
+
*/
|
|
161
|
+
sign?: ((payload: JWTPayload, header?: {
|
|
162
|
+
typ?: string;
|
|
163
|
+
cty?: string;
|
|
164
|
+
}, signingConfig?: {
|
|
165
|
+
signingKeyId?: string | undefined;
|
|
166
|
+
signingAlgorithm?: JWSAlgorithms | undefined;
|
|
167
|
+
}) => Awaitable<string>) | undefined;
|
|
168
|
+
} | undefined;
|
|
169
|
+
/**
|
|
170
|
+
* Disables setting JWTs through middleware.
|
|
171
|
+
*
|
|
172
|
+
* Recommended to set `true` when using an oAuth provider plugin
|
|
173
|
+
* like OIDC or MCP where session payloads should not be signed.
|
|
174
|
+
*
|
|
175
|
+
* @default false
|
|
176
|
+
*/
|
|
177
|
+
disableSettingJwtHeader?: boolean | undefined;
|
|
178
|
+
/**
|
|
179
|
+
* Custom schema for the admin plugin
|
|
180
|
+
*/
|
|
181
|
+
schema?: InferOptionSchema<typeof schema> | undefined;
|
|
182
|
+
/**
|
|
183
|
+
* Custom adapter for the jwt plugin
|
|
184
|
+
*
|
|
185
|
+
* This will override the default adapter
|
|
186
|
+
*
|
|
187
|
+
* @default adapter from the database
|
|
188
|
+
*/
|
|
189
|
+
adapter?: {
|
|
190
|
+
/**
|
|
191
|
+
* A custom function to get the JWKS from the database or
|
|
192
|
+
* other source
|
|
193
|
+
*
|
|
194
|
+
* This will override the default getJwks from the database
|
|
195
|
+
*
|
|
196
|
+
* @param ctx - The context of the request
|
|
197
|
+
* @returns The JWKS
|
|
198
|
+
*/
|
|
199
|
+
getJwks?: (ctx: GenericEndpointContext) => Promise<Jwk[] | null | undefined>;
|
|
200
|
+
/**
|
|
201
|
+
* A custom function to create a new key in the database or
|
|
202
|
+
* other source
|
|
203
|
+
*
|
|
204
|
+
* This will override the default createJwk from the database
|
|
205
|
+
*
|
|
206
|
+
* @param data - The key to create
|
|
207
|
+
* @returns The created key
|
|
208
|
+
*/
|
|
209
|
+
createJwk?: (data: Omit<Jwk, "id">, ctx: GenericEndpointContext) => Promise<Jwk>;
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Asymmetric (JWS) Supported.
|
|
214
|
+
*
|
|
215
|
+
* @see https://github.com/panva/jose/issues/210
|
|
216
|
+
*/
|
|
217
|
+
type JWKOptions = {
|
|
218
|
+
alg: "EdDSA";
|
|
219
|
+
crv?: "Ed25519" | undefined;
|
|
220
|
+
} | {
|
|
221
|
+
alg: "ES256";
|
|
222
|
+
crv?: never | undefined;
|
|
223
|
+
} | {
|
|
224
|
+
alg: "ES512";
|
|
225
|
+
crv?: never | undefined;
|
|
226
|
+
} | {
|
|
227
|
+
alg: "PS256";
|
|
228
|
+
modulusLength?: number | undefined;
|
|
229
|
+
} | {
|
|
230
|
+
alg: "RS256";
|
|
231
|
+
modulusLength?: number | undefined;
|
|
232
|
+
};
|
|
233
|
+
type JWSAlgorithms = JWKOptions["alg"];
|
|
234
|
+
interface Jwk {
|
|
235
|
+
id: string;
|
|
236
|
+
publicKey: string;
|
|
237
|
+
privateKey: string;
|
|
238
|
+
createdAt: Date;
|
|
239
|
+
expiresAt?: Date;
|
|
240
|
+
alg?: JWSAlgorithms | undefined;
|
|
241
|
+
crv?: ("Ed25519" | "P-256" | "P-521") | undefined;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* A fully resolved signing key ready for JWT signing.
|
|
245
|
+
* Produced by `resolveSigningKey`, consumed by `signJWT`.
|
|
246
|
+
* Separates key resolution from signing so callers can
|
|
247
|
+
* read the `alg` before constructing the JWT payload
|
|
248
|
+
* (required for OIDC hash claims like at_hash).
|
|
249
|
+
*/
|
|
250
|
+
interface ResolvedSigningKey {
|
|
251
|
+
alg: string;
|
|
252
|
+
kid: string;
|
|
253
|
+
privateKey: CryptoKey | Uint8Array;
|
|
254
|
+
}
|
|
255
|
+
//#endregion
|
|
256
|
+
export { JWKOptions, JWSAlgorithms, Jwk, JwtOptions, ResolvedSigningKey };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Jwk, JwtOptions } from "./types.mjs";
|
|
2
|
+
import { GenericEndpointContext } from "@better-auth/core";
|
|
3
|
+
import * as _$jose from "jose";
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/jwt/utils.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Converts an expirationTime to ISO seconds expiration time (the format of JWT exp)
|
|
8
|
+
*
|
|
9
|
+
* See https://github.com/panva/jose/blob/main/src/lib/jwt_claims_set.ts#L245
|
|
10
|
+
*
|
|
11
|
+
* @param expirationTime - see options.jwt.expirationTime
|
|
12
|
+
* @param iat - the iat time to consolidate on
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
declare function toExpJWT(expirationTime: number | Date | string, iat: number): number;
|
|
16
|
+
declare function generateExportedKeyPair(options?: JwtOptions | undefined): Promise<{
|
|
17
|
+
publicWebKey: _$jose.JWK;
|
|
18
|
+
privateWebKey: _$jose.JWK;
|
|
19
|
+
alg: "EdDSA" | "ES256" | "ES512" | "PS256" | "RS256";
|
|
20
|
+
cfg: {
|
|
21
|
+
crv?: "Ed25519" | undefined;
|
|
22
|
+
} | {
|
|
23
|
+
crv?: never | undefined;
|
|
24
|
+
} | {
|
|
25
|
+
crv?: never | undefined;
|
|
26
|
+
} | {
|
|
27
|
+
modulusLength?: number | undefined;
|
|
28
|
+
} | {
|
|
29
|
+
modulusLength?: number | undefined;
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Creates a Jwk on the database
|
|
34
|
+
*
|
|
35
|
+
* @param ctx
|
|
36
|
+
* @param options
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
declare function createJwk(ctx: GenericEndpointContext, options?: JwtOptions | undefined): Promise<Jwk>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { createJwk, generateExportedKeyPair, toExpJWT };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { sec } from "../../utils/time.mjs";
|
|
2
|
+
import { symmetricEncrypt } from "../../crypto/index.mjs";
|
|
3
|
+
import { getJwksAdapter } from "./adapter.mjs";
|
|
4
|
+
import { exportJWK, generateKeyPair } from "jose";
|
|
5
|
+
//#region src/plugins/jwt/utils.ts
|
|
6
|
+
/**
|
|
7
|
+
* Converts an expirationTime to ISO seconds expiration time (the format of JWT exp)
|
|
8
|
+
*
|
|
9
|
+
* See https://github.com/panva/jose/blob/main/src/lib/jwt_claims_set.ts#L245
|
|
10
|
+
*
|
|
11
|
+
* @param expirationTime - see options.jwt.expirationTime
|
|
12
|
+
* @param iat - the iat time to consolidate on
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
function toExpJWT(expirationTime, iat) {
|
|
16
|
+
if (typeof expirationTime === "number") return expirationTime;
|
|
17
|
+
else if (expirationTime instanceof Date) return Math.floor(expirationTime.getTime() / 1e3);
|
|
18
|
+
else return iat + sec(expirationTime);
|
|
19
|
+
}
|
|
20
|
+
async function generateExportedKeyPair(options) {
|
|
21
|
+
const { alg, ...cfg } = options?.jwks?.keyPairConfig ?? {
|
|
22
|
+
alg: "EdDSA",
|
|
23
|
+
crv: "Ed25519"
|
|
24
|
+
};
|
|
25
|
+
const { publicKey, privateKey } = await generateKeyPair(alg, {
|
|
26
|
+
...cfg,
|
|
27
|
+
extractable: true
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
publicWebKey: await exportJWK(publicKey),
|
|
31
|
+
privateWebKey: await exportJWK(privateKey),
|
|
32
|
+
alg,
|
|
33
|
+
cfg
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Creates a Jwk on the database
|
|
38
|
+
*
|
|
39
|
+
* @param ctx
|
|
40
|
+
* @param options
|
|
41
|
+
* @returns
|
|
42
|
+
*/
|
|
43
|
+
async function createJwk(ctx, options) {
|
|
44
|
+
const { publicWebKey, privateWebKey, alg, cfg } = await generateExportedKeyPair(options);
|
|
45
|
+
const explicitCrv = cfg && "crv" in cfg ? cfg.crv : void 0;
|
|
46
|
+
const derivedCrv = typeof publicWebKey.crv === "string" ? publicWebKey.crv : void 0;
|
|
47
|
+
const crv = explicitCrv ?? derivedCrv;
|
|
48
|
+
const stringifiedPrivateWebKey = JSON.stringify(privateWebKey);
|
|
49
|
+
const privateKeyEncryptionEnabled = !options?.jwks?.disablePrivateKeyEncryption;
|
|
50
|
+
const jwk = {
|
|
51
|
+
alg,
|
|
52
|
+
...crv ? { crv } : {},
|
|
53
|
+
publicKey: JSON.stringify(publicWebKey),
|
|
54
|
+
privateKey: privateKeyEncryptionEnabled ? JSON.stringify(await symmetricEncrypt({
|
|
55
|
+
key: ctx.context.secretConfig,
|
|
56
|
+
data: stringifiedPrivateWebKey
|
|
57
|
+
})) : stringifiedPrivateWebKey,
|
|
58
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
59
|
+
...options?.jwks?.rotationInterval ? { expiresAt: new Date(Date.now() + options.jwks.rotationInterval * 1e3) } : {}
|
|
60
|
+
};
|
|
61
|
+
return await getJwksAdapter(ctx.context.adapter, options).createJwk(ctx, jwk);
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { createJwk, generateExportedKeyPair, toExpJWT };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { JwtOptions } from "./types.mjs";
|
|
2
|
+
import { JWTPayload } from "jose";
|
|
3
|
+
|
|
4
|
+
//#region src/plugins/jwt/verify.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Verify a JWT token using the JWKS public keys
|
|
7
|
+
* Returns the payload if valid, null otherwise
|
|
8
|
+
*/
|
|
9
|
+
declare function verifyJWT<T extends JWTPayload = JWTPayload>(token: string, options?: JwtOptions): Promise<(T & Required<Pick<JWTPayload, "sub" | "aud">>) | null>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { verifyJWT };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getJwksAdapter } from "./adapter.mjs";
|
|
2
|
+
import { getCurrentAuthEndpointContext } from "@better-auth/core/context";
|
|
3
|
+
import { base64 } from "@better-auth/utils/base64";
|
|
4
|
+
import { importJWK, jwtVerify } from "jose";
|
|
5
|
+
//#region src/plugins/jwt/verify.ts
|
|
6
|
+
/**
|
|
7
|
+
* Verify a JWT token using the JWKS public keys
|
|
8
|
+
* Returns the payload if valid, null otherwise
|
|
9
|
+
*/
|
|
10
|
+
async function verifyJWT(token, options) {
|
|
11
|
+
const ctx = getCurrentAuthEndpointContext();
|
|
12
|
+
try {
|
|
13
|
+
const parts = token.split(".");
|
|
14
|
+
if (parts.length !== 3) return null;
|
|
15
|
+
const headerStr = new TextDecoder().decode(base64.decode(parts[0]));
|
|
16
|
+
const kid = JSON.parse(headerStr).kid;
|
|
17
|
+
if (!kid) {
|
|
18
|
+
ctx.context.logger.debug("JWT missing kid in header");
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const keys = await getJwksAdapter(ctx.context.adapter, options).getAllKeys(ctx);
|
|
22
|
+
if (!keys || keys.length === 0) {
|
|
23
|
+
ctx.context.logger.debug("No JWKS keys available");
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const key = keys.find((k) => k.id === kid);
|
|
27
|
+
if (!key) {
|
|
28
|
+
ctx.context.logger.debug(`No JWKS key found for kid: ${kid}`);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const cryptoKey = await importJWK(JSON.parse(key.publicKey), key.alg ?? options?.jwks?.keyPairConfig?.alg ?? "EdDSA");
|
|
32
|
+
const baseURLOrigin = typeof ctx.context.options.baseURL === "string" ? ctx.context.options.baseURL : void 0;
|
|
33
|
+
const { payload } = await jwtVerify(token, cryptoKey, {
|
|
34
|
+
issuer: options?.jwt?.issuer ?? baseURLOrigin,
|
|
35
|
+
audience: options?.jwt?.audience ?? baseURLOrigin
|
|
36
|
+
});
|
|
37
|
+
if (!payload.sub || !payload.aud) return null;
|
|
38
|
+
return payload;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
ctx.context.logger.debug("JWT verification failed", error);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { verifyJWT };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/plugins/last-login-method/client.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for the client-side last login method plugin
|
|
4
|
+
*/
|
|
5
|
+
interface LastLoginMethodClientConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Name of the cookie to read the last login method from
|
|
8
|
+
* @default "better-auth.last_used_login_method"
|
|
9
|
+
*/
|
|
10
|
+
cookieName?: string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Domain for the cookie. Required when using cross-subdomain cookies
|
|
13
|
+
* so the client can properly clear the cookie set by the server.
|
|
14
|
+
*
|
|
15
|
+
* Should match the `domain` value in your server's
|
|
16
|
+
* `crossSubDomainCookies` configuration.
|
|
17
|
+
*
|
|
18
|
+
* @example ".example.com"
|
|
19
|
+
*/
|
|
20
|
+
domain?: string | undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Client-side plugin to retrieve the last used login method
|
|
24
|
+
*/
|
|
25
|
+
declare const lastLoginMethodClient: (config?: LastLoginMethodClientConfig) => {
|
|
26
|
+
id: "last-login-method-client";
|
|
27
|
+
version: string;
|
|
28
|
+
getActions(): {
|
|
29
|
+
/**
|
|
30
|
+
* Get the last used login method from cookies
|
|
31
|
+
* @returns The last used login method or null if not found
|
|
32
|
+
*/
|
|
33
|
+
getLastUsedLoginMethod: () => string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Clear the last used login method cookie
|
|
36
|
+
* This sets the cookie with an expiration date in the past
|
|
37
|
+
*/
|
|
38
|
+
clearLastUsedLoginMethod: () => void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a specific login method was the last used
|
|
41
|
+
* @param method The method to check
|
|
42
|
+
* @returns True if the method was the last used, false otherwise
|
|
43
|
+
*/
|
|
44
|
+
isLastUsedLoginMethod: (method: string) => boolean;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { LastLoginMethodClientConfig, lastLoginMethodClient };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { parseCookies } from "../../cookies/cookie-utils.mjs";
|
|
2
|
+
import { PACKAGE_VERSION } from "../../version.mjs";
|
|
3
|
+
//#region src/plugins/last-login-method/client.ts
|
|
4
|
+
function getCookieValue(name) {
|
|
5
|
+
if (typeof document === "undefined") return null;
|
|
6
|
+
return parseCookies(document.cookie).get(name) ?? null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Client-side plugin to retrieve the last used login method
|
|
10
|
+
*/
|
|
11
|
+
const lastLoginMethodClient = (config = {}) => {
|
|
12
|
+
const cookieName = config.cookieName || "better-auth.last_used_login_method";
|
|
13
|
+
return {
|
|
14
|
+
id: "last-login-method-client",
|
|
15
|
+
version: PACKAGE_VERSION,
|
|
16
|
+
getActions() {
|
|
17
|
+
return {
|
|
18
|
+
/**
|
|
19
|
+
* Get the last used login method from cookies
|
|
20
|
+
* @returns The last used login method or null if not found
|
|
21
|
+
*/
|
|
22
|
+
getLastUsedLoginMethod: () => {
|
|
23
|
+
return getCookieValue(cookieName);
|
|
24
|
+
},
|
|
25
|
+
/**
|
|
26
|
+
* Clear the last used login method cookie
|
|
27
|
+
* This sets the cookie with an expiration date in the past
|
|
28
|
+
*/
|
|
29
|
+
clearLastUsedLoginMethod: () => {
|
|
30
|
+
if (typeof document !== "undefined") {
|
|
31
|
+
const domainPart = config.domain ? ` domain=${config.domain};` : "";
|
|
32
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;${domainPart}`;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
/**
|
|
36
|
+
* Check if a specific login method was the last used
|
|
37
|
+
* @param method The method to check
|
|
38
|
+
* @returns True if the method was the last used, false otherwise
|
|
39
|
+
*/
|
|
40
|
+
isLastUsedLoginMethod: (method) => {
|
|
41
|
+
return getCookieValue(cookieName) === method;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { lastLoginMethodClient };
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as _$_better_auth_core0 from "@better-auth/core";
|
|
2
|
+
import { GenericEndpointContext } from "@better-auth/core";
|
|
3
|
+
import * as _$better_call0 from "better-call";
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/last-login-method/index.d.ts
|
|
6
|
+
declare module "@better-auth/core" {
|
|
7
|
+
interface BetterAuthPluginRegistry<AuthOptions, Options> {
|
|
8
|
+
"last-login-method": {
|
|
9
|
+
creator: typeof lastLoginMethod;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Configuration for tracking different authentication methods
|
|
15
|
+
*/
|
|
16
|
+
interface LastLoginMethodOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Name of the cookie to store the last login method
|
|
19
|
+
* @default "better-auth.last_used_login_method"
|
|
20
|
+
*/
|
|
21
|
+
cookieName?: string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Cookie expiration time in seconds
|
|
24
|
+
* @default 2592000 (30 days)
|
|
25
|
+
*/
|
|
26
|
+
maxAge?: number | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Custom method to resolve the last login method
|
|
29
|
+
* @param ctx - The context from the hook
|
|
30
|
+
* @returns The last login method
|
|
31
|
+
*/
|
|
32
|
+
customResolveMethod?: ((ctx: GenericEndpointContext) => string | null) | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Store the last login method in the database. This will create a new field in the user table.
|
|
35
|
+
* @default false
|
|
36
|
+
*/
|
|
37
|
+
storeInDatabase?: boolean | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* A hook to run before the last login method is stored in the cookie.
|
|
40
|
+
* Useful if you are required to follow GDPR or other regulations to ensure that you're allowed to store the last login method in the cookie.
|
|
41
|
+
*
|
|
42
|
+
* @param ctx - The context from the hook
|
|
43
|
+
* @param lastUsedLoginMethod - The last login method
|
|
44
|
+
* @returns `true` to store the cookie, `false` to skip storing it (authentication continues either way)
|
|
45
|
+
*/
|
|
46
|
+
beforeStoreCookie?: ((ctx: GenericEndpointContext, lastUsedLoginMethod: string) => Promise<boolean> | boolean) | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Custom schema for the plugin
|
|
49
|
+
* @default undefined
|
|
50
|
+
*/
|
|
51
|
+
schema?: {
|
|
52
|
+
user?: {
|
|
53
|
+
lastLoginMethod?: string;
|
|
54
|
+
};
|
|
55
|
+
} | undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Plugin to track the last used login method
|
|
59
|
+
*/
|
|
60
|
+
declare const lastLoginMethod: <O extends LastLoginMethodOptions>(userConfig?: O | undefined) => {
|
|
61
|
+
id: "last-login-method";
|
|
62
|
+
version: string;
|
|
63
|
+
init(ctx: _$_better_auth_core0.AuthContext): {
|
|
64
|
+
options: {
|
|
65
|
+
databaseHooks: {
|
|
66
|
+
user: {
|
|
67
|
+
create: {
|
|
68
|
+
before(user: {
|
|
69
|
+
id: string;
|
|
70
|
+
createdAt: Date;
|
|
71
|
+
updatedAt: Date;
|
|
72
|
+
email: string;
|
|
73
|
+
emailVerified: boolean;
|
|
74
|
+
name: string;
|
|
75
|
+
image?: string | null | undefined;
|
|
76
|
+
} & Record<string, unknown>, context: GenericEndpointContext | null): Promise<{
|
|
77
|
+
data: {
|
|
78
|
+
lastLoginMethod: string;
|
|
79
|
+
id: string;
|
|
80
|
+
createdAt: Date;
|
|
81
|
+
updatedAt: Date;
|
|
82
|
+
email: string;
|
|
83
|
+
emailVerified: boolean;
|
|
84
|
+
name: string;
|
|
85
|
+
image?: string | null | undefined;
|
|
86
|
+
};
|
|
87
|
+
} | undefined>;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
session: {
|
|
91
|
+
create: {
|
|
92
|
+
after(session: {
|
|
93
|
+
id: string;
|
|
94
|
+
createdAt: Date;
|
|
95
|
+
updatedAt: Date;
|
|
96
|
+
userId: string;
|
|
97
|
+
expiresAt: Date;
|
|
98
|
+
token: string;
|
|
99
|
+
ipAddress?: string | null | undefined;
|
|
100
|
+
userAgent?: string | null | undefined;
|
|
101
|
+
} & Record<string, unknown>, context: GenericEndpointContext | null): Promise<void>;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
hooks: {
|
|
108
|
+
after: {
|
|
109
|
+
matcher(): true;
|
|
110
|
+
handler: _$better_call0.Middleware<_$better_call0.MiddlewareOptions, (inputContext: _$better_call0.MiddlewareInputContext<_$better_call0.MiddlewareOptions>) => Promise<void>>;
|
|
111
|
+
}[];
|
|
112
|
+
};
|
|
113
|
+
schema: O["storeInDatabase"] extends true ? {
|
|
114
|
+
user: {
|
|
115
|
+
fields: {
|
|
116
|
+
lastLoginMethod: {
|
|
117
|
+
type: "string";
|
|
118
|
+
required: false;
|
|
119
|
+
input: false;
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
} : undefined;
|
|
124
|
+
options: NoInfer<O>;
|
|
125
|
+
};
|
|
126
|
+
//#endregion
|
|
127
|
+
export { LastLoginMethodOptions, lastLoginMethod };
|