@robelest/convex-auth 0.0.4-preview.2 → 0.0.4-preview.21
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 +67 -26
- package/dist/authorization/index.d.ts +63 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +63 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/bin.js +6185 -0
- package/dist/client/core/types.d.ts +20 -0
- package/dist/client/core/types.d.ts.map +1 -0
- package/dist/client/index.d.ts +2 -299
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +407 -534
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +42 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +2546 -90
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/client/core/types.d.ts +2 -0
- package/dist/component/client/index.d.ts +2 -0
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/functions.d.ts +11 -9
- package/dist/component/functions.d.ts.map +1 -1
- package/dist/component/functions.js.map +1 -1
- package/dist/component/index.d.ts +7 -11
- package/dist/component/index.js +2 -3
- package/dist/component/model.d.ts +153 -0
- package/dist/component/model.d.ts.map +1 -0
- package/dist/component/model.js +349 -0
- package/dist/component/model.js.map +1 -0
- package/dist/component/providers/anonymous.d.ts +54 -0
- package/dist/component/providers/anonymous.d.ts.map +1 -0
- package/dist/component/providers/credentials.d.ts +5 -5
- package/dist/component/providers/credentials.d.ts.map +1 -1
- package/dist/component/providers/device.d.ts +67 -0
- package/dist/component/providers/device.d.ts.map +1 -0
- package/dist/component/providers/email.d.ts +62 -0
- package/dist/component/providers/email.d.ts.map +1 -0
- package/dist/component/providers/oauth.d.ts.map +1 -1
- package/dist/component/providers/oauth.js.map +1 -1
- package/dist/component/providers/passkey.d.ts +57 -0
- package/dist/component/providers/passkey.d.ts.map +1 -0
- package/dist/component/providers/password.d.ts +88 -0
- package/dist/component/providers/password.d.ts.map +1 -0
- package/dist/component/providers/phone.d.ts +48 -0
- package/dist/component/providers/phone.d.ts.map +1 -0
- package/dist/component/providers/sso.d.ts +50 -0
- package/dist/component/providers/sso.d.ts.map +1 -0
- package/dist/component/providers/totp.d.ts +45 -0
- package/dist/component/providers/totp.d.ts.map +1 -0
- package/dist/component/public/enterprise/audit.d.ts +73 -0
- package/dist/component/public/enterprise/audit.d.ts.map +1 -0
- package/dist/component/public/enterprise/audit.js +108 -0
- package/dist/component/public/enterprise/audit.js.map +1 -0
- package/dist/component/public/enterprise/core.d.ts +176 -0
- package/dist/component/public/enterprise/core.d.ts.map +1 -0
- package/dist/component/public/enterprise/core.js +292 -0
- package/dist/component/public/enterprise/core.js.map +1 -0
- package/dist/component/public/enterprise/domains.d.ts +174 -0
- package/dist/component/public/enterprise/domains.d.ts.map +1 -0
- package/dist/component/public/enterprise/domains.js +271 -0
- package/dist/component/public/enterprise/domains.js.map +1 -0
- package/dist/component/public/enterprise/scim.d.ts +245 -0
- package/dist/component/public/enterprise/scim.d.ts.map +1 -0
- package/dist/component/public/enterprise/scim.js +344 -0
- package/dist/component/public/enterprise/scim.js.map +1 -0
- package/dist/component/public/enterprise/secrets.d.ts +78 -0
- package/dist/component/public/enterprise/secrets.d.ts.map +1 -0
- package/dist/component/public/enterprise/secrets.js +118 -0
- package/dist/component/public/enterprise/secrets.js.map +1 -0
- package/dist/component/public/enterprise/webhooks.d.ts +211 -0
- package/dist/component/public/enterprise/webhooks.d.ts.map +1 -0
- package/dist/component/public/enterprise/webhooks.js +300 -0
- package/dist/component/public/enterprise/webhooks.js.map +1 -0
- package/dist/component/public/factors/devices.d.ts +157 -0
- package/dist/component/public/factors/devices.d.ts.map +1 -0
- package/dist/component/public/factors/devices.js +216 -0
- package/dist/component/public/factors/devices.js.map +1 -0
- package/dist/component/public/factors/passkeys.d.ts +175 -0
- package/dist/component/public/factors/passkeys.d.ts.map +1 -0
- package/dist/component/public/factors/passkeys.js +238 -0
- package/dist/component/public/factors/passkeys.js.map +1 -0
- package/dist/component/public/factors/totp.d.ts +189 -0
- package/dist/component/public/factors/totp.d.ts.map +1 -0
- package/dist/component/public/factors/totp.js +254 -0
- package/dist/component/public/factors/totp.js.map +1 -0
- package/dist/component/public/groups/core.d.ts +137 -0
- package/dist/component/public/groups/core.d.ts.map +1 -0
- package/dist/component/public/groups/core.js +321 -0
- package/dist/component/public/groups/core.js.map +1 -0
- package/dist/component/public/groups/invites.d.ts +217 -0
- package/dist/component/public/groups/invites.d.ts.map +1 -0
- package/dist/component/public/groups/invites.js +457 -0
- package/dist/component/public/groups/invites.js.map +1 -0
- package/dist/component/public/groups/members.d.ts +204 -0
- package/dist/component/public/groups/members.d.ts.map +1 -0
- package/dist/component/public/groups/members.js +355 -0
- package/dist/component/public/groups/members.js.map +1 -0
- package/dist/component/public/identity/accounts.d.ts +147 -0
- package/dist/component/public/identity/accounts.d.ts.map +1 -0
- package/dist/component/public/identity/accounts.js +200 -0
- package/dist/component/public/identity/accounts.js.map +1 -0
- package/dist/component/public/identity/codes.d.ts +104 -0
- package/dist/component/public/identity/codes.d.ts.map +1 -0
- package/dist/component/public/identity/codes.js +140 -0
- package/dist/component/public/identity/codes.js.map +1 -0
- package/dist/component/public/identity/sessions.d.ts +128 -0
- package/dist/component/public/identity/sessions.d.ts.map +1 -0
- package/dist/component/public/identity/sessions.js +192 -0
- package/dist/component/public/identity/sessions.js.map +1 -0
- package/dist/component/public/identity/tokens.d.ts +169 -0
- package/dist/component/public/identity/tokens.d.ts.map +1 -0
- package/dist/component/public/identity/tokens.js +227 -0
- package/dist/component/public/identity/tokens.js.map +1 -0
- package/dist/component/public/identity/users.d.ts +212 -0
- package/dist/component/public/identity/users.d.ts.map +1 -0
- package/dist/component/public/identity/users.js +311 -0
- package/dist/component/public/identity/users.js.map +1 -0
- package/dist/component/public/identity/verifiers.d.ts +116 -0
- package/dist/component/public/identity/verifiers.d.ts.map +1 -0
- package/dist/component/public/identity/verifiers.js +154 -0
- package/dist/component/public/identity/verifiers.js.map +1 -0
- package/dist/component/public/security/keys.d.ts +209 -0
- package/dist/component/public/security/keys.d.ts.map +1 -0
- package/dist/component/public/security/keys.js +319 -0
- package/dist/component/public/security/keys.js.map +1 -0
- package/dist/component/public/security/limits.d.ts +114 -0
- package/dist/component/public/security/limits.d.ts.map +1 -0
- package/dist/component/public/security/limits.js +169 -0
- package/dist/component/public/security/limits.js.map +1 -0
- package/dist/component/public.d.ts +24 -271
- package/dist/component/public.d.ts.map +1 -1
- package/dist/component/public.js +21 -1229
- package/dist/component/schema.d.ts +473 -110
- package/dist/component/schema.js +162 -73
- package/dist/component/schema.js.map +1 -1
- package/dist/component/server/auth.d.ts +318 -373
- package/dist/component/server/auth.d.ts.map +1 -1
- package/dist/component/server/auth.js +204 -123
- package/dist/component/server/auth.js.map +1 -1
- package/dist/component/server/authError.js +34 -0
- package/dist/component/server/authError.js.map +1 -0
- package/dist/component/server/{providers.js → config.js} +43 -12
- package/dist/component/server/config.js.map +1 -0
- package/dist/component/server/cookies.js +3 -0
- package/dist/component/server/cookies.js.map +1 -1
- package/dist/component/server/core.js +713 -0
- package/dist/component/server/core.js.map +1 -0
- package/dist/component/server/crypto.js +38 -0
- package/dist/component/server/crypto.js.map +1 -0
- package/dist/component/server/{implementation/db.js → db.js} +2 -1
- package/dist/component/server/db.js.map +1 -0
- package/dist/component/server/device.js +109 -0
- package/dist/component/server/device.js.map +1 -0
- package/dist/component/server/enterprise/config.js +46 -0
- package/dist/component/server/enterprise/config.js.map +1 -0
- package/dist/component/server/enterprise/domain.js +885 -0
- package/dist/component/server/enterprise/domain.js.map +1 -0
- package/dist/component/server/enterprise/http.js +766 -0
- package/dist/component/server/enterprise/http.js.map +1 -0
- package/dist/component/server/enterprise/oidc.js +248 -0
- package/dist/component/server/enterprise/oidc.js.map +1 -0
- package/dist/component/server/enterprise/policy.js +85 -0
- package/dist/component/server/enterprise/policy.js.map +1 -0
- package/dist/component/server/enterprise/saml.js +338 -0
- package/dist/component/server/enterprise/saml.js.map +1 -0
- package/dist/component/server/enterprise/scim.js +97 -0
- package/dist/component/server/enterprise/scim.js.map +1 -0
- package/dist/component/server/enterprise/shared.js +51 -0
- package/dist/component/server/enterprise/shared.js.map +1 -0
- package/dist/component/server/errors.d.ts +1 -0
- package/dist/component/server/errors.js +24 -16
- package/dist/component/server/errors.js.map +1 -1
- package/dist/component/server/http.js +288 -0
- package/dist/component/server/http.js.map +1 -0
- package/dist/component/server/identity.js +13 -0
- package/dist/component/server/identity.js.map +1 -0
- package/dist/{server/implementation → component/server}/keys.js +9 -31
- package/dist/component/server/keys.js.map +1 -0
- package/dist/component/server/limits.js +61 -0
- package/dist/component/server/limits.js.map +1 -0
- package/dist/component/server/mutations/account.js +44 -0
- package/dist/component/server/mutations/account.js.map +1 -0
- package/dist/component/server/{implementation/mutations → mutations}/code.js +7 -4
- package/dist/component/server/mutations/code.js.map +1 -0
- package/dist/component/server/mutations/invalidate.js +32 -0
- package/dist/component/server/mutations/invalidate.js.map +1 -0
- package/dist/component/server/mutations/oauth.js +110 -0
- package/dist/component/server/mutations/oauth.js.map +1 -0
- package/dist/component/server/mutations/refresh.js +119 -0
- package/dist/component/server/mutations/refresh.js.map +1 -0
- package/dist/component/server/mutations/register.js +83 -0
- package/dist/component/server/mutations/register.js.map +1 -0
- package/dist/component/server/mutations/retrieve.js +65 -0
- package/dist/component/server/mutations/retrieve.js.map +1 -0
- package/dist/component/server/mutations/signature.js +32 -0
- package/dist/component/server/mutations/signature.js.map +1 -0
- package/dist/component/server/{implementation/mutations → mutations}/signin.js +2 -2
- package/dist/component/server/mutations/signin.js.map +1 -0
- package/dist/component/server/mutations/signout.js +27 -0
- package/dist/component/server/mutations/signout.js.map +1 -0
- package/dist/component/server/mutations/store/refs.js +15 -0
- package/dist/component/server/mutations/store/refs.js.map +1 -0
- package/dist/component/server/mutations/store.js +85 -0
- package/dist/component/server/mutations/store.js.map +1 -0
- package/dist/component/server/mutations/verifier.js +18 -0
- package/dist/component/server/mutations/verifier.js.map +1 -0
- package/dist/component/server/mutations/verify.js +98 -0
- package/dist/component/server/mutations/verify.js.map +1 -0
- package/dist/component/server/oauth.js +106 -60
- package/dist/component/server/oauth.js.map +1 -1
- package/dist/component/server/passkey.js +328 -0
- package/dist/component/server/passkey.js.map +1 -0
- package/dist/{server/implementation → component/server}/redirects.js +13 -11
- package/dist/component/server/redirects.js.map +1 -0
- package/dist/component/server/refresh.js +96 -0
- package/dist/component/server/refresh.js.map +1 -0
- package/dist/component/server/runtime.d.ts +136 -0
- package/dist/component/server/runtime.d.ts.map +1 -0
- package/dist/component/server/runtime.js +413 -0
- package/dist/component/server/runtime.js.map +1 -0
- package/dist/{server/implementation → component/server}/sessions.js +14 -8
- package/dist/component/server/sessions.js.map +1 -0
- package/dist/component/server/signin.js +201 -0
- package/dist/component/server/signin.js.map +1 -0
- package/dist/component/server/tokens.js +17 -0
- package/dist/component/server/tokens.js.map +1 -0
- package/dist/component/server/totp.js +148 -0
- package/dist/component/server/totp.js.map +1 -0
- package/dist/component/server/types.d.ts +387 -298
- package/dist/component/server/types.d.ts.map +1 -1
- package/dist/component/server/{implementation/types.js → types.js} +1 -1
- package/dist/component/server/types.js.map +1 -0
- package/dist/component/server/{implementation/users.js → users.js} +54 -35
- package/dist/component/server/users.js.map +1 -0
- package/dist/component/server/utils.js +110 -4
- package/dist/component/server/utils.js.map +1 -1
- package/dist/core/types.d.ts +369 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/factors/device.js +105 -0
- package/dist/factors/device.js.map +1 -0
- package/dist/factors/passkey.js +181 -0
- package/dist/factors/passkey.js.map +1 -0
- package/dist/factors/totp.js +122 -0
- package/dist/factors/totp.js.map +1 -0
- package/dist/providers/anonymous.d.ts +3 -9
- package/dist/providers/anonymous.d.ts.map +1 -1
- package/dist/providers/anonymous.js +1 -18
- package/dist/providers/anonymous.js.map +1 -1
- package/dist/providers/credentials.d.ts +8 -10
- package/dist/providers/credentials.d.ts.map +1 -1
- package/dist/providers/credentials.js +3 -5
- package/dist/providers/credentials.js.map +1 -1
- package/dist/providers/device.d.ts +18 -10
- package/dist/providers/device.d.ts.map +1 -1
- package/dist/providers/device.js +4 -8
- package/dist/providers/device.js.map +1 -1
- package/dist/providers/email.d.ts +50 -23
- package/dist/providers/email.d.ts.map +1 -1
- package/dist/providers/email.js +58 -34
- package/dist/providers/email.js.map +1 -1
- package/dist/providers/index.d.ts +7 -3
- package/dist/providers/index.js +4 -1
- package/dist/providers/oauth.d.ts.map +1 -1
- package/dist/providers/oauth.js.map +1 -1
- package/dist/providers/passkey.d.ts +12 -9
- package/dist/providers/passkey.d.ts.map +1 -1
- package/dist/providers/passkey.js +1 -7
- package/dist/providers/passkey.js.map +1 -1
- package/dist/providers/password.d.ts +6 -12
- package/dist/providers/password.d.ts.map +1 -1
- package/dist/providers/password.js +189 -89
- package/dist/providers/password.js.map +1 -1
- package/dist/providers/phone.d.ts +40 -11
- package/dist/providers/phone.d.ts.map +1 -1
- package/dist/providers/phone.js +52 -21
- package/dist/providers/phone.js.map +1 -1
- package/dist/providers/sso.d.ts +50 -0
- package/dist/providers/sso.d.ts.map +1 -0
- package/dist/providers/sso.js +34 -0
- package/dist/providers/sso.js.map +1 -0
- package/dist/providers/totp.d.ts +12 -9
- package/dist/providers/totp.d.ts.map +1 -1
- package/dist/providers/totp.js +1 -7
- package/dist/providers/totp.js.map +1 -1
- package/dist/runtime/browser.js +68 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/invite.js +51 -0
- package/dist/runtime/invite.js.map +1 -0
- package/dist/runtime/proxy.js +70 -0
- package/dist/runtime/proxy.js.map +1 -0
- package/dist/runtime/storage.js +37 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/server/auth.d.ts +335 -370
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +204 -123
- package/dist/server/auth.js.map +1 -1
- package/dist/server/authError.d.ts +46 -0
- package/dist/server/authError.d.ts.map +1 -0
- package/dist/server/authError.js +34 -0
- package/dist/server/authError.js.map +1 -0
- package/dist/server/config.d.ts +1 -0
- package/dist/server/{providers.js → config.js} +43 -12
- package/dist/server/config.js.map +1 -0
- package/dist/server/cookies.d.ts +1 -38
- package/dist/server/cookies.js +3 -0
- package/dist/server/cookies.js.map +1 -1
- package/dist/server/core.d.ts +1436 -0
- package/dist/server/core.d.ts.map +1 -0
- package/dist/server/core.js +713 -0
- package/dist/server/core.js.map +1 -0
- package/dist/server/crypto.d.ts +8 -0
- package/dist/server/crypto.d.ts.map +1 -0
- package/dist/server/crypto.js +38 -0
- package/dist/server/crypto.js.map +1 -0
- package/dist/server/db.d.ts +1 -0
- package/dist/server/{implementation/db.js → db.js} +2 -1
- package/dist/server/db.js.map +1 -0
- package/dist/server/device.d.ts +1 -0
- package/dist/server/device.js +109 -0
- package/dist/server/device.js.map +1 -0
- package/dist/server/enterprise/config.d.ts +1 -0
- package/dist/server/enterprise/config.js +46 -0
- package/dist/server/enterprise/config.js.map +1 -0
- package/dist/server/enterprise/domain.d.ts +409 -0
- package/dist/server/enterprise/domain.d.ts.map +1 -0
- package/dist/server/enterprise/domain.js +885 -0
- package/dist/server/enterprise/domain.js.map +1 -0
- package/dist/server/enterprise/http.d.ts +26 -0
- package/dist/server/enterprise/http.d.ts.map +1 -0
- package/dist/server/enterprise/http.js +766 -0
- package/dist/server/enterprise/http.js.map +1 -0
- package/dist/server/enterprise/oidc.d.ts +1 -0
- package/dist/server/enterprise/oidc.js +248 -0
- package/dist/server/enterprise/oidc.js.map +1 -0
- package/dist/server/enterprise/policy.d.ts +1 -0
- package/dist/server/enterprise/policy.js +85 -0
- package/dist/server/enterprise/policy.js.map +1 -0
- package/dist/server/enterprise/saml.d.ts +1 -0
- package/dist/server/enterprise/saml.js +338 -0
- package/dist/server/enterprise/saml.js.map +1 -0
- package/dist/server/enterprise/scim.d.ts +1 -0
- package/dist/server/enterprise/scim.js +97 -0
- package/dist/server/enterprise/scim.js.map +1 -0
- package/dist/server/enterprise/shared.d.ts +5 -0
- package/dist/server/enterprise/shared.d.ts.map +1 -0
- package/dist/server/enterprise/shared.js +51 -0
- package/dist/server/enterprise/shared.js.map +1 -0
- package/dist/server/enterprise/validators.d.ts +1 -0
- package/dist/server/enterprise/validators.js +60 -0
- package/dist/server/enterprise/validators.js.map +1 -0
- package/dist/server/errors.d.ts +33 -1
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +44 -1
- package/dist/server/errors.js.map +1 -1
- package/dist/server/http.d.ts +59 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +288 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/identity.d.ts +1 -0
- package/dist/server/identity.js +13 -0
- package/dist/server/identity.js.map +1 -0
- package/dist/server/index.d.ts +4 -182
- package/dist/server/index.js +4 -376
- package/dist/server/keys.d.ts +1 -0
- package/dist/{component/server/implementation → server}/keys.js +9 -31
- package/dist/server/keys.js.map +1 -0
- package/dist/server/limits.d.ts +1 -0
- package/dist/server/limits.js +61 -0
- package/dist/server/limits.js.map +1 -0
- package/dist/server/mounts.d.ts +647 -0
- package/dist/server/mounts.d.ts.map +1 -0
- package/dist/server/mounts.js +643 -0
- package/dist/server/mounts.js.map +1 -0
- package/dist/server/mutations/account.d.ts +30 -0
- package/dist/server/mutations/account.d.ts.map +1 -0
- package/dist/server/mutations/account.js +44 -0
- package/dist/server/mutations/account.js.map +1 -0
- package/dist/server/mutations/code.d.ts +30 -0
- package/dist/server/mutations/code.d.ts.map +1 -0
- package/dist/server/{implementation/mutations → mutations}/code.js +7 -4
- package/dist/server/mutations/code.js.map +1 -0
- package/dist/server/mutations/index.d.ts +14 -0
- package/dist/server/mutations/index.js +15 -0
- package/dist/server/mutations/invalidate.d.ts +20 -0
- package/dist/server/mutations/invalidate.d.ts.map +1 -0
- package/dist/server/mutations/invalidate.js +32 -0
- package/dist/server/mutations/invalidate.js.map +1 -0
- package/dist/server/mutations/oauth.d.ts +28 -0
- package/dist/server/mutations/oauth.d.ts.map +1 -0
- package/dist/server/mutations/oauth.js +110 -0
- package/dist/server/mutations/oauth.js.map +1 -0
- package/dist/server/mutations/refresh.d.ts +21 -0
- package/dist/server/mutations/refresh.d.ts.map +1 -0
- package/dist/server/mutations/refresh.js +119 -0
- package/dist/server/mutations/refresh.js.map +1 -0
- package/dist/server/mutations/register.d.ts +38 -0
- package/dist/server/mutations/register.d.ts.map +1 -0
- package/dist/server/mutations/register.js +83 -0
- package/dist/server/mutations/register.js.map +1 -0
- package/dist/server/mutations/retrieve.d.ts +33 -0
- package/dist/server/mutations/retrieve.d.ts.map +1 -0
- package/dist/server/mutations/retrieve.js +65 -0
- package/dist/server/mutations/retrieve.js.map +1 -0
- package/dist/server/mutations/signature.d.ts +22 -0
- package/dist/server/mutations/signature.d.ts.map +1 -0
- package/dist/server/mutations/signature.js +32 -0
- package/dist/server/mutations/signature.js.map +1 -0
- package/dist/server/mutations/signin.d.ts +22 -0
- package/dist/server/mutations/signin.d.ts.map +1 -0
- package/dist/server/{implementation/mutations → mutations}/signin.js +2 -2
- package/dist/server/mutations/signin.js.map +1 -0
- package/dist/server/mutations/signout.d.ts +16 -0
- package/dist/server/mutations/signout.d.ts.map +1 -0
- package/dist/server/mutations/signout.js +27 -0
- package/dist/server/mutations/signout.js.map +1 -0
- package/dist/server/mutations/store/refs.d.ts +12 -0
- package/dist/server/mutations/store/refs.d.ts.map +1 -0
- package/dist/server/mutations/store/refs.js +15 -0
- package/dist/server/mutations/store/refs.js.map +1 -0
- package/dist/server/mutations/store.d.ts +306 -0
- package/dist/server/mutations/store.d.ts.map +1 -0
- package/dist/server/mutations/store.js +85 -0
- package/dist/server/mutations/store.js.map +1 -0
- package/dist/server/mutations/verifier.d.ts +13 -0
- package/dist/server/mutations/verifier.d.ts.map +1 -0
- package/dist/server/mutations/verifier.js +18 -0
- package/dist/server/mutations/verifier.js.map +1 -0
- package/dist/server/mutations/verify.d.ts +26 -0
- package/dist/server/mutations/verify.d.ts.map +1 -0
- package/dist/server/mutations/verify.js +98 -0
- package/dist/server/mutations/verify.js.map +1 -0
- package/dist/server/oauth.d.ts +1 -48
- package/dist/server/oauth.js +107 -64
- package/dist/server/oauth.js.map +1 -1
- package/dist/server/passkey.d.ts +27 -0
- package/dist/server/passkey.d.ts.map +1 -0
- package/dist/server/passkey.js +328 -0
- package/dist/server/passkey.js.map +1 -0
- package/dist/server/redirects.d.ts +1 -0
- package/dist/{component/server/implementation → server}/redirects.js +13 -11
- package/dist/server/redirects.js.map +1 -0
- package/dist/server/refresh.d.ts +1 -0
- package/dist/server/refresh.js +96 -0
- package/dist/server/refresh.js.map +1 -0
- package/dist/server/runtime.d.ts +136 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +413 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/sessions.d.ts +1 -0
- package/dist/{component/server/implementation → server}/sessions.js +14 -8
- package/dist/server/sessions.js.map +1 -0
- package/dist/server/signin.d.ts +1 -0
- package/dist/server/signin.js +201 -0
- package/dist/server/signin.js.map +1 -0
- package/dist/server/ssr.d.ts +226 -0
- package/dist/server/ssr.d.ts.map +1 -0
- package/dist/server/ssr.js +786 -0
- package/dist/server/ssr.js.map +1 -0
- package/dist/server/templates.d.ts +1 -21
- package/dist/server/templates.js +2 -1
- package/dist/server/templates.js.map +1 -1
- package/dist/server/tokens.d.ts +1 -0
- package/dist/server/tokens.js +17 -0
- package/dist/server/tokens.js.map +1 -0
- package/dist/server/totp.d.ts +1 -0
- package/dist/server/totp.js +148 -0
- package/dist/server/totp.js.map +1 -0
- package/dist/server/types.d.ts +498 -306
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +108 -1
- package/dist/server/types.js.map +1 -0
- package/dist/server/users.d.ts +1 -0
- package/dist/server/{implementation/users.js → users.js} +54 -35
- package/dist/server/users.js.map +1 -0
- package/dist/server/utils.d.ts +1 -6
- package/dist/server/utils.js +110 -4
- package/dist/server/utils.js.map +1 -1
- package/package.json +49 -46
- package/src/authorization/index.ts +83 -0
- package/src/cli/bin.ts +5 -0
- package/src/cli/command.ts +6 -5
- package/src/cli/index.ts +456 -248
- package/src/cli/keys.ts +3 -0
- package/src/client/core/types.ts +437 -0
- package/src/client/factors/device.ts +160 -0
- package/src/client/factors/passkey.ts +282 -0
- package/src/client/factors/totp.ts +150 -0
- package/src/client/index.ts +745 -989
- package/src/client/runtime/browser.ts +112 -0
- package/src/client/runtime/invite.ts +65 -0
- package/src/client/runtime/proxy.ts +111 -0
- package/src/client/runtime/storage.ts +79 -0
- package/src/component/_generated/api.ts +42 -0
- package/src/component/_generated/component.ts +3123 -102
- package/src/component/functions.ts +38 -22
- package/src/component/index.ts +10 -20
- package/src/component/model.ts +449 -0
- package/src/component/public/enterprise/audit.ts +120 -0
- package/src/component/public/enterprise/core.ts +354 -0
- package/src/component/public/enterprise/domains.ts +323 -0
- package/src/component/public/enterprise/scim.ts +396 -0
- package/src/component/public/enterprise/secrets.ts +132 -0
- package/src/component/public/enterprise/webhooks.ts +306 -0
- package/src/component/public/factors/devices.ts +223 -0
- package/src/component/public/factors/passkeys.ts +242 -0
- package/src/component/public/factors/totp.ts +258 -0
- package/src/component/public/groups/core.ts +481 -0
- package/src/component/public/groups/invites.ts +602 -0
- package/src/component/public/groups/members.ts +409 -0
- package/src/component/public/identity/accounts.ts +206 -0
- package/src/component/public/identity/codes.ts +148 -0
- package/src/component/public/identity/sessions.ts +209 -0
- package/src/component/public/identity/tokens.ts +250 -0
- package/src/component/public/identity/users.ts +354 -0
- package/src/component/public/identity/verifiers.ts +157 -0
- package/src/component/public/security/keys.ts +365 -0
- package/src/component/public/security/limits.ts +173 -0
- package/src/component/public.ts +26 -1766
- package/src/component/schema.ts +273 -100
- package/src/providers/anonymous.ts +10 -20
- package/src/providers/credentials.ts +14 -22
- package/src/providers/device.ts +3 -14
- package/src/providers/email.ts +83 -47
- package/src/providers/index.ts +7 -0
- package/src/providers/oauth.ts +5 -3
- package/src/providers/passkey.ts +0 -13
- package/src/providers/password.ts +307 -130
- package/src/providers/phone.ts +81 -37
- package/src/providers/sso.ts +54 -0
- package/src/providers/totp.ts +0 -13
- package/src/samlify.d.ts +53 -0
- package/src/server/auth.ts +701 -247
- package/src/server/authError.ts +44 -0
- package/src/server/{providers.ts → config.ts} +84 -15
- package/src/server/cookies.ts +8 -1
- package/src/server/core.ts +2095 -0
- package/src/server/crypto.ts +88 -0
- package/src/server/{implementation/db.ts → db.ts} +90 -15
- package/src/server/device.ts +221 -0
- package/src/server/enterprise/config.ts +51 -0
- package/src/server/enterprise/domain.ts +1751 -0
- package/src/server/enterprise/http.ts +1324 -0
- package/src/server/enterprise/oidc.ts +500 -0
- package/src/server/enterprise/policy.ts +128 -0
- package/src/server/enterprise/saml.ts +578 -0
- package/src/server/enterprise/scim.ts +135 -0
- package/src/server/enterprise/shared.ts +134 -0
- package/src/server/enterprise/validators.ts +93 -0
- package/src/server/errors.ts +130 -119
- package/src/server/http.ts +531 -0
- package/src/server/identity.ts +18 -0
- package/src/server/index.ts +32 -650
- package/src/server/{implementation/keys.ts → keys.ts} +16 -44
- package/src/server/limits.ts +134 -0
- package/src/server/mounts.ts +948 -0
- package/src/server/mutations/account.ts +76 -0
- package/src/server/{implementation/mutations → mutations}/code.ts +22 -11
- package/src/server/mutations/index.ts +13 -0
- package/src/server/mutations/invalidate.ts +50 -0
- package/src/server/mutations/oauth.ts +237 -0
- package/src/server/mutations/refresh.ts +298 -0
- package/src/server/mutations/register.ts +200 -0
- package/src/server/mutations/retrieve.ts +109 -0
- package/src/server/mutations/signature.ts +50 -0
- package/src/server/{implementation/mutations → mutations}/signin.ts +9 -7
- package/src/server/mutations/signout.ts +43 -0
- package/src/server/mutations/store/refs.ts +10 -0
- package/src/server/mutations/store.ts +138 -0
- package/src/server/mutations/verifier.ts +34 -0
- package/src/server/mutations/verify.ts +202 -0
- package/src/server/oauth.ts +243 -131
- package/src/server/passkey.ts +784 -0
- package/src/server/{implementation/redirects.ts → redirects.ts} +21 -16
- package/src/server/refresh.ts +222 -0
- package/src/server/runtime.ts +880 -0
- package/src/server/{implementation/sessions.ts → sessions.ts} +33 -25
- package/src/server/signin.ts +438 -0
- package/src/server/ssr.ts +1764 -0
- package/src/server/templates.ts +8 -3
- package/src/server/{implementation/tokens.ts → tokens.ts} +11 -5
- package/src/server/totp.ts +349 -0
- package/src/server/types.ts +972 -207
- package/src/server/{implementation/users.ts → users.ts} +129 -75
- package/src/server/utils.ts +192 -5
- package/src/test.ts +28 -4
- package/dist/bin.cjs +0 -27757
- package/dist/component/providers/email.js +0 -47
- package/dist/component/providers/email.js.map +0 -1
- package/dist/component/public.js.map +0 -1
- package/dist/component/server/implementation/db.js.map +0 -1
- package/dist/component/server/implementation/device.js +0 -135
- package/dist/component/server/implementation/device.js.map +0 -1
- package/dist/component/server/implementation/index.d.ts +0 -870
- package/dist/component/server/implementation/index.d.ts.map +0 -1
- package/dist/component/server/implementation/index.js +0 -610
- package/dist/component/server/implementation/index.js.map +0 -1
- package/dist/component/server/implementation/keys.js.map +0 -1
- package/dist/component/server/implementation/mutations/account.js +0 -39
- package/dist/component/server/implementation/mutations/account.js.map +0 -1
- package/dist/component/server/implementation/mutations/code.js.map +0 -1
- package/dist/component/server/implementation/mutations/index.js +0 -70
- package/dist/component/server/implementation/mutations/index.js.map +0 -1
- package/dist/component/server/implementation/mutations/invalidate.js +0 -29
- package/dist/component/server/implementation/mutations/invalidate.js.map +0 -1
- package/dist/component/server/implementation/mutations/oauth.js +0 -51
- package/dist/component/server/implementation/mutations/oauth.js.map +0 -1
- package/dist/component/server/implementation/mutations/refresh.js +0 -85
- package/dist/component/server/implementation/mutations/refresh.js.map +0 -1
- package/dist/component/server/implementation/mutations/register.js +0 -65
- package/dist/component/server/implementation/mutations/register.js.map +0 -1
- package/dist/component/server/implementation/mutations/retrieve.js +0 -50
- package/dist/component/server/implementation/mutations/retrieve.js.map +0 -1
- package/dist/component/server/implementation/mutations/signature.js +0 -27
- package/dist/component/server/implementation/mutations/signature.js.map +0 -1
- package/dist/component/server/implementation/mutations/signin.js.map +0 -1
- package/dist/component/server/implementation/mutations/signout.js +0 -27
- package/dist/component/server/implementation/mutations/signout.js.map +0 -1
- package/dist/component/server/implementation/mutations/store.js +0 -12
- package/dist/component/server/implementation/mutations/store.js.map +0 -1
- package/dist/component/server/implementation/mutations/verifier.js +0 -16
- package/dist/component/server/implementation/mutations/verifier.js.map +0 -1
- package/dist/component/server/implementation/mutations/verify.js +0 -105
- package/dist/component/server/implementation/mutations/verify.js.map +0 -1
- package/dist/component/server/implementation/passkey.js +0 -307
- package/dist/component/server/implementation/passkey.js.map +0 -1
- package/dist/component/server/implementation/provider.js +0 -19
- package/dist/component/server/implementation/provider.js.map +0 -1
- package/dist/component/server/implementation/ratelimit.js +0 -48
- package/dist/component/server/implementation/ratelimit.js.map +0 -1
- package/dist/component/server/implementation/redirects.js.map +0 -1
- package/dist/component/server/implementation/refresh.js +0 -109
- package/dist/component/server/implementation/refresh.js.map +0 -1
- package/dist/component/server/implementation/sessions.js.map +0 -1
- package/dist/component/server/implementation/signin.js +0 -148
- package/dist/component/server/implementation/signin.js.map +0 -1
- package/dist/component/server/implementation/tokens.js +0 -15
- package/dist/component/server/implementation/tokens.js.map +0 -1
- package/dist/component/server/implementation/totp.js +0 -142
- package/dist/component/server/implementation/totp.js.map +0 -1
- package/dist/component/server/implementation/types.d.ts +0 -42
- package/dist/component/server/implementation/types.d.ts.map +0 -1
- package/dist/component/server/implementation/types.js.map +0 -1
- package/dist/component/server/implementation/users.js.map +0 -1
- package/dist/component/server/implementation/utils.js +0 -56
- package/dist/component/server/implementation/utils.js.map +0 -1
- package/dist/component/server/providers.js.map +0 -1
- package/dist/component/server/templates.js +0 -84
- package/dist/component/server/templates.js.map +0 -1
- package/dist/server/cookies.d.ts.map +0 -1
- package/dist/server/implementation/db.d.ts +0 -86
- package/dist/server/implementation/db.d.ts.map +0 -1
- package/dist/server/implementation/db.js.map +0 -1
- package/dist/server/implementation/device.d.ts +0 -30
- package/dist/server/implementation/device.d.ts.map +0 -1
- package/dist/server/implementation/device.js +0 -135
- package/dist/server/implementation/device.js.map +0 -1
- package/dist/server/implementation/index.d.ts +0 -870
- package/dist/server/implementation/index.d.ts.map +0 -1
- package/dist/server/implementation/index.js +0 -610
- package/dist/server/implementation/index.js.map +0 -1
- package/dist/server/implementation/keys.d.ts +0 -66
- package/dist/server/implementation/keys.d.ts.map +0 -1
- package/dist/server/implementation/keys.js.map +0 -1
- package/dist/server/implementation/mutations/account.d.ts +0 -27
- package/dist/server/implementation/mutations/account.d.ts.map +0 -1
- package/dist/server/implementation/mutations/account.js +0 -39
- package/dist/server/implementation/mutations/account.js.map +0 -1
- package/dist/server/implementation/mutations/code.d.ts +0 -29
- package/dist/server/implementation/mutations/code.d.ts.map +0 -1
- package/dist/server/implementation/mutations/code.js.map +0 -1
- package/dist/server/implementation/mutations/index.d.ts +0 -310
- package/dist/server/implementation/mutations/index.d.ts.map +0 -1
- package/dist/server/implementation/mutations/index.js +0 -70
- package/dist/server/implementation/mutations/index.js.map +0 -1
- package/dist/server/implementation/mutations/invalidate.d.ts +0 -18
- package/dist/server/implementation/mutations/invalidate.d.ts.map +0 -1
- package/dist/server/implementation/mutations/invalidate.js +0 -29
- package/dist/server/implementation/mutations/invalidate.js.map +0 -1
- package/dist/server/implementation/mutations/oauth.d.ts +0 -23
- package/dist/server/implementation/mutations/oauth.d.ts.map +0 -1
- package/dist/server/implementation/mutations/oauth.js +0 -51
- package/dist/server/implementation/mutations/oauth.js.map +0 -1
- package/dist/server/implementation/mutations/refresh.d.ts +0 -20
- package/dist/server/implementation/mutations/refresh.d.ts.map +0 -1
- package/dist/server/implementation/mutations/refresh.js +0 -85
- package/dist/server/implementation/mutations/refresh.js.map +0 -1
- package/dist/server/implementation/mutations/register.d.ts +0 -37
- package/dist/server/implementation/mutations/register.d.ts.map +0 -1
- package/dist/server/implementation/mutations/register.js +0 -65
- package/dist/server/implementation/mutations/register.js.map +0 -1
- package/dist/server/implementation/mutations/retrieve.d.ts +0 -31
- package/dist/server/implementation/mutations/retrieve.d.ts.map +0 -1
- package/dist/server/implementation/mutations/retrieve.js +0 -50
- package/dist/server/implementation/mutations/retrieve.js.map +0 -1
- package/dist/server/implementation/mutations/signature.d.ts +0 -19
- package/dist/server/implementation/mutations/signature.d.ts.map +0 -1
- package/dist/server/implementation/mutations/signature.js +0 -27
- package/dist/server/implementation/mutations/signature.js.map +0 -1
- package/dist/server/implementation/mutations/signin.d.ts +0 -21
- package/dist/server/implementation/mutations/signin.d.ts.map +0 -1
- package/dist/server/implementation/mutations/signin.js.map +0 -1
- package/dist/server/implementation/mutations/signout.d.ts +0 -14
- package/dist/server/implementation/mutations/signout.d.ts.map +0 -1
- package/dist/server/implementation/mutations/signout.js +0 -27
- package/dist/server/implementation/mutations/signout.js.map +0 -1
- package/dist/server/implementation/mutations/store.d.ts +0 -11
- package/dist/server/implementation/mutations/store.d.ts.map +0 -1
- package/dist/server/implementation/mutations/store.js +0 -12
- package/dist/server/implementation/mutations/store.js.map +0 -1
- package/dist/server/implementation/mutations/verifier.d.ts +0 -11
- package/dist/server/implementation/mutations/verifier.d.ts.map +0 -1
- package/dist/server/implementation/mutations/verifier.js +0 -16
- package/dist/server/implementation/mutations/verifier.js.map +0 -1
- package/dist/server/implementation/mutations/verify.d.ts +0 -25
- package/dist/server/implementation/mutations/verify.d.ts.map +0 -1
- package/dist/server/implementation/mutations/verify.js +0 -105
- package/dist/server/implementation/mutations/verify.js.map +0 -1
- package/dist/server/implementation/passkey.d.ts +0 -24
- package/dist/server/implementation/passkey.d.ts.map +0 -1
- package/dist/server/implementation/passkey.js +0 -307
- package/dist/server/implementation/passkey.js.map +0 -1
- package/dist/server/implementation/provider.d.ts +0 -10
- package/dist/server/implementation/provider.d.ts.map +0 -1
- package/dist/server/implementation/provider.js +0 -19
- package/dist/server/implementation/provider.js.map +0 -1
- package/dist/server/implementation/ratelimit.d.ts +0 -10
- package/dist/server/implementation/ratelimit.d.ts.map +0 -1
- package/dist/server/implementation/ratelimit.js +0 -48
- package/dist/server/implementation/ratelimit.js.map +0 -1
- package/dist/server/implementation/redirects.d.ts +0 -10
- package/dist/server/implementation/redirects.d.ts.map +0 -1
- package/dist/server/implementation/redirects.js.map +0 -1
- package/dist/server/implementation/refresh.d.ts +0 -37
- package/dist/server/implementation/refresh.d.ts.map +0 -1
- package/dist/server/implementation/refresh.js +0 -109
- package/dist/server/implementation/refresh.js.map +0 -1
- package/dist/server/implementation/sessions.d.ts +0 -29
- package/dist/server/implementation/sessions.d.ts.map +0 -1
- package/dist/server/implementation/sessions.js.map +0 -1
- package/dist/server/implementation/signin.d.ts +0 -55
- package/dist/server/implementation/signin.d.ts.map +0 -1
- package/dist/server/implementation/signin.js +0 -148
- package/dist/server/implementation/signin.js.map +0 -1
- package/dist/server/implementation/tokens.d.ts +0 -11
- package/dist/server/implementation/tokens.d.ts.map +0 -1
- package/dist/server/implementation/tokens.js +0 -15
- package/dist/server/implementation/tokens.js.map +0 -1
- package/dist/server/implementation/totp.d.ts +0 -31
- package/dist/server/implementation/totp.d.ts.map +0 -1
- package/dist/server/implementation/totp.js +0 -142
- package/dist/server/implementation/totp.js.map +0 -1
- package/dist/server/implementation/types.d.ts +0 -189
- package/dist/server/implementation/types.d.ts.map +0 -1
- package/dist/server/implementation/types.js +0 -97
- package/dist/server/implementation/types.js.map +0 -1
- package/dist/server/implementation/users.d.ts +0 -30
- package/dist/server/implementation/users.d.ts.map +0 -1
- package/dist/server/implementation/users.js.map +0 -1
- package/dist/server/implementation/utils.d.ts +0 -19
- package/dist/server/implementation/utils.d.ts.map +0 -1
- package/dist/server/implementation/utils.js +0 -56
- package/dist/server/implementation/utils.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/oauth.d.ts.map +0 -1
- package/dist/server/providers.d.ts +0 -72
- package/dist/server/providers.d.ts.map +0 -1
- package/dist/server/providers.js.map +0 -1
- package/dist/server/templates.d.ts.map +0 -1
- package/dist/server/utils.d.ts.map +0 -1
- package/dist/server/version.d.ts +0 -5
- package/dist/server/version.d.ts.map +0 -1
- package/dist/server/version.js +0 -6
- package/dist/server/version.js.map +0 -1
- package/src/cli/utils.ts +0 -248
- package/src/server/implementation/device.ts +0 -307
- package/src/server/implementation/index.ts +0 -1583
- package/src/server/implementation/mutations/account.ts +0 -50
- package/src/server/implementation/mutations/index.ts +0 -157
- package/src/server/implementation/mutations/invalidate.ts +0 -42
- package/src/server/implementation/mutations/oauth.ts +0 -73
- package/src/server/implementation/mutations/refresh.ts +0 -175
- package/src/server/implementation/mutations/register.ts +0 -100
- package/src/server/implementation/mutations/retrieve.ts +0 -79
- package/src/server/implementation/mutations/signature.ts +0 -39
- package/src/server/implementation/mutations/signout.ts +0 -35
- package/src/server/implementation/mutations/store.ts +0 -7
- package/src/server/implementation/mutations/verifier.ts +0 -24
- package/src/server/implementation/mutations/verify.ts +0 -194
- package/src/server/implementation/passkey.ts +0 -620
- package/src/server/implementation/provider.ts +0 -36
- package/src/server/implementation/ratelimit.ts +0 -79
- package/src/server/implementation/refresh.ts +0 -172
- package/src/server/implementation/signin.ts +0 -296
- package/src/server/implementation/totp.ts +0 -342
- package/src/server/implementation/types.ts +0 -444
- package/src/server/implementation/utils.ts +0 -91
- package/src/server/version.ts +0 -2
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { LOG_LEVELS, logWithLevel, maybeRedact } from "../utils.js";
|
|
2
|
-
import { authDb } from "../db.js";
|
|
3
|
-
import { AUTH_STORE_REF } from "./store.js";
|
|
4
|
-
import { isSignInRateLimited, recordFailedSignIn, resetSignInRateLimit } from "../ratelimit.js";
|
|
5
|
-
import { verify } from "../provider.js";
|
|
6
|
-
import { v } from "convex/values";
|
|
7
|
-
|
|
8
|
-
//#region src/server/implementation/mutations/retrieve.ts
|
|
9
|
-
const retrieveAccountWithCredentialsArgs = v.object({
|
|
10
|
-
provider: v.string(),
|
|
11
|
-
account: v.object({
|
|
12
|
-
id: v.string(),
|
|
13
|
-
secret: v.optional(v.string())
|
|
14
|
-
})
|
|
15
|
-
});
|
|
16
|
-
async function retrieveAccountWithCredentialsImpl(ctx, args, getProviderOrThrow, config) {
|
|
17
|
-
const { provider: providerId, account } = args;
|
|
18
|
-
const db = authDb(ctx, config);
|
|
19
|
-
logWithLevel(LOG_LEVELS.DEBUG, "retrieveAccountWithCredentialsImpl args:", {
|
|
20
|
-
provider: providerId,
|
|
21
|
-
account: {
|
|
22
|
-
id: account.id,
|
|
23
|
-
secret: maybeRedact(account.secret ?? "")
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
const existingAccount = await db.accounts.get(providerId, account.id);
|
|
27
|
-
if (existingAccount === null) return "InvalidAccountId";
|
|
28
|
-
if (account.secret !== void 0) {
|
|
29
|
-
if (await isSignInRateLimited(ctx, existingAccount._id, config)) return "TooManyFailedAttempts";
|
|
30
|
-
if (!await verify(getProviderOrThrow(providerId), account.secret, existingAccount.secret ?? "")) {
|
|
31
|
-
await recordFailedSignIn(ctx, existingAccount._id, config);
|
|
32
|
-
return "InvalidSecret";
|
|
33
|
-
}
|
|
34
|
-
await resetSignInRateLimit(ctx, existingAccount._id, config);
|
|
35
|
-
}
|
|
36
|
-
return {
|
|
37
|
-
account: existingAccount,
|
|
38
|
-
user: await db.users.getById(existingAccount.userId)
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const callRetreiveAccountWithCredentials = async (ctx, args) => {
|
|
42
|
-
return ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
43
|
-
type: "retrieveAccountWithCredentials",
|
|
44
|
-
...args
|
|
45
|
-
} });
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
//#endregion
|
|
49
|
-
export { callRetreiveAccountWithCredentials, retrieveAccountWithCredentialsArgs, retrieveAccountWithCredentialsImpl };
|
|
50
|
-
//# sourceMappingURL=retrieve.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retrieve.js","names":["Provider.verify"],"sources":["../../../../../src/server/implementation/mutations/retrieve.ts"],"sourcesContent":["import { Infer, v } from \"convex/values\";\nimport { ActionCtx, Doc, MutationCtx } from \"../types\";\nimport {\n isSignInRateLimited,\n recordFailedSignIn,\n resetSignInRateLimit,\n} from \"../ratelimit\";\nimport * as Provider from \"../provider\";\nimport { LOG_LEVELS, logWithLevel, maybeRedact } from \"../utils\";\nimport { authDb } from \"../db\";\nimport { AUTH_STORE_REF } from \"./store\";\n\nexport const retrieveAccountWithCredentialsArgs = v.object({\n provider: v.string(),\n account: v.object({ id: v.string(), secret: v.optional(v.string()) }),\n});\n\ntype ReturnType =\n | \"InvalidAccountId\"\n | \"TooManyFailedAttempts\"\n | \"InvalidSecret\"\n | { account: Doc<\"account\">; user: Doc<\"user\"> };\n\nexport async function retrieveAccountWithCredentialsImpl(\n ctx: MutationCtx,\n args: Infer<typeof retrieveAccountWithCredentialsArgs>,\n getProviderOrThrow: Provider.GetProviderOrThrowFunc,\n config: Provider.Config,\n): Promise<ReturnType> {\n const { provider: providerId, account } = args;\n const db = authDb(ctx, config);\n logWithLevel(LOG_LEVELS.DEBUG, \"retrieveAccountWithCredentialsImpl args:\", {\n provider: providerId,\n account: {\n id: account.id,\n secret: maybeRedact(account.secret ?? \"\"),\n },\n });\n const existingAccount = (await db.accounts.get(\n providerId,\n account.id,\n )) as Doc<\"account\"> | null;\n if (existingAccount === null) {\n return \"InvalidAccountId\";\n }\n if (account.secret !== undefined) {\n if (await isSignInRateLimited(ctx, existingAccount._id, config)) {\n return \"TooManyFailedAttempts\";\n }\n if (\n !(await Provider.verify(\n getProviderOrThrow(providerId),\n account.secret,\n existingAccount.secret ?? \"\",\n ))\n ) {\n await recordFailedSignIn(ctx, existingAccount._id, config);\n return \"InvalidSecret\";\n }\n await resetSignInRateLimit(ctx, existingAccount._id, config);\n }\n return {\n account: existingAccount,\n // TODO: Ian removed this\n user: (await db.users.getById(existingAccount.userId)) as unknown as Doc<\"user\">,\n };\n}\n\nexport const callRetreiveAccountWithCredentials = async (\n ctx: ActionCtx,\n args: Infer<typeof retrieveAccountWithCredentialsArgs>,\n): Promise<ReturnType> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"retrieveAccountWithCredentials\",\n ...args,\n },\n });\n};\n"],"mappings":";;;;;;;;AAYA,MAAa,qCAAqC,EAAE,OAAO;CACzD,UAAU,EAAE,QAAQ;CACpB,SAAS,EAAE,OAAO;EAAE,IAAI,EAAE,QAAQ;EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAAE,CAAC;CACtE,CAAC;AAQF,eAAsB,mCACpB,KACA,MACA,oBACA,QACqB;CACrB,MAAM,EAAE,UAAU,YAAY,YAAY;CAC1C,MAAM,KAAK,OAAO,KAAK,OAAO;AAC9B,cAAa,WAAW,OAAO,4CAA4C;EACzE,UAAU;EACV,SAAS;GACP,IAAI,QAAQ;GACZ,QAAQ,YAAY,QAAQ,UAAU,GAAG;GAC1C;EACF,CAAC;CACF,MAAM,kBAAmB,MAAM,GAAG,SAAS,IACzC,YACA,QAAQ,GACT;AACD,KAAI,oBAAoB,KACtB,QAAO;AAET,KAAI,QAAQ,WAAW,QAAW;AAChC,MAAI,MAAM,oBAAoB,KAAK,gBAAgB,KAAK,OAAO,CAC7D,QAAO;AAET,MACE,CAAE,MAAMA,OACN,mBAAmB,WAAW,EAC9B,QAAQ,QACR,gBAAgB,UAAU,GAC3B,EACD;AACA,SAAM,mBAAmB,KAAK,gBAAgB,KAAK,OAAO;AAC1D,UAAO;;AAET,QAAM,qBAAqB,KAAK,gBAAgB,KAAK,OAAO;;AAE9D,QAAO;EACL,SAAS;EAET,MAAO,MAAM,GAAG,MAAM,QAAQ,gBAAgB,OAAO;EACtD;;AAGH,MAAa,qCAAqC,OAChD,KACA,SACwB;AACxB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { throwAuthError } from "../../errors.js";
|
|
2
|
-
import { authDb } from "../db.js";
|
|
3
|
-
import { AUTH_STORE_REF } from "./store.js";
|
|
4
|
-
import { v } from "convex/values";
|
|
5
|
-
|
|
6
|
-
//#region src/server/implementation/mutations/signature.ts
|
|
7
|
-
const verifierSignatureArgs = v.object({
|
|
8
|
-
verifier: v.string(),
|
|
9
|
-
signature: v.string()
|
|
10
|
-
});
|
|
11
|
-
async function verifierSignatureImpl(ctx, args, config) {
|
|
12
|
-
const { verifier, signature } = args;
|
|
13
|
-
const db = authDb(ctx, config);
|
|
14
|
-
const verifierDoc = await db.verifiers.getById(verifier);
|
|
15
|
-
if (verifierDoc === null) throwAuthError("INVALID_VERIFIER");
|
|
16
|
-
return await db.verifiers.patch(verifierDoc._id, { signature });
|
|
17
|
-
}
|
|
18
|
-
const callVerifierSignature = async (ctx, args) => {
|
|
19
|
-
return ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
20
|
-
type: "verifierSignature",
|
|
21
|
-
...args
|
|
22
|
-
} });
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
//#endregion
|
|
26
|
-
export { callVerifierSignature, verifierSignatureArgs, verifierSignatureImpl };
|
|
27
|
-
//# sourceMappingURL=signature.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signature.js","names":[],"sources":["../../../../../src/server/implementation/mutations/signature.ts"],"sourcesContent":["import { GenericId, Infer, v } from \"convex/values\";\nimport { ActionCtx, MutationCtx } from \"../types\";\nimport * as Provider from \"../provider\";\nimport { authDb } from \"../db\";\nimport { AUTH_STORE_REF } from \"./store\";\nimport { throwAuthError } from \"../../errors\";\n\nexport const verifierSignatureArgs = v.object({\n verifier: v.string(),\n signature: v.string(),\n});\n\ntype ReturnType = void;\n\nexport async function verifierSignatureImpl(\n ctx: MutationCtx,\n args: Infer<typeof verifierSignatureArgs>,\n config: Provider.Config,\n): Promise<ReturnType> {\n const { verifier, signature } = args;\n const db = authDb(ctx, config);\n const verifierDoc = await db.verifiers.getById(verifier as GenericId<\"verifier\">);\n if (verifierDoc === null) {\n throwAuthError(\"INVALID_VERIFIER\");\n }\n return await db.verifiers.patch(verifierDoc._id, { signature });\n}\n\nexport const callVerifierSignature = async (\n ctx: ActionCtx,\n args: Infer<typeof verifierSignatureArgs>,\n): Promise<void> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"verifierSignature\",\n ...args,\n },\n });\n};\n"],"mappings":";;;;;;AAOA,MAAa,wBAAwB,EAAE,OAAO;CAC5C,UAAU,EAAE,QAAQ;CACpB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAIF,eAAsB,sBACpB,KACA,MACA,QACqB;CACrB,MAAM,EAAE,UAAU,cAAc;CAChC,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,cAAc,MAAM,GAAG,UAAU,QAAQ,SAAkC;AACjF,KAAI,gBAAgB,KAClB,gBAAe,mBAAmB;AAEpC,QAAO,MAAM,GAAG,UAAU,MAAM,YAAY,KAAK,EAAE,WAAW,CAAC;;AAGjE,MAAa,wBAAwB,OACnC,KACA,SACkB;AAClB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signin.js","names":[],"sources":["../../../../../src/server/implementation/mutations/signin.ts"],"sourcesContent":["import { GenericId, Infer, v } from \"convex/values\";\nimport { ActionCtx, MutationCtx, SessionInfo } from \"../types\";\nimport * as Provider from \"../provider\";\nimport {\n createNewAndDeleteExistingSession,\n maybeGenerateTokensForSession,\n} from \"../sessions\";\nimport { LOG_LEVELS, logWithLevel } from \"../utils\";\nimport { AUTH_STORE_REF } from \"./store\";\n\nexport const signInArgs = v.object({\n userId: v.string(),\n sessionId: v.optional(v.string()),\n generateTokens: v.boolean(),\n});\n\ntype ReturnType = SessionInfo;\n\nexport async function signInImpl(\n ctx: MutationCtx,\n args: Infer<typeof signInArgs>,\n config: Provider.Config,\n): Promise<ReturnType> {\n logWithLevel(LOG_LEVELS.DEBUG, \"signInImpl args:\", args);\n const { userId, sessionId: existingSessionId, generateTokens } = args;\n const typedUserId = userId as GenericId<\"user\">;\n const typedExistingSessionId = existingSessionId as\n | GenericId<\"session\">\n | undefined;\n const sessionId =\n typedExistingSessionId ??\n (await createNewAndDeleteExistingSession(ctx, config, typedUserId));\n return await maybeGenerateTokensForSession(\n ctx,\n config,\n typedUserId,\n sessionId,\n generateTokens,\n );\n}\n\nexport const callSignIn = async (\n ctx: ActionCtx,\n args: Infer<typeof signInArgs>,\n): Promise<ReturnType> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"signIn\",\n ...args,\n },\n });\n};\n"],"mappings":";;;;;;AAUA,MAAa,aAAa,EAAE,OAAO;CACjC,QAAQ,EAAE,QAAQ;CAClB,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;CACjC,gBAAgB,EAAE,SAAS;CAC5B,CAAC;AAIF,eAAsB,WACpB,KACA,MACA,QACqB;AACrB,cAAa,WAAW,OAAO,oBAAoB,KAAK;CACxD,MAAM,EAAE,QAAQ,WAAW,mBAAmB,mBAAmB;CACjE,MAAM,cAAc;AAOpB,QAAO,MAAM,8BACX,KACA,QACA,aAT6B,qBAK5B,MAAM,kCAAkC,KAAK,QAAQ,YAAY,EAMlE,eACD;;AAGH,MAAa,aAAa,OACxB,KACA,SACwB;AACxB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { authDb } from "../db.js";
|
|
2
|
-
import { deleteSession, getAuthSessionId } from "../sessions.js";
|
|
3
|
-
import { AUTH_STORE_REF } from "./store.js";
|
|
4
|
-
|
|
5
|
-
//#region src/server/implementation/mutations/signout.ts
|
|
6
|
-
async function signOutImpl(ctx, config) {
|
|
7
|
-
const db = authDb(ctx, config);
|
|
8
|
-
const sessionId = await getAuthSessionId(ctx);
|
|
9
|
-
if (sessionId !== null) {
|
|
10
|
-
const session = await db.sessions.getById(sessionId);
|
|
11
|
-
if (session !== null) {
|
|
12
|
-
await deleteSession(ctx, session, config);
|
|
13
|
-
return {
|
|
14
|
-
userId: session.userId,
|
|
15
|
-
sessionId: session._id
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
const callSignOut = async (ctx) => {
|
|
22
|
-
return ctx.runMutation(AUTH_STORE_REF, { args: { type: "signOut" } });
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
//#endregion
|
|
26
|
-
export { callSignOut, signOutImpl };
|
|
27
|
-
//# sourceMappingURL=signout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signout.js","names":[],"sources":["../../../../../src/server/implementation/mutations/signout.ts"],"sourcesContent":["import { GenericId } from \"convex/values\";\nimport { ActionCtx, MutationCtx } from \"../types\";\nimport { deleteSession, getAuthSessionId } from \"../sessions\";\nimport * as Provider from \"../provider\";\nimport { authDb } from \"../db\";\nimport { AUTH_STORE_REF } from \"./store\";\n\ntype ReturnType = {\n userId: GenericId<\"user\">;\n sessionId: GenericId<\"session\">;\n} | null;\n\nexport async function signOutImpl(\n ctx: MutationCtx,\n config: Provider.Config,\n): Promise<ReturnType> {\n const db = authDb(ctx, config);\n const sessionId = await getAuthSessionId(ctx);\n if (sessionId !== null) {\n const session = await db.sessions.getById(sessionId);\n if (session !== null) {\n await deleteSession(ctx, session, config);\n return { userId: session.userId, sessionId: session._id };\n }\n }\n return null;\n}\n\nexport const callSignOut = async (ctx: ActionCtx): Promise<void> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"signOut\",\n },\n });\n};\n"],"mappings":";;;;;AAYA,eAAsB,YACpB,KACA,QACqB;CACrB,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,YAAY,MAAM,iBAAiB,IAAI;AAC7C,KAAI,cAAc,MAAM;EACtB,MAAM,UAAU,MAAM,GAAG,SAAS,QAAQ,UAAU;AACpD,MAAI,YAAY,MAAM;AACpB,SAAM,cAAc,KAAK,SAAS,OAAO;AACzC,UAAO;IAAE,QAAQ,QAAQ;IAAQ,WAAW,QAAQ;IAAK;;;AAG7D,QAAO;;AAGT,MAAa,cAAc,OAAO,QAAkC;AAClE,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM,EACJ,MAAM,WACP,EACF,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
//#region src/server/implementation/mutations/store.ts
|
|
2
|
-
/**
|
|
3
|
-
* Internal function reference for the library's store dispatch mutation.
|
|
4
|
-
*
|
|
5
|
-
* This remains string-based because the library code cannot import the
|
|
6
|
-
* consumer app's generated `internal` API module.
|
|
7
|
-
*/
|
|
8
|
-
const AUTH_STORE_REF = "auth:store";
|
|
9
|
-
|
|
10
|
-
//#endregion
|
|
11
|
-
export { AUTH_STORE_REF };
|
|
12
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","names":[],"sources":["../../../../../src/server/implementation/mutations/store.ts"],"sourcesContent":["/**\n * Internal function reference for the library's store dispatch mutation.\n *\n * This remains string-based because the library code cannot import the\n * consumer app's generated `internal` API module.\n */\nexport const AUTH_STORE_REF = \"auth:store\" as any;\n"],"mappings":";;;;;;;AAMA,MAAa,iBAAiB"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { authDb } from "../db.js";
|
|
2
|
-
import { getAuthSessionId } from "../sessions.js";
|
|
3
|
-
import { AUTH_STORE_REF } from "./store.js";
|
|
4
|
-
|
|
5
|
-
//#region src/server/implementation/mutations/verifier.ts
|
|
6
|
-
async function verifierImpl(ctx, config) {
|
|
7
|
-
const sessionId = await getAuthSessionId(ctx) ?? void 0;
|
|
8
|
-
return await authDb(ctx, config).verifiers.create(sessionId);
|
|
9
|
-
}
|
|
10
|
-
const callVerifier = async (ctx) => {
|
|
11
|
-
return ctx.runMutation(AUTH_STORE_REF, { args: { type: "verifier" } });
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
//#endregion
|
|
15
|
-
export { callVerifier, verifierImpl };
|
|
16
|
-
//# sourceMappingURL=verifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","names":[],"sources":["../../../../../src/server/implementation/mutations/verifier.ts"],"sourcesContent":["import { GenericId } from \"convex/values\";\nimport { ActionCtx, MutationCtx } from \"../types\";\nimport { getAuthSessionId } from \"../sessions\";\nimport * as Provider from \"../provider\";\nimport { authDb } from \"../db\";\nimport { AUTH_STORE_REF } from \"./store\";\n\ntype ReturnType = GenericId<\"verifier\">;\n\nexport async function verifierImpl(\n ctx: MutationCtx,\n config: Provider.Config,\n): Promise<ReturnType> {\n const sessionId = (await getAuthSessionId(ctx)) ?? undefined;\n return (await authDb(ctx, config).verifiers.create(sessionId)) as ReturnType;\n}\n\nexport const callVerifier = async (ctx: ActionCtx): Promise<ReturnType> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"verifier\",\n },\n });\n};\n"],"mappings":";;;;;AASA,eAAsB,aACpB,KACA,QACqB;CACrB,MAAM,YAAa,MAAM,iBAAiB,IAAI,IAAK;AACnD,QAAQ,MAAM,OAAO,KAAK,OAAO,CAAC,UAAU,OAAO,UAAU;;AAG/D,MAAa,eAAe,OAAO,QAAwC;AACzE,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM,EACJ,MAAM,YACP,EACF,CAAC"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { LOG_LEVELS, logWithLevel, sha256 } from "../utils.js";
|
|
2
|
-
import { authDb } from "../db.js";
|
|
3
|
-
import { createNewAndDeleteExistingSession, getAuthSessionId, maybeGenerateTokensForSession } from "../sessions.js";
|
|
4
|
-
import { AUTH_STORE_REF } from "./store.js";
|
|
5
|
-
import { isSignInRateLimited, recordFailedSignIn, resetSignInRateLimit } from "../ratelimit.js";
|
|
6
|
-
import { upsertUserAndAccount } from "../users.js";
|
|
7
|
-
import { v } from "convex/values";
|
|
8
|
-
|
|
9
|
-
//#region src/server/implementation/mutations/verify.ts
|
|
10
|
-
const verifyCodeAndSignInArgs = v.object({
|
|
11
|
-
params: v.any(),
|
|
12
|
-
provider: v.optional(v.string()),
|
|
13
|
-
verifier: v.optional(v.string()),
|
|
14
|
-
generateTokens: v.boolean(),
|
|
15
|
-
allowExtraProviders: v.boolean()
|
|
16
|
-
});
|
|
17
|
-
async function verifyCodeAndSignInImpl(ctx, args, getProviderOrThrow, config) {
|
|
18
|
-
logWithLevel(LOG_LEVELS.DEBUG, "verifyCodeAndSignInImpl args:", {
|
|
19
|
-
params: {
|
|
20
|
-
email: args.params.email,
|
|
21
|
-
phone: args.params.phone
|
|
22
|
-
},
|
|
23
|
-
provider: args.provider,
|
|
24
|
-
verifier: args.verifier,
|
|
25
|
-
generateTokens: args.generateTokens,
|
|
26
|
-
allowExtraProviders: args.allowExtraProviders
|
|
27
|
-
});
|
|
28
|
-
const { generateTokens, provider, allowExtraProviders } = args;
|
|
29
|
-
const identifier = args.params.email ?? args.params.phone;
|
|
30
|
-
if (identifier !== void 0) {
|
|
31
|
-
if (await isSignInRateLimited(ctx, identifier, config)) {
|
|
32
|
-
logWithLevel(LOG_LEVELS.ERROR, "Too many failed attempts to verify code for this email");
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const verifyResult = await verifyCodeOnly(ctx, args, provider ?? null, getProviderOrThrow, allowExtraProviders, config, await getAuthSessionId(ctx));
|
|
37
|
-
if (verifyResult === null) {
|
|
38
|
-
if (identifier !== void 0) await recordFailedSignIn(ctx, identifier, config);
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
if (identifier !== void 0) await resetSignInRateLimit(ctx, identifier, config);
|
|
42
|
-
const { userId } = verifyResult;
|
|
43
|
-
return await maybeGenerateTokensForSession(ctx, config, userId, await createNewAndDeleteExistingSession(ctx, config, userId), generateTokens);
|
|
44
|
-
}
|
|
45
|
-
const callVerifyCodeAndSignIn = async (ctx, args) => {
|
|
46
|
-
return ctx.runMutation(AUTH_STORE_REF, { args: {
|
|
47
|
-
type: "verifyCodeAndSignIn",
|
|
48
|
-
...args
|
|
49
|
-
} });
|
|
50
|
-
};
|
|
51
|
-
async function verifyCodeOnly(ctx, args, methodProviderId, getProviderOrThrow, allowExtraProviders, config, sessionId) {
|
|
52
|
-
const db = authDb(ctx, config);
|
|
53
|
-
const { params, verifier } = args;
|
|
54
|
-
const codeHash = await sha256(params.code);
|
|
55
|
-
const verificationCode = await db.verificationCodes.getByCode(codeHash);
|
|
56
|
-
if (verificationCode === null) {
|
|
57
|
-
logWithLevel(LOG_LEVELS.ERROR, "Invalid verification code");
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
await db.verificationCodes.delete(verificationCode._id);
|
|
61
|
-
if (verificationCode.verifier !== verifier) {
|
|
62
|
-
logWithLevel(LOG_LEVELS.ERROR, "Invalid verifier");
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
if (verificationCode.expirationTime < Date.now()) {
|
|
66
|
-
logWithLevel(LOG_LEVELS.ERROR, "Expired verification code");
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
const { accountId, emailVerified, phoneVerified } = verificationCode;
|
|
70
|
-
const account = await db.accounts.getById(accountId);
|
|
71
|
-
if (account === null) {
|
|
72
|
-
logWithLevel(LOG_LEVELS.ERROR, "Account associated with this email has been deleted");
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
if (methodProviderId !== null && verificationCode.provider !== methodProviderId) {
|
|
76
|
-
logWithLevel(LOG_LEVELS.ERROR, `Invalid provider "${methodProviderId}" for given \`code\`, which was generated by provider "${verificationCode.provider}"`);
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const methodProvider = getProviderOrThrow(verificationCode.provider, allowExtraProviders);
|
|
80
|
-
if (methodProvider !== null && (methodProvider.type === "email" || methodProvider.type === "phone") && methodProvider.authorize !== void 0) await methodProvider.authorize(args.params, account);
|
|
81
|
-
let userId = account.userId;
|
|
82
|
-
const provider = getProviderOrThrow(account.provider);
|
|
83
|
-
if (provider.type !== "oauth") ({userId} = await upsertUserAndAccount(ctx, sessionId, { existingAccount: account }, {
|
|
84
|
-
type: "verification",
|
|
85
|
-
provider,
|
|
86
|
-
profile: {
|
|
87
|
-
...emailVerified !== void 0 ? {
|
|
88
|
-
email: emailVerified,
|
|
89
|
-
emailVerified: true
|
|
90
|
-
} : {},
|
|
91
|
-
...phoneVerified !== void 0 ? {
|
|
92
|
-
phone: phoneVerified,
|
|
93
|
-
phoneVerified: true
|
|
94
|
-
} : {}
|
|
95
|
-
}
|
|
96
|
-
}, config));
|
|
97
|
-
return {
|
|
98
|
-
providerAccountId: account.providerAccountId,
|
|
99
|
-
userId
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
//#endregion
|
|
104
|
-
export { callVerifyCodeAndSignIn, verifyCodeAndSignInArgs, verifyCodeAndSignInImpl };
|
|
105
|
-
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","names":[],"sources":["../../../../../src/server/implementation/mutations/verify.ts"],"sourcesContent":["import { GenericId, Infer, v } from \"convex/values\";\nimport { ActionCtx, MutationCtx, SessionInfo } from \"../types\";\nimport {\n isSignInRateLimited,\n recordFailedSignIn,\n resetSignInRateLimit,\n} from \"../ratelimit\";\nimport * as Provider from \"../provider\";\nimport {\n createNewAndDeleteExistingSession,\n getAuthSessionId,\n maybeGenerateTokensForSession,\n} from \"../sessions\";\nimport { ConvexAuthConfig } from \"../../types\";\nimport { LOG_LEVELS, logWithLevel, sha256 } from \"../utils\";\nimport { upsertUserAndAccount } from \"../users\";\nimport { authDb } from \"../db\";\nimport { AUTH_STORE_REF } from \"./store\";\n\nexport const verifyCodeAndSignInArgs = v.object({\n params: v.any(),\n provider: v.optional(v.string()),\n verifier: v.optional(v.string()),\n generateTokens: v.boolean(),\n allowExtraProviders: v.boolean(),\n});\n\ntype ReturnType = null | SessionInfo;\n\nexport async function verifyCodeAndSignInImpl(\n ctx: MutationCtx,\n args: Infer<typeof verifyCodeAndSignInArgs>,\n getProviderOrThrow: Provider.GetProviderOrThrowFunc,\n config: Provider.Config,\n): Promise<ReturnType> {\n logWithLevel(LOG_LEVELS.DEBUG, \"verifyCodeAndSignInImpl args:\", {\n params: { email: args.params.email, phone: args.params.phone },\n provider: args.provider,\n verifier: args.verifier,\n generateTokens: args.generateTokens,\n allowExtraProviders: args.allowExtraProviders,\n });\n const { generateTokens, provider, allowExtraProviders } = args;\n const identifier = args.params.email ?? args.params.phone;\n if (identifier !== undefined) {\n if (await isSignInRateLimited(ctx, identifier, config)) {\n logWithLevel(\n LOG_LEVELS.ERROR,\n \"Too many failed attempts to verify code for this email\",\n );\n return null;\n }\n }\n const verifyResult = await verifyCodeOnly(\n ctx,\n args,\n provider ?? null,\n getProviderOrThrow,\n allowExtraProviders,\n config,\n await getAuthSessionId(ctx),\n );\n if (verifyResult === null) {\n if (identifier !== undefined) {\n await recordFailedSignIn(ctx, identifier, config);\n }\n return null;\n }\n if (identifier !== undefined) {\n await resetSignInRateLimit(ctx, identifier, config);\n }\n const { userId } = verifyResult;\n const sessionId = await createNewAndDeleteExistingSession(\n ctx,\n config,\n userId,\n );\n return await maybeGenerateTokensForSession(\n ctx,\n config,\n userId,\n sessionId,\n generateTokens,\n );\n}\n\nexport const callVerifyCodeAndSignIn = async (\n ctx: ActionCtx,\n args: Infer<typeof verifyCodeAndSignInArgs>,\n): Promise<ReturnType> => {\n return ctx.runMutation(AUTH_STORE_REF, {\n args: {\n type: \"verifyCodeAndSignIn\",\n ...args,\n },\n });\n};\n\nasync function verifyCodeOnly(\n ctx: MutationCtx,\n args: {\n params: any;\n verifier?: string;\n identifier?: string;\n },\n /**\n * There are two providers at play:\n * 1. the provider that generated the code\n * 2. the provider the account is tied to.\n * This is because we allow signing into an account\n * via another provider, see {@link signInViaProvider}.\n * This is the first provider.\n */\n methodProviderId: string | null,\n getProviderOrThrow: Provider.GetProviderOrThrowFunc,\n allowExtraProviders: boolean,\n config: ConvexAuthConfig,\n sessionId: GenericId<\"session\"> | null,\n) {\n const db = authDb(ctx, config);\n const { params, verifier } = args;\n const codeHash = await sha256(params.code);\n const verificationCode = await db.verificationCodes.getByCode(codeHash);\n if (verificationCode === null) {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid verification code\");\n return null;\n }\n await db.verificationCodes.delete(verificationCode._id);\n if (verificationCode.verifier !== verifier) {\n logWithLevel(LOG_LEVELS.ERROR, \"Invalid verifier\");\n return null;\n }\n if (verificationCode.expirationTime < Date.now()) {\n logWithLevel(LOG_LEVELS.ERROR, \"Expired verification code\");\n return null;\n }\n const { accountId, emailVerified, phoneVerified } = verificationCode;\n const account = await db.accounts.getById(accountId);\n if (account === null) {\n logWithLevel(\n LOG_LEVELS.ERROR,\n \"Account associated with this email has been deleted\",\n );\n return null;\n }\n if (\n methodProviderId !== null &&\n verificationCode.provider !== methodProviderId\n ) {\n logWithLevel(\n LOG_LEVELS.ERROR,\n `Invalid provider \"${methodProviderId}\" for given \\`code\\`, ` +\n `which was generated by provider \"${verificationCode.provider}\"`,\n );\n return null;\n }\n // OTP providers perform an additional check against the provided\n // params.\n const methodProvider = getProviderOrThrow(\n verificationCode.provider,\n allowExtraProviders,\n );\n if (\n methodProvider !== null &&\n (methodProvider.type === \"email\" || methodProvider.type === \"phone\") &&\n methodProvider.authorize !== undefined\n ) {\n await methodProvider.authorize(args.params, account);\n }\n let userId = account.userId;\n const provider = getProviderOrThrow(account.provider);\n if (provider.type !== \"oauth\") {\n ({ userId } = await upsertUserAndAccount(\n ctx,\n sessionId,\n { existingAccount: account },\n {\n type: \"verification\",\n provider,\n profile: {\n ...(emailVerified !== undefined\n ? { email: emailVerified, emailVerified: true }\n : {}),\n ...(phoneVerified !== undefined\n ? { phone: phoneVerified, phoneVerified: true }\n : {}),\n },\n },\n config,\n ));\n }\n\n return { providerAccountId: account.providerAccountId, userId };\n}\n"],"mappings":";;;;;;;;;AAmBA,MAAa,0BAA0B,EAAE,OAAO;CAC9C,QAAQ,EAAE,KAAK;CACf,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;CAChC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;CAChC,gBAAgB,EAAE,SAAS;CAC3B,qBAAqB,EAAE,SAAS;CACjC,CAAC;AAIF,eAAsB,wBACpB,KACA,MACA,oBACA,QACqB;AACrB,cAAa,WAAW,OAAO,iCAAiC;EAC9D,QAAQ;GAAE,OAAO,KAAK,OAAO;GAAO,OAAO,KAAK,OAAO;GAAO;EAC9D,UAAU,KAAK;EACf,UAAU,KAAK;EACf,gBAAgB,KAAK;EACrB,qBAAqB,KAAK;EAC3B,CAAC;CACF,MAAM,EAAE,gBAAgB,UAAU,wBAAwB;CAC1D,MAAM,aAAa,KAAK,OAAO,SAAS,KAAK,OAAO;AACpD,KAAI,eAAe,QACjB;MAAI,MAAM,oBAAoB,KAAK,YAAY,OAAO,EAAE;AACtD,gBACE,WAAW,OACX,yDACD;AACD,UAAO;;;CAGX,MAAM,eAAe,MAAM,eACzB,KACA,MACA,YAAY,MACZ,oBACA,qBACA,QACA,MAAM,iBAAiB,IAAI,CAC5B;AACD,KAAI,iBAAiB,MAAM;AACzB,MAAI,eAAe,OACjB,OAAM,mBAAmB,KAAK,YAAY,OAAO;AAEnD,SAAO;;AAET,KAAI,eAAe,OACjB,OAAM,qBAAqB,KAAK,YAAY,OAAO;CAErD,MAAM,EAAE,WAAW;AAMnB,QAAO,MAAM,8BACX,KACA,QACA,QARgB,MAAM,kCACtB,KACA,QACA,OACD,EAMC,eACD;;AAGH,MAAa,0BAA0B,OACrC,KACA,SACwB;AACxB,QAAO,IAAI,YAAY,gBAAgB,EACrC,MAAM;EACJ,MAAM;EACN,GAAG;EACJ,EACF,CAAC;;AAGJ,eAAe,eACb,KACA,MAaA,kBACA,oBACA,qBACA,QACA,WACA;CACA,MAAM,KAAK,OAAO,KAAK,OAAO;CAC9B,MAAM,EAAE,QAAQ,aAAa;CAC7B,MAAM,WAAW,MAAM,OAAO,OAAO,KAAK;CAC1C,MAAM,mBAAmB,MAAM,GAAG,kBAAkB,UAAU,SAAS;AACvE,KAAI,qBAAqB,MAAM;AAC7B,eAAa,WAAW,OAAO,4BAA4B;AAC3D,SAAO;;AAET,OAAM,GAAG,kBAAkB,OAAO,iBAAiB,IAAI;AACvD,KAAI,iBAAiB,aAAa,UAAU;AAC1C,eAAa,WAAW,OAAO,mBAAmB;AAClD,SAAO;;AAET,KAAI,iBAAiB,iBAAiB,KAAK,KAAK,EAAE;AAChD,eAAa,WAAW,OAAO,4BAA4B;AAC3D,SAAO;;CAET,MAAM,EAAE,WAAW,eAAe,kBAAkB;CACpD,MAAM,UAAU,MAAM,GAAG,SAAS,QAAQ,UAAU;AACpD,KAAI,YAAY,MAAM;AACpB,eACE,WAAW,OACX,sDACD;AACD,SAAO;;AAET,KACE,qBAAqB,QACrB,iBAAiB,aAAa,kBAC9B;AACA,eACE,WAAW,OACX,qBAAqB,iBAAiB,yDACA,iBAAiB,SAAS,GACjE;AACD,SAAO;;CAIT,MAAM,iBAAiB,mBACrB,iBAAiB,UACjB,oBACD;AACD,KACE,mBAAmB,SAClB,eAAe,SAAS,WAAW,eAAe,SAAS,YAC5D,eAAe,cAAc,OAE7B,OAAM,eAAe,UAAU,KAAK,QAAQ,QAAQ;CAEtD,IAAI,SAAS,QAAQ;CACrB,MAAM,WAAW,mBAAmB,QAAQ,SAAS;AACrD,KAAI,SAAS,SAAS,QACpB,EAAC,CAAE,UAAW,MAAM,qBAClB,KACA,WACA,EAAE,iBAAiB,SAAS,EAC5B;EACE,MAAM;EACN;EACA,SAAS;GACP,GAAI,kBAAkB,SAClB;IAAE,OAAO;IAAe,eAAe;IAAM,GAC7C,EAAE;GACN,GAAI,kBAAkB,SAClB;IAAE,OAAO;IAAe,eAAe;IAAM,GAC7C,EAAE;GACP;EACF,EACD,OACD;AAGH,QAAO;EAAE,mBAAmB,QAAQ;EAAmB;EAAQ"}
|
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
import { throwAuthError } from "../errors.js";
|
|
2
|
-
import { authDb } from "./db.js";
|
|
3
|
-
import { callSignIn } from "./mutations/signin.js";
|
|
4
|
-
import { callVerifierSignature } from "./mutations/signature.js";
|
|
5
|
-
import { callVerifier } from "./mutations/verifier.js";
|
|
6
|
-
import { mutatePasskeyInsert, mutatePasskeyUpdateCounter, mutateVerifierDelete, queryPasskeyByCredentialId, queryPasskeysByUserId, queryUserById, queryUserByVerifiedEmail, queryVerifierById } from "./types.js";
|
|
7
|
-
import { sha256 } from "@oslojs/crypto/sha2";
|
|
8
|
-
import { decodeBase64urlIgnorePadding, encodeBase64urlNoPadding } from "@oslojs/encoding";
|
|
9
|
-
import { COSEKeyType, ClientDataType, coseAlgorithmES256, coseAlgorithmRS256, createAssertionSignatureMessage, parseAttestationObject, parseAuthenticatorData, parseClientDataJSON } from "@oslojs/webauthn";
|
|
10
|
-
import { decodePKIXECDSASignature, decodeSEC1PublicKey, p256, verifyECDSASignature } from "@oslojs/crypto/ecdsa";
|
|
11
|
-
import { RSAPublicKey, decodePKCS1RSAPublicKey, sha256ObjectIdentifier, verifyRSASSAPKCS1v15Signature } from "@oslojs/crypto/rsa";
|
|
12
|
-
|
|
13
|
-
//#region src/server/implementation/passkey.ts
|
|
14
|
-
/**
|
|
15
|
-
* Server-side WebAuthn ceremony logic for passkey authentication.
|
|
16
|
-
*
|
|
17
|
-
* Handles the four phases of the WebAuthn flow:
|
|
18
|
-
* 1. register-options — generate PublicKeyCredentialCreationOptions
|
|
19
|
-
* 2. register-verify — verify attestation and store credential
|
|
20
|
-
* 3. auth-options — generate PublicKeyCredentialRequestOptions
|
|
21
|
-
* 4. auth-verify — verify assertion signature and sign in
|
|
22
|
-
*
|
|
23
|
-
* Uses `@oslojs/webauthn` for attestation/assertion parsing and
|
|
24
|
-
* `@oslojs/crypto` for signature verification.
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* Resolve passkey relying party options from provider config and environment.
|
|
28
|
-
*/
|
|
29
|
-
function resolveRpOptions(provider) {
|
|
30
|
-
const siteUrl = process.env.SITE_URL;
|
|
31
|
-
if (!siteUrl && !provider.options.rpId) throwAuthError("PASSKEY_MISSING_CONFIG", "Passkey provider requires SITE_URL env var (your frontend URL) or explicit rpId / origin in the provider config. CONVEX_SITE_URL cannot be used because WebAuthn RP ID must match the frontend domain.");
|
|
32
|
-
const siteHostname = siteUrl ? new URL(siteUrl).hostname : void 0;
|
|
33
|
-
return {
|
|
34
|
-
rpName: provider.options.rpName ?? siteHostname ?? "localhost",
|
|
35
|
-
rpId: provider.options.rpId ?? siteHostname ?? "localhost",
|
|
36
|
-
origin: provider.options.origin ?? siteUrl ?? "http://localhost",
|
|
37
|
-
attestation: provider.options.attestation ?? "none",
|
|
38
|
-
userVerification: provider.options.userVerification ?? "required",
|
|
39
|
-
residentKey: provider.options.residentKey ?? "preferred",
|
|
40
|
-
authenticatorAttachment: provider.options.authenticatorAttachment,
|
|
41
|
-
algorithms: provider.options.algorithms ?? [coseAlgorithmES256, coseAlgorithmRS256],
|
|
42
|
-
challengeExpirationMs: provider.options.challengeExpirationMs ?? 3e5
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Generate a cryptographically random challenge.
|
|
47
|
-
*/
|
|
48
|
-
function generateChallenge() {
|
|
49
|
-
const challenge = new Uint8Array(32);
|
|
50
|
-
crypto.getRandomValues(challenge);
|
|
51
|
-
return challenge;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Hash a challenge for storage in the verifier table's `signature` field.
|
|
55
|
-
*/
|
|
56
|
-
function hashChallenge(challenge) {
|
|
57
|
-
return encodeBase64urlNoPadding(new Uint8Array(sha256(challenge)));
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Phase 1: Generate registration options.
|
|
61
|
-
*
|
|
62
|
-
* Requires an authenticated user — passkey registration always adds a
|
|
63
|
-
* credential to an existing account. The userId is taken from the
|
|
64
|
-
* current session identity.
|
|
65
|
-
*/
|
|
66
|
-
async function handleRegisterOptions(ctx, provider, params) {
|
|
67
|
-
const identity = await ctx.auth.getUserIdentity();
|
|
68
|
-
if (identity === null) throwAuthError("PASSKEY_AUTH_REQUIRED");
|
|
69
|
-
const [userId] = identity.subject.split("|");
|
|
70
|
-
const rp = resolveRpOptions(provider);
|
|
71
|
-
const challenge = generateChallenge();
|
|
72
|
-
const challengeHash = hashChallenge(challenge);
|
|
73
|
-
const verifier = await callVerifier(ctx);
|
|
74
|
-
await callVerifierSignature(ctx, {
|
|
75
|
-
verifier,
|
|
76
|
-
signature: challengeHash
|
|
77
|
-
});
|
|
78
|
-
const user = await queryUserById(ctx, userId);
|
|
79
|
-
const userName = params.userName ?? user?.email ?? "user";
|
|
80
|
-
const userDisplayName = params.userDisplayName ?? user?.name ?? userName;
|
|
81
|
-
const excludeCredentials = (await queryPasskeysByUserId(ctx, userId)).map((pk) => ({
|
|
82
|
-
id: pk.credentialId,
|
|
83
|
-
transports: pk.transports
|
|
84
|
-
}));
|
|
85
|
-
const userHandle = encodeBase64urlNoPadding(new TextEncoder().encode(userId));
|
|
86
|
-
return {
|
|
87
|
-
kind: "passkeyOptions",
|
|
88
|
-
options: {
|
|
89
|
-
rp: {
|
|
90
|
-
name: rp.rpName,
|
|
91
|
-
id: rp.rpId
|
|
92
|
-
},
|
|
93
|
-
user: {
|
|
94
|
-
id: userHandle,
|
|
95
|
-
name: userName,
|
|
96
|
-
displayName: userDisplayName
|
|
97
|
-
},
|
|
98
|
-
challenge: encodeBase64urlNoPadding(challenge),
|
|
99
|
-
pubKeyCredParams: rp.algorithms.map((alg) => ({
|
|
100
|
-
type: "public-key",
|
|
101
|
-
alg
|
|
102
|
-
})),
|
|
103
|
-
timeout: rp.challengeExpirationMs,
|
|
104
|
-
attestation: rp.attestation,
|
|
105
|
-
authenticatorSelection: {
|
|
106
|
-
residentKey: rp.residentKey,
|
|
107
|
-
requireResidentKey: rp.residentKey === "required",
|
|
108
|
-
userVerification: rp.userVerification,
|
|
109
|
-
...rp.authenticatorAttachment ? { authenticatorAttachment: rp.authenticatorAttachment } : {}
|
|
110
|
-
},
|
|
111
|
-
excludeCredentials
|
|
112
|
-
},
|
|
113
|
-
verifier
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Phase 2: Verify registration attestation and store the credential.
|
|
118
|
-
*
|
|
119
|
-
* Requires an authenticated user. Parses the attestation, verifies the
|
|
120
|
-
* challenge, extracts the public key, creates an account + passkey record
|
|
121
|
-
* linked to the current user, and returns auth tokens.
|
|
122
|
-
*/
|
|
123
|
-
async function handleRegisterVerify(ctx, provider, params, verifierValue) {
|
|
124
|
-
const identity = await ctx.auth.getUserIdentity();
|
|
125
|
-
if (identity === null) throwAuthError("PASSKEY_AUTH_REQUIRED");
|
|
126
|
-
const [userId] = identity.subject.split("|");
|
|
127
|
-
const rp = resolveRpOptions(provider);
|
|
128
|
-
if (!verifierValue) throwAuthError("PASSKEY_MISSING_VERIFIER");
|
|
129
|
-
const clientData = parseClientDataJSON(decodeBase64urlIgnorePadding(params.clientDataJSON));
|
|
130
|
-
if (clientData.type !== ClientDataType.Create) throwAuthError("PASSKEY_INVALID_CLIENT_DATA", "Invalid client data type: expected webauthn.create");
|
|
131
|
-
const allowedOrigins = Array.isArray(rp.origin) ? rp.origin : [rp.origin];
|
|
132
|
-
if (!allowedOrigins.includes(clientData.origin)) throwAuthError("PASSKEY_INVALID_ORIGIN", `Invalid origin: ${clientData.origin}, expected one of: ${allowedOrigins.join(", ")}`);
|
|
133
|
-
const challengeHash = encodeBase64urlNoPadding(new Uint8Array(sha256(clientData.challenge)));
|
|
134
|
-
const verifierDoc = await queryVerifierById(ctx, verifierValue);
|
|
135
|
-
if (!verifierDoc || verifierDoc.signature !== challengeHash) throwAuthError("PASSKEY_INVALID_CHALLENGE");
|
|
136
|
-
await mutateVerifierDelete(ctx, verifierValue);
|
|
137
|
-
const authenticatorData = parseAttestationObject(decodeBase64urlIgnorePadding(params.attestationObject)).authenticatorData;
|
|
138
|
-
if (!authenticatorData.verifyRelyingPartyIdHash(rp.rpId)) throwAuthError("PASSKEY_RP_MISMATCH");
|
|
139
|
-
if (!authenticatorData.userPresent) throwAuthError("PASSKEY_USER_PRESENCE");
|
|
140
|
-
if (rp.userVerification === "required" && !authenticatorData.userVerified) throwAuthError("PASSKEY_USER_VERIFICATION");
|
|
141
|
-
const credential = authenticatorData.credential;
|
|
142
|
-
if (!credential) throwAuthError("PASSKEY_NO_CREDENTIAL");
|
|
143
|
-
const credentialId = encodeBase64urlNoPadding(credential.id);
|
|
144
|
-
const publicKey = credential.publicKey;
|
|
145
|
-
let algorithm;
|
|
146
|
-
let publicKeyBytes;
|
|
147
|
-
if (publicKey.isAlgorithmDefined()) algorithm = publicKey.algorithm();
|
|
148
|
-
else {
|
|
149
|
-
const keyType = publicKey.type();
|
|
150
|
-
algorithm = keyType === COSEKeyType.EC2 ? coseAlgorithmES256 : keyType === COSEKeyType.RSA ? coseAlgorithmRS256 : coseAlgorithmES256;
|
|
151
|
-
}
|
|
152
|
-
if (algorithm === coseAlgorithmES256) {
|
|
153
|
-
const ec2 = publicKey.ec2();
|
|
154
|
-
const xBytes = bigintToBytes(ec2.x, 32);
|
|
155
|
-
const yBytes = bigintToBytes(ec2.y, 32);
|
|
156
|
-
publicKeyBytes = new Uint8Array(65);
|
|
157
|
-
publicKeyBytes[0] = 4;
|
|
158
|
-
publicKeyBytes.set(xBytes, 1);
|
|
159
|
-
publicKeyBytes.set(yBytes, 33);
|
|
160
|
-
} else if (algorithm === coseAlgorithmRS256) {
|
|
161
|
-
const rsa = publicKey.rsa();
|
|
162
|
-
publicKeyBytes = new RSAPublicKey(rsa.n, rsa.e).encodePKCS1();
|
|
163
|
-
} else throwAuthError("PASSKEY_UNSUPPORTED_ALGORITHM", `Unsupported algorithm: ${algorithm}`);
|
|
164
|
-
const deviceType = params.deviceType ?? "single-device";
|
|
165
|
-
const backedUp = params.backedUp ?? false;
|
|
166
|
-
await authDb(ctx, ctx.auth.config).accounts.create({
|
|
167
|
-
userId,
|
|
168
|
-
provider: provider.id,
|
|
169
|
-
providerAccountId: credentialId
|
|
170
|
-
});
|
|
171
|
-
await mutatePasskeyInsert(ctx, {
|
|
172
|
-
userId,
|
|
173
|
-
credentialId,
|
|
174
|
-
publicKey: publicKeyBytes.buffer.slice(publicKeyBytes.byteOffset, publicKeyBytes.byteOffset + publicKeyBytes.byteLength),
|
|
175
|
-
algorithm,
|
|
176
|
-
counter: authenticatorData.signatureCounter,
|
|
177
|
-
transports: params.transports,
|
|
178
|
-
deviceType,
|
|
179
|
-
backedUp,
|
|
180
|
-
name: params.passkeyName,
|
|
181
|
-
createdAt: Date.now()
|
|
182
|
-
});
|
|
183
|
-
return {
|
|
184
|
-
kind: "signedIn",
|
|
185
|
-
signedIn: await callSignIn(ctx, {
|
|
186
|
-
userId,
|
|
187
|
-
generateTokens: true
|
|
188
|
-
})
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Phase 3: Generate authentication options.
|
|
193
|
-
*
|
|
194
|
-
* Creates a challenge and returns PublicKeyCredentialRequestOptions.
|
|
195
|
-
* If an email is provided, scopes allowCredentials to that user's passkeys.
|
|
196
|
-
*/
|
|
197
|
-
async function handleAuthOptions(ctx, provider, params) {
|
|
198
|
-
const rp = resolveRpOptions(provider);
|
|
199
|
-
const challenge = generateChallenge();
|
|
200
|
-
const challengeHash = hashChallenge(challenge);
|
|
201
|
-
const verifier = await callVerifier(ctx);
|
|
202
|
-
await callVerifierSignature(ctx, {
|
|
203
|
-
verifier,
|
|
204
|
-
signature: challengeHash
|
|
205
|
-
});
|
|
206
|
-
let allowCredentials;
|
|
207
|
-
if (params.email) {
|
|
208
|
-
const user = await queryUserByVerifiedEmail(ctx, params.email);
|
|
209
|
-
if (user) {
|
|
210
|
-
const passkeys = await queryPasskeysByUserId(ctx, user._id);
|
|
211
|
-
if (passkeys.length > 0) allowCredentials = passkeys.map((pk) => ({
|
|
212
|
-
type: "public-key",
|
|
213
|
-
id: pk.credentialId,
|
|
214
|
-
transports: pk.transports
|
|
215
|
-
}));
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
const options = {
|
|
219
|
-
challenge: encodeBase64urlNoPadding(challenge),
|
|
220
|
-
timeout: rp.challengeExpirationMs,
|
|
221
|
-
rpId: rp.rpId,
|
|
222
|
-
userVerification: rp.userVerification
|
|
223
|
-
};
|
|
224
|
-
if (allowCredentials) options.allowCredentials = allowCredentials;
|
|
225
|
-
return {
|
|
226
|
-
kind: "passkeyOptions",
|
|
227
|
-
options,
|
|
228
|
-
verifier
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Phase 4: Verify authentication assertion and sign in.
|
|
233
|
-
*
|
|
234
|
-
* Verifies the signature against the stored public key, checks the counter,
|
|
235
|
-
* and creates a session.
|
|
236
|
-
*/
|
|
237
|
-
async function handleAuthVerify(ctx, provider, params, verifierValue) {
|
|
238
|
-
const rp = resolveRpOptions(provider);
|
|
239
|
-
if (!verifierValue) throwAuthError("PASSKEY_MISSING_VERIFIER");
|
|
240
|
-
const clientDataJSON = decodeBase64urlIgnorePadding(params.clientDataJSON);
|
|
241
|
-
const clientData = parseClientDataJSON(clientDataJSON);
|
|
242
|
-
if (clientData.type !== ClientDataType.Get) throwAuthError("PASSKEY_INVALID_CLIENT_DATA", "Invalid client data type: expected webauthn.get");
|
|
243
|
-
const allowedOrigins = Array.isArray(rp.origin) ? rp.origin : [rp.origin];
|
|
244
|
-
if (!allowedOrigins.includes(clientData.origin)) throwAuthError("PASSKEY_INVALID_ORIGIN", `Invalid origin: ${clientData.origin}, expected one of: ${allowedOrigins.join(", ")}`);
|
|
245
|
-
const challengeHash = encodeBase64urlNoPadding(new Uint8Array(sha256(clientData.challenge)));
|
|
246
|
-
const verifierDoc = await queryVerifierById(ctx, verifierValue);
|
|
247
|
-
if (!verifierDoc || verifierDoc.signature !== challengeHash) throwAuthError("PASSKEY_INVALID_CHALLENGE");
|
|
248
|
-
await mutateVerifierDelete(ctx, verifierValue);
|
|
249
|
-
const credentialId = params.credentialId;
|
|
250
|
-
if (!credentialId) throwAuthError("PASSKEY_UNKNOWN_CREDENTIAL", "Missing credential ID");
|
|
251
|
-
const passkey = await queryPasskeyByCredentialId(ctx, credentialId);
|
|
252
|
-
if (!passkey) throwAuthError("PASSKEY_UNKNOWN_CREDENTIAL", "Unknown credential");
|
|
253
|
-
const authenticatorDataBytes = decodeBase64urlIgnorePadding(params.authenticatorData);
|
|
254
|
-
const authenticatorData = parseAuthenticatorData(authenticatorDataBytes);
|
|
255
|
-
if (!authenticatorData.verifyRelyingPartyIdHash(rp.rpId)) throwAuthError("PASSKEY_RP_MISMATCH");
|
|
256
|
-
if (!authenticatorData.userPresent) throwAuthError("PASSKEY_USER_PRESENCE");
|
|
257
|
-
if (rp.userVerification === "required" && !authenticatorData.userVerified) throwAuthError("PASSKEY_USER_VERIFICATION");
|
|
258
|
-
const signature = decodeBase64urlIgnorePadding(params.signature);
|
|
259
|
-
const messageHash = sha256(createAssertionSignatureMessage(authenticatorDataBytes, clientDataJSON));
|
|
260
|
-
const storedPublicKeyBytes = new Uint8Array(passkey.publicKey);
|
|
261
|
-
if (passkey.algorithm === coseAlgorithmES256) {
|
|
262
|
-
if (!verifyECDSASignature(decodeSEC1PublicKey(p256, storedPublicKeyBytes), messageHash, decodePKIXECDSASignature(signature))) throwAuthError("PASSKEY_INVALID_SIGNATURE");
|
|
263
|
-
} else if (passkey.algorithm === coseAlgorithmRS256) {
|
|
264
|
-
if (!verifyRSASSAPKCS1v15Signature(decodePKCS1RSAPublicKey(storedPublicKeyBytes), sha256ObjectIdentifier, messageHash, signature)) throwAuthError("PASSKEY_INVALID_SIGNATURE");
|
|
265
|
-
} else throwAuthError("PASSKEY_UNSUPPORTED_ALGORITHM", `Unsupported algorithm: ${passkey.algorithm}`);
|
|
266
|
-
if (passkey.counter !== 0 && authenticatorData.signatureCounter !== 0 && authenticatorData.signatureCounter <= passkey.counter) throwAuthError("PASSKEY_COUNTER_ERROR");
|
|
267
|
-
await mutatePasskeyUpdateCounter(ctx, passkey._id, authenticatorData.signatureCounter, Date.now());
|
|
268
|
-
return {
|
|
269
|
-
kind: "signedIn",
|
|
270
|
-
signedIn: await callSignIn(ctx, {
|
|
271
|
-
userId: passkey.userId,
|
|
272
|
-
generateTokens: true
|
|
273
|
-
})
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Main passkey handler dispatched from signIn.ts.
|
|
278
|
-
*
|
|
279
|
-
* Routes to the appropriate phase based on `params.flow`.
|
|
280
|
-
*/
|
|
281
|
-
async function handlePasskey(ctx, provider, args) {
|
|
282
|
-
const flow = args.params?.flow;
|
|
283
|
-
if (!flow) throwAuthError("PASSKEY_MISSING_FLOW", "Missing `flow` parameter. Expected one of: register-options, register-verify, auth-options, auth-verify");
|
|
284
|
-
switch (flow) {
|
|
285
|
-
case "register-options": return handleRegisterOptions(ctx, provider, args.params ?? {});
|
|
286
|
-
case "register-verify": return handleRegisterVerify(ctx, provider, args.params ?? {}, args.verifier);
|
|
287
|
-
case "auth-options": return handleAuthOptions(ctx, provider, args.params ?? {});
|
|
288
|
-
case "auth-verify": return handleAuthVerify(ctx, provider, args.params ?? {}, args.verifier);
|
|
289
|
-
default: throwAuthError("PASSKEY_UNKNOWN_FLOW", `Unknown passkey flow: ${flow}. Expected one of: register-options, register-verify, auth-options, auth-verify`);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Convert a bigint to a fixed-size big-endian byte array.
|
|
294
|
-
*/
|
|
295
|
-
function bigintToBytes(value, length) {
|
|
296
|
-
const bytes = new Uint8Array(length);
|
|
297
|
-
let v = value;
|
|
298
|
-
for (let i = length - 1; i >= 0; i--) {
|
|
299
|
-
bytes[i] = Number(v & 255n);
|
|
300
|
-
v >>= 8n;
|
|
301
|
-
}
|
|
302
|
-
return bytes;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
//#endregion
|
|
306
|
-
export { handlePasskey };
|
|
307
|
-
//# sourceMappingURL=passkey.js.map
|