better-auth 1.2.6-beta.7 → 1.2.7-beta.1
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/dist/adapters/drizzle-adapter/index.cjs +186 -249
- package/dist/adapters/drizzle-adapter/index.d.cts +11 -49
- package/dist/adapters/drizzle-adapter/index.d.mts +11 -49
- package/dist/adapters/drizzle-adapter/index.d.ts +11 -49
- package/dist/adapters/drizzle-adapter/index.mjs +186 -249
- package/dist/adapters/index.cjs +26 -0
- package/dist/adapters/index.d.cts +17 -0
- package/dist/adapters/index.d.mts +17 -0
- package/dist/adapters/index.d.ts +17 -0
- package/dist/adapters/index.mjs +20 -0
- package/dist/adapters/kysely-adapter/index.cjs +7 -7
- package/dist/adapters/kysely-adapter/index.d.cts +17 -49
- package/dist/adapters/kysely-adapter/index.d.mts +17 -49
- package/dist/adapters/kysely-adapter/index.d.ts +17 -49
- package/dist/adapters/kysely-adapter/index.mjs +8 -8
- package/dist/adapters/memory-adapter/index.cjs +7 -8
- package/dist/adapters/memory-adapter/index.d.cts +9 -49
- package/dist/adapters/memory-adapter/index.d.mts +9 -49
- package/dist/adapters/memory-adapter/index.d.ts +9 -49
- package/dist/adapters/memory-adapter/index.mjs +8 -9
- package/dist/adapters/mongodb-adapter/index.cjs +2 -2
- package/dist/adapters/mongodb-adapter/index.d.cts +4 -4
- package/dist/adapters/mongodb-adapter/index.d.mts +4 -4
- package/dist/adapters/mongodb-adapter/index.d.ts +4 -4
- package/dist/adapters/mongodb-adapter/index.mjs +3 -3
- package/dist/adapters/prisma-adapter/index.cjs +130 -203
- package/dist/adapters/prisma-adapter/index.d.cts +17 -49
- package/dist/adapters/prisma-adapter/index.d.mts +17 -49
- package/dist/adapters/prisma-adapter/index.d.ts +17 -49
- package/dist/adapters/prisma-adapter/index.mjs +131 -204
- package/dist/adapters/test.cjs +710 -377
- package/dist/adapters/test.d.cts +64 -5
- package/dist/adapters/test.d.mts +64 -5
- package/dist/adapters/test.d.ts +64 -5
- package/dist/adapters/test.mjs +712 -380
- package/dist/api/index.cjs +61 -25
- package/dist/api/index.d.cts +3 -3
- package/dist/api/index.d.mts +3 -3
- package/dist/api/index.d.ts +3 -3
- package/dist/api/index.mjs +63 -27
- package/dist/client/index.d.cts +3 -3
- package/dist/client/index.d.mts +3 -3
- package/dist/client/index.d.ts +3 -3
- package/dist/client/plugins/index.cjs +13 -15
- package/dist/client/plugins/index.d.cts +80 -19
- package/dist/client/plugins/index.d.mts +80 -19
- package/dist/client/plugins/index.d.ts +80 -19
- package/dist/client/plugins/index.mjs +13 -16
- package/dist/client/react/index.cjs +4 -4
- package/dist/client/react/index.d.cts +3 -3
- package/dist/client/react/index.d.mts +3 -3
- package/dist/client/react/index.d.ts +3 -3
- package/dist/client/solid/index.d.cts +3 -3
- package/dist/client/solid/index.d.mts +3 -3
- package/dist/client/solid/index.d.ts +3 -3
- package/dist/client/svelte/index.d.cts +3 -3
- package/dist/client/svelte/index.d.mts +3 -3
- package/dist/client/svelte/index.d.ts +3 -3
- package/dist/client/vue/index.d.cts +3 -3
- package/dist/client/vue/index.d.mts +3 -3
- package/dist/client/vue/index.d.ts +3 -3
- package/dist/cookies/index.cjs +13 -2
- package/dist/cookies/index.d.cts +3 -3
- package/dist/cookies/index.d.mts +3 -3
- package/dist/cookies/index.d.ts +3 -3
- package/dist/cookies/index.mjs +13 -2
- package/dist/db/index.cjs +6 -5
- package/dist/db/index.d.cts +4 -4
- package/dist/db/index.d.mts +4 -4
- package/dist/db/index.d.ts +4 -4
- package/dist/db/index.mjs +7 -6
- package/dist/index.cjs +11 -7
- package/dist/index.d.cts +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.mjs +14 -10
- package/dist/integrations/next-js.cjs +4 -5
- package/dist/integrations/next-js.d.cts +3 -3
- package/dist/integrations/next-js.d.mts +3 -3
- package/dist/integrations/next-js.d.ts +3 -3
- package/dist/integrations/next-js.mjs +5 -6
- package/dist/integrations/node.d.cts +3 -3
- package/dist/integrations/node.d.mts +3 -3
- package/dist/integrations/node.d.ts +3 -3
- package/dist/integrations/react-start.cjs +5 -6
- package/dist/integrations/react-start.d.cts +3 -3
- package/dist/integrations/react-start.d.mts +3 -3
- package/dist/integrations/react-start.d.ts +3 -3
- package/dist/integrations/react-start.mjs +6 -7
- package/dist/integrations/svelte-kit.d.cts +3 -3
- package/dist/integrations/svelte-kit.d.mts +3 -3
- package/dist/integrations/svelte-kit.d.ts +3 -3
- package/dist/oauth2/index.d.cts +5 -5
- package/dist/oauth2/index.d.mts +5 -5
- package/dist/oauth2/index.d.ts +5 -5
- package/dist/plugins/access/index.d.cts +1 -1
- package/dist/plugins/access/index.d.mts +1 -1
- package/dist/plugins/access/index.d.ts +1 -1
- package/dist/plugins/admin/access/index.d.cts +1 -1
- package/dist/plugins/admin/access/index.d.mts +1 -1
- package/dist/plugins/admin/access/index.d.ts +1 -1
- package/dist/plugins/admin/index.cjs +4 -4
- package/dist/plugins/admin/index.d.cts +74 -14
- package/dist/plugins/admin/index.d.mts +74 -14
- package/dist/plugins/admin/index.d.ts +74 -14
- package/dist/plugins/admin/index.mjs +5 -5
- package/dist/plugins/anonymous/index.cjs +4 -5
- package/dist/plugins/anonymous/index.d.cts +3 -3
- package/dist/plugins/anonymous/index.d.mts +3 -3
- package/dist/plugins/anonymous/index.d.ts +3 -3
- package/dist/plugins/anonymous/index.mjs +5 -6
- package/dist/plugins/bearer/index.cjs +2 -2
- package/dist/plugins/bearer/index.d.cts +3 -3
- package/dist/plugins/bearer/index.d.mts +3 -3
- package/dist/plugins/bearer/index.d.ts +3 -3
- package/dist/plugins/bearer/index.mjs +3 -3
- package/dist/plugins/captcha/index.cjs +110 -45
- package/dist/plugins/captcha/index.d.cts +26 -6
- package/dist/plugins/captcha/index.d.mts +26 -6
- package/dist/plugins/captcha/index.d.ts +26 -6
- package/dist/plugins/captcha/index.mjs +110 -45
- package/dist/plugins/custom-session/index.cjs +24 -5
- package/dist/plugins/custom-session/index.d.cts +25 -6
- package/dist/plugins/custom-session/index.d.mts +25 -6
- package/dist/plugins/custom-session/index.d.ts +25 -6
- package/dist/plugins/custom-session/index.mjs +25 -6
- package/dist/plugins/email-otp/index.cjs +96 -30
- package/dist/plugins/email-otp/index.d.cts +33 -10
- package/dist/plugins/email-otp/index.d.mts +33 -10
- package/dist/plugins/email-otp/index.d.ts +33 -10
- package/dist/plugins/email-otp/index.mjs +97 -31
- package/dist/plugins/generic-oauth/index.cjs +81 -20
- package/dist/plugins/generic-oauth/index.d.cts +46 -3
- package/dist/plugins/generic-oauth/index.d.mts +46 -3
- package/dist/plugins/generic-oauth/index.d.ts +46 -3
- package/dist/plugins/generic-oauth/index.mjs +82 -21
- package/dist/plugins/haveibeenpwned/index.cjs +98 -0
- package/dist/plugins/haveibeenpwned/index.d.cts +36 -0
- package/dist/plugins/haveibeenpwned/index.d.mts +36 -0
- package/dist/plugins/haveibeenpwned/index.d.ts +36 -0
- package/dist/plugins/haveibeenpwned/index.mjs +96 -0
- package/dist/plugins/index.cjs +583 -19
- package/dist/plugins/index.d.cts +7 -5
- package/dist/plugins/index.d.mts +7 -5
- package/dist/plugins/index.d.ts +7 -5
- package/dist/plugins/index.mjs +583 -21
- package/dist/plugins/jwt/index.cjs +45 -21
- package/dist/plugins/jwt/index.d.cts +52 -6
- package/dist/plugins/jwt/index.d.mts +52 -6
- package/dist/plugins/jwt/index.d.ts +52 -6
- package/dist/plugins/jwt/index.mjs +46 -22
- package/dist/plugins/magic-link/index.cjs +3 -3
- package/dist/plugins/magic-link/index.mjs +4 -4
- package/dist/plugins/multi-session/index.cjs +3 -3
- package/dist/plugins/multi-session/index.d.cts +3 -3
- package/dist/plugins/multi-session/index.d.mts +3 -3
- package/dist/plugins/multi-session/index.d.ts +3 -3
- package/dist/plugins/multi-session/index.mjs +4 -4
- package/dist/plugins/oauth-proxy/index.cjs +4 -4
- package/dist/plugins/oauth-proxy/index.d.cts +3 -3
- package/dist/plugins/oauth-proxy/index.d.mts +3 -3
- package/dist/plugins/oauth-proxy/index.d.ts +3 -3
- package/dist/plugins/oauth-proxy/index.mjs +5 -5
- package/dist/plugins/oidc-provider/index.cjs +227 -8
- package/dist/plugins/oidc-provider/index.d.cts +215 -3
- package/dist/plugins/oidc-provider/index.d.mts +215 -3
- package/dist/plugins/oidc-provider/index.d.ts +215 -3
- package/dist/plugins/oidc-provider/index.mjs +228 -9
- package/dist/plugins/one-tap/index.cjs +5 -5
- package/dist/plugins/one-tap/index.mjs +6 -6
- package/dist/plugins/one-time-token/index.cjs +119 -0
- package/dist/plugins/one-time-token/index.d.cts +134 -0
- package/dist/plugins/one-time-token/index.d.mts +134 -0
- package/dist/plugins/one-time-token/index.d.ts +134 -0
- package/dist/plugins/one-time-token/index.mjs +117 -0
- package/dist/plugins/open-api/index.cjs +3 -3
- package/dist/plugins/open-api/index.d.cts +3 -3
- package/dist/plugins/open-api/index.d.mts +3 -3
- package/dist/plugins/open-api/index.d.ts +3 -3
- package/dist/plugins/open-api/index.mjs +4 -4
- package/dist/plugins/organization/access/index.d.cts +1 -1
- package/dist/plugins/organization/access/index.d.mts +1 -1
- package/dist/plugins/organization/access/index.d.ts +1 -1
- package/dist/plugins/organization/index.cjs +4 -4
- package/dist/plugins/organization/index.d.cts +708 -55
- package/dist/plugins/organization/index.d.mts +708 -55
- package/dist/plugins/organization/index.d.ts +708 -55
- package/dist/plugins/organization/index.mjs +5 -5
- package/dist/plugins/passkey/index.cjs +82 -8
- package/dist/plugins/passkey/index.d.cts +72 -3
- package/dist/plugins/passkey/index.d.mts +72 -3
- package/dist/plugins/passkey/index.d.ts +72 -3
- package/dist/plugins/passkey/index.mjs +83 -9
- package/dist/plugins/phone-number/index.cjs +194 -26
- package/dist/plugins/phone-number/index.d.cts +132 -8
- package/dist/plugins/phone-number/index.d.mts +132 -8
- package/dist/plugins/phone-number/index.d.ts +132 -8
- package/dist/plugins/phone-number/index.mjs +195 -27
- package/dist/plugins/sso/index.cjs +190 -7
- package/dist/plugins/sso/index.d.cts +181 -15
- package/dist/plugins/sso/index.d.mts +181 -15
- package/dist/plugins/sso/index.d.ts +181 -15
- package/dist/plugins/sso/index.mjs +191 -8
- package/dist/plugins/two-factor/index.cjs +443 -92
- package/dist/plugins/two-factor/index.d.cts +230 -396
- package/dist/plugins/two-factor/index.d.mts +230 -396
- package/dist/plugins/two-factor/index.d.ts +230 -396
- package/dist/plugins/two-factor/index.mjs +431 -80
- package/dist/plugins/username/index.cjs +34 -31
- package/dist/plugins/username/index.d.cts +15 -12
- package/dist/plugins/username/index.d.mts +15 -12
- package/dist/plugins/username/index.d.ts +15 -12
- package/dist/plugins/username/index.mjs +35 -32
- package/dist/shared/better-auth.1DR6suCQ.mjs +307 -0
- package/dist/shared/{better-auth.BSsp73pg.cjs → better-auth.B7cZ2juS.cjs} +15 -14
- package/dist/shared/{better-auth.bKwabe3I.d.mts → better-auth.B88xucNq.d.mts} +529 -39
- package/dist/shared/{better-auth.CApEjVDP.cjs → better-auth.BW8BpneG.cjs} +4 -1
- package/dist/shared/{better-auth.BiQsvaIP.d.cts → better-auth.BcU1Kjyq.d.cts} +2051 -518
- package/dist/shared/better-auth.BfG24BjZ.cjs +118 -0
- package/dist/shared/{better-auth.A3TjrU8G.mjs → better-auth.Bk5IMdhM.mjs} +32 -12
- package/dist/shared/{better-auth.D9VnBkRI.mjs → better-auth.Bm9HxIzE.mjs} +47 -24
- package/dist/shared/{better-auth.BRf6Iynu.d.ts → better-auth.Bwc-6kOr.d.ts} +1 -1
- package/dist/shared/{better-auth.D-oLmHIj.d.mts → better-auth.CA2hFK4N.d.ts} +2051 -518
- package/dist/shared/{better-auth.Dmhe30iW.d.mts → better-auth.CGukGrxT.d.cts} +1 -1
- package/dist/shared/{better-auth.CsSpq0zL.cjs → better-auth.CHUzBidy.cjs} +46 -23
- package/dist/shared/{better-auth.DWRligF8.d.cts → better-auth.CT9J6rD-.d.cts} +539 -7
- package/dist/shared/better-auth.CVCo5Z2T.cjs +310 -0
- package/dist/shared/{better-auth.D4jH-sJA.mjs → better-auth.CWwVo_61.mjs} +458 -118
- package/dist/shared/{better-auth.Bi8FQwDD.d.cts → better-auth.CYegVoq1.d.cts} +1 -1
- package/dist/shared/{better-auth.Bi8FQwDD.d.mts → better-auth.CYegVoq1.d.mts} +1 -1
- package/dist/shared/{better-auth.Bi8FQwDD.d.ts → better-auth.CYegVoq1.d.ts} +1 -1
- package/dist/shared/{better-auth.CepcSj5H.mjs → better-auth.Cc72UxUH.mjs} +1 -2
- package/dist/shared/{better-auth.BWp5dztg.d.ts → better-auth.CmN4mlPh.d.ts} +539 -7
- package/dist/shared/{better-auth.DH3YjMQH.mjs → better-auth.Cqykj82J.mjs} +1 -1
- package/dist/shared/{better-auth.wcdMj2cT.d.mts → better-auth.DIt2e3lu.d.mts} +539 -7
- package/dist/shared/{better-auth.BANAxdkL.d.ts → better-auth.DNTAFSt1.d.ts} +529 -39
- package/dist/shared/{better-auth.DU2QNVc_.d.ts → better-auth.DQ7OSJbI.d.mts} +2051 -518
- package/dist/shared/{better-auth.DLTzKoOS.cjs → better-auth.DSVbLSt7.cjs} +4 -1
- package/dist/shared/{better-auth.B2Fw1vhH.d.cts → better-auth.DTiSPWEk.d.cts} +529 -39
- package/dist/shared/better-auth.DURsStt9.mjs +116 -0
- package/dist/shared/{better-auth.BIjcZ_vt.cjs → better-auth.DYoLD99C.cjs} +31 -11
- package/dist/shared/{better-auth.CV1L7TPV.cjs → better-auth.D_ZIX1O8.cjs} +317 -47
- package/dist/shared/{better-auth.C5H9XEzZ.cjs → better-auth.DcWKCjjf.cjs} +1 -2
- package/dist/shared/{better-auth.BDYXUcLv.cjs → better-auth.Dg0siV5C.cjs} +457 -117
- package/dist/shared/better-auth.DjryM8pE.cjs +760 -0
- package/dist/shared/{better-auth.DPBQN9Fs.mjs → better-auth.Dn_Ms1Uf.mjs} +318 -48
- package/dist/shared/{better-auth.DiG4KL2x.mjs → better-auth.OuYYTHC7.mjs} +4 -1
- package/dist/shared/{better-auth.DtC8i3pf.d.cts → better-auth.S1jimRbX.d.mts} +1 -1
- package/dist/shared/better-auth.SPmq4a4z.d.mts +344 -0
- package/dist/shared/{better-auth.cOCrlspr.mjs → better-auth.bkwPl2G4.mjs} +4 -1
- package/dist/shared/better-auth.cp2rC2iM.d.ts +344 -0
- package/dist/shared/better-auth.eVy4DZvP.d.cts +344 -0
- package/dist/shared/{better-auth.BrOpzmqo.mjs → better-auth.iKoUsdFE.mjs} +15 -14
- package/dist/shared/better-auth.rSYJCd3o.mjs +758 -0
- package/dist/social-providers/index.cjs +75 -3
- package/dist/social-providers/index.d.cts +2 -2
- package/dist/social-providers/index.d.mts +2 -2
- package/dist/social-providers/index.d.ts +2 -2
- package/dist/social-providers/index.mjs +77 -6
- package/dist/types/index.d.cts +4 -4
- package/dist/types/index.d.mts +4 -4
- package/dist/types/index.d.ts +4 -4
- package/package.json +42 -5
- package/dist/chunks/server.cjs +0 -905
- package/dist/chunks/server.mjs +0 -895
- package/dist/shared/better-auth.BcoSd9tC.mjs +0 -10
- package/dist/shared/better-auth.BnRFp-t0.mjs +0 -405
- package/dist/shared/better-auth.C1-vpKly.cjs +0 -12
- package/dist/shared/better-auth.ClTSOgiD.mjs +0 -140
- package/dist/shared/better-auth.DC8JQbiE.mjs +0 -173
- package/dist/shared/better-auth.DWHWPllD.cjs +0 -175
- package/dist/shared/better-auth.DqLjzBlO.cjs +0 -408
- package/dist/shared/better-auth.m575EIBC.cjs +0 -144
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const zod = require('zod');
|
|
4
|
-
const refreshToken = require('../../shared/better-auth.
|
|
4
|
+
const refreshToken = require('../../shared/better-auth.Dg0siV5C.cjs');
|
|
5
5
|
const betterCall = require('better-call');
|
|
6
|
-
const schema$1 = require('../../shared/better-auth.
|
|
6
|
+
const schema$1 = require('../../shared/better-auth.DcWKCjjf.cjs');
|
|
7
7
|
const random = require('../../shared/better-auth.CYeOI8C-.cjs');
|
|
8
8
|
const cookies_index = require('../../cookies/index.cjs');
|
|
9
9
|
require('../../shared/better-auth.DiSjtgs9.cjs');
|
|
@@ -26,14 +26,25 @@ require('@noble/hashes/utils');
|
|
|
26
26
|
require('../../shared/better-auth.ANpbi45u.cjs');
|
|
27
27
|
require('@better-auth/utils/random');
|
|
28
28
|
require('../../shared/better-auth.QbbyHMYf.cjs');
|
|
29
|
+
require('../../shared/better-auth.D3mtHEZg.cjs');
|
|
29
30
|
require('../../shared/better-auth.Bg6iw3ig.cjs');
|
|
30
31
|
require('@better-auth/utils/hmac');
|
|
31
32
|
require('../../shared/better-auth.BMYo0QR-.cjs');
|
|
32
33
|
require('../../shared/better-auth.C-R0J0n1.cjs');
|
|
33
34
|
require('jose/errors');
|
|
34
|
-
require('../../shared/better-auth.D3mtHEZg.cjs');
|
|
35
35
|
require('@better-auth/utils/binary');
|
|
36
36
|
|
|
37
|
+
const ERROR_CODES = {
|
|
38
|
+
INVALID_PHONE_NUMBER: "Invalid phone number",
|
|
39
|
+
PHONE_NUMBER_EXIST: "Phone number already exist",
|
|
40
|
+
INVALID_PHONE_NUMBER_OR_PASSWORD: "Invalid phone number or password",
|
|
41
|
+
UNEXPECTED_ERROR: "Unexpected error",
|
|
42
|
+
OTP_NOT_FOUND: "OTP not found",
|
|
43
|
+
OTP_EXPIRED: "OTP expired",
|
|
44
|
+
INVALID_OTP: "Invalid OTP",
|
|
45
|
+
PHONE_NUMBER_NOT_VERIFIED: "Phone number not verified"
|
|
46
|
+
};
|
|
47
|
+
|
|
37
48
|
function generateOTP(size) {
|
|
38
49
|
return random.generateRandomString(size, "0-9");
|
|
39
50
|
}
|
|
@@ -47,15 +58,6 @@ const phoneNumber = (options) => {
|
|
|
47
58
|
code: "code",
|
|
48
59
|
createdAt: "createdAt"
|
|
49
60
|
};
|
|
50
|
-
const ERROR_CODES = {
|
|
51
|
-
INVALID_PHONE_NUMBER: "Invalid phone number",
|
|
52
|
-
PHONE_NUMBER_EXIST: "Phone number already exist",
|
|
53
|
-
INVALID_PHONE_NUMBER_OR_PASSWORD: "Invalid phone number or password",
|
|
54
|
-
UNEXPECTED_ERROR: "Unexpected error",
|
|
55
|
-
OTP_NOT_FOUND: "OTP not found",
|
|
56
|
-
OTP_EXPIRED: "OTP expired",
|
|
57
|
-
INVALID_OTP: "Invalid OTP"
|
|
58
|
-
};
|
|
59
61
|
return {
|
|
60
62
|
id: "phone-number",
|
|
61
63
|
endpoints: {
|
|
@@ -130,6 +132,23 @@ const phoneNumber = (options) => {
|
|
|
130
132
|
message: ERROR_CODES.INVALID_PHONE_NUMBER_OR_PASSWORD
|
|
131
133
|
});
|
|
132
134
|
}
|
|
135
|
+
if (opts.requireVerification) {
|
|
136
|
+
if (!user.phoneNumberVerified) {
|
|
137
|
+
const otp = generateOTP(opts.otpLength);
|
|
138
|
+
await ctx.context.internalAdapter.createVerificationValue({
|
|
139
|
+
value: otp,
|
|
140
|
+
identifier: phoneNumber2,
|
|
141
|
+
expiresAt: date.getDate(opts.expiresIn, "sec")
|
|
142
|
+
});
|
|
143
|
+
await opts.sendOTP?.({
|
|
144
|
+
phoneNumber: phoneNumber2,
|
|
145
|
+
code: otp
|
|
146
|
+
});
|
|
147
|
+
throw new betterCall.APIError("UNAUTHORIZED", {
|
|
148
|
+
message: ERROR_CODES.PHONE_NUMBER_NOT_VERIFIED
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
133
152
|
const accounts = await ctx.context.internalAdapter.findAccountByUserId(user.id);
|
|
134
153
|
const credentialAccount = accounts.find(
|
|
135
154
|
(a) => a.providerId === "credential"
|
|
@@ -246,7 +265,7 @@ const phoneNumber = (options) => {
|
|
|
246
265
|
}
|
|
247
266
|
const code = generateOTP(opts.otpLength);
|
|
248
267
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
249
|
-
value: code
|
|
268
|
+
value: `${code}:0`,
|
|
250
269
|
identifier: ctx.body.phoneNumber,
|
|
251
270
|
expiresAt: date.getDate(opts.expiresIn, "sec")
|
|
252
271
|
});
|
|
@@ -298,20 +317,83 @@ const phoneNumber = (options) => {
|
|
|
298
317
|
summary: "Verify phone number",
|
|
299
318
|
description: "Use this endpoint to verify phone number",
|
|
300
319
|
responses: {
|
|
301
|
-
200: {
|
|
302
|
-
description: "
|
|
320
|
+
"200": {
|
|
321
|
+
description: "Phone number verified successfully",
|
|
303
322
|
content: {
|
|
304
323
|
"application/json": {
|
|
305
324
|
schema: {
|
|
306
325
|
type: "object",
|
|
307
326
|
properties: {
|
|
308
|
-
|
|
309
|
-
|
|
327
|
+
status: {
|
|
328
|
+
type: "boolean",
|
|
329
|
+
description: "Indicates if the verification was successful",
|
|
330
|
+
enum: [true]
|
|
310
331
|
},
|
|
311
|
-
|
|
312
|
-
|
|
332
|
+
token: {
|
|
333
|
+
type: "string",
|
|
334
|
+
nullable: true,
|
|
335
|
+
description: "Session token if session is created, null if disableSession is true or no session is created"
|
|
336
|
+
},
|
|
337
|
+
user: {
|
|
338
|
+
type: "object",
|
|
339
|
+
nullable: true,
|
|
340
|
+
properties: {
|
|
341
|
+
id: {
|
|
342
|
+
type: "string",
|
|
343
|
+
description: "Unique identifier of the user"
|
|
344
|
+
},
|
|
345
|
+
email: {
|
|
346
|
+
type: "string",
|
|
347
|
+
format: "email",
|
|
348
|
+
nullable: true,
|
|
349
|
+
description: "User's email address"
|
|
350
|
+
},
|
|
351
|
+
emailVerified: {
|
|
352
|
+
type: "boolean",
|
|
353
|
+
nullable: true,
|
|
354
|
+
description: "Whether the email is verified"
|
|
355
|
+
},
|
|
356
|
+
name: {
|
|
357
|
+
type: "string",
|
|
358
|
+
nullable: true,
|
|
359
|
+
description: "User's name"
|
|
360
|
+
},
|
|
361
|
+
image: {
|
|
362
|
+
type: "string",
|
|
363
|
+
format: "uri",
|
|
364
|
+
nullable: true,
|
|
365
|
+
description: "User's profile image URL"
|
|
366
|
+
},
|
|
367
|
+
phoneNumber: {
|
|
368
|
+
type: "string",
|
|
369
|
+
description: "User's phone number"
|
|
370
|
+
},
|
|
371
|
+
phoneNumberVerified: {
|
|
372
|
+
type: "boolean",
|
|
373
|
+
description: "Whether the phone number is verified"
|
|
374
|
+
},
|
|
375
|
+
createdAt: {
|
|
376
|
+
type: "string",
|
|
377
|
+
format: "date-time",
|
|
378
|
+
description: "Timestamp when the user was created"
|
|
379
|
+
},
|
|
380
|
+
updatedAt: {
|
|
381
|
+
type: "string",
|
|
382
|
+
format: "date-time",
|
|
383
|
+
description: "Timestamp when the user was last updated"
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
required: [
|
|
387
|
+
"id",
|
|
388
|
+
"phoneNumber",
|
|
389
|
+
"phoneNumberVerified",
|
|
390
|
+
"createdAt",
|
|
391
|
+
"updatedAt"
|
|
392
|
+
],
|
|
393
|
+
description: "User object with phone number details, null if no user is created or found"
|
|
313
394
|
}
|
|
314
|
-
}
|
|
395
|
+
},
|
|
396
|
+
required: ["status"]
|
|
315
397
|
}
|
|
316
398
|
}
|
|
317
399
|
}
|
|
@@ -337,7 +419,18 @@ const phoneNumber = (options) => {
|
|
|
337
419
|
message: ERROR_CODES.OTP_NOT_FOUND
|
|
338
420
|
});
|
|
339
421
|
}
|
|
340
|
-
|
|
422
|
+
const [otpValue, attempts] = otp.value.split(":");
|
|
423
|
+
const allowedAttempts = options?.allowedAttempts || 3;
|
|
424
|
+
if (attempts && parseInt(attempts) >= allowedAttempts) {
|
|
425
|
+
await ctx.context.internalAdapter.deleteVerificationValue(otp.id);
|
|
426
|
+
throw new betterCall.APIError("FORBIDDEN", {
|
|
427
|
+
message: "Too many attempts"
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
if (otpValue !== ctx.body.code) {
|
|
431
|
+
await ctx.context.internalAdapter.updateVerificationValue(otp.id, {
|
|
432
|
+
value: `${otpValue}:${parseInt(attempts || "0") + 1}`
|
|
433
|
+
});
|
|
341
434
|
throw new betterCall.APIError("BAD_REQUEST", {
|
|
342
435
|
message: "Invalid OTP"
|
|
343
436
|
});
|
|
@@ -445,7 +538,7 @@ const phoneNumber = (options) => {
|
|
|
445
538
|
if (!ctx.body.disableSession) {
|
|
446
539
|
const session = await ctx.context.internalAdapter.createSession(
|
|
447
540
|
user.id,
|
|
448
|
-
ctx.
|
|
541
|
+
ctx.headers
|
|
449
542
|
);
|
|
450
543
|
if (!session) {
|
|
451
544
|
throw new betterCall.APIError("INTERNAL_SERVER_ERROR", {
|
|
@@ -495,7 +588,32 @@ const phoneNumber = (options) => {
|
|
|
495
588
|
method: "POST",
|
|
496
589
|
body: zod.z.object({
|
|
497
590
|
phoneNumber: zod.z.string()
|
|
498
|
-
})
|
|
591
|
+
}),
|
|
592
|
+
metadata: {
|
|
593
|
+
openapi: {
|
|
594
|
+
description: "Request OTP for password reset via phone number",
|
|
595
|
+
responses: {
|
|
596
|
+
"200": {
|
|
597
|
+
description: "OTP sent successfully for password reset",
|
|
598
|
+
content: {
|
|
599
|
+
"application/json": {
|
|
600
|
+
schema: {
|
|
601
|
+
type: "object",
|
|
602
|
+
properties: {
|
|
603
|
+
status: {
|
|
604
|
+
type: "boolean",
|
|
605
|
+
description: "Indicates if the OTP was sent successfully",
|
|
606
|
+
enum: [true]
|
|
607
|
+
}
|
|
608
|
+
},
|
|
609
|
+
required: ["status"]
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
499
617
|
},
|
|
500
618
|
async (ctx) => {
|
|
501
619
|
const user = await ctx.context.adapter.findOne({
|
|
@@ -514,7 +632,7 @@ const phoneNumber = (options) => {
|
|
|
514
632
|
}
|
|
515
633
|
const code = generateOTP(opts.otpLength);
|
|
516
634
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
517
|
-
value: code
|
|
635
|
+
value: `${code}:0`,
|
|
518
636
|
identifier: `${ctx.body.phoneNumber}-forget-password`,
|
|
519
637
|
expiresAt: date.getDate(opts.expiresIn, "sec")
|
|
520
638
|
});
|
|
@@ -538,7 +656,32 @@ const phoneNumber = (options) => {
|
|
|
538
656
|
otp: zod.z.string(),
|
|
539
657
|
phoneNumber: zod.z.string(),
|
|
540
658
|
newPassword: zod.z.string()
|
|
541
|
-
})
|
|
659
|
+
}),
|
|
660
|
+
metadata: {
|
|
661
|
+
openapi: {
|
|
662
|
+
description: "Reset password using phone number OTP",
|
|
663
|
+
responses: {
|
|
664
|
+
"200": {
|
|
665
|
+
description: "Password reset successfully",
|
|
666
|
+
content: {
|
|
667
|
+
"application/json": {
|
|
668
|
+
schema: {
|
|
669
|
+
type: "object",
|
|
670
|
+
properties: {
|
|
671
|
+
status: {
|
|
672
|
+
type: "boolean",
|
|
673
|
+
description: "Indicates if the password was reset successfully",
|
|
674
|
+
enum: [true]
|
|
675
|
+
}
|
|
676
|
+
},
|
|
677
|
+
required: ["status"]
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
542
685
|
},
|
|
543
686
|
async (ctx) => {
|
|
544
687
|
const verification = await ctx.context.internalAdapter.findVerificationValue(
|
|
@@ -554,7 +697,23 @@ const phoneNumber = (options) => {
|
|
|
554
697
|
message: ERROR_CODES.OTP_EXPIRED
|
|
555
698
|
});
|
|
556
699
|
}
|
|
557
|
-
|
|
700
|
+
const [otpValue, attempts] = verification.value.split(":");
|
|
701
|
+
const allowedAttempts = options?.allowedAttempts || 3;
|
|
702
|
+
if (attempts && parseInt(attempts) >= allowedAttempts) {
|
|
703
|
+
await ctx.context.internalAdapter.deleteVerificationValue(
|
|
704
|
+
verification.id
|
|
705
|
+
);
|
|
706
|
+
throw new betterCall.APIError("FORBIDDEN", {
|
|
707
|
+
message: "Too many attempts"
|
|
708
|
+
});
|
|
709
|
+
}
|
|
710
|
+
if (ctx.body.otp !== otpValue) {
|
|
711
|
+
await ctx.context.internalAdapter.updateVerificationValue(
|
|
712
|
+
verification.id,
|
|
713
|
+
{
|
|
714
|
+
value: `${otpValue}:${parseInt(attempts || "0") + 1}`
|
|
715
|
+
}
|
|
716
|
+
);
|
|
558
717
|
throw new betterCall.APIError("BAD_REQUEST", {
|
|
559
718
|
message: ERROR_CODES.INVALID_OTP
|
|
560
719
|
});
|
|
@@ -587,6 +746,15 @@ const phoneNumber = (options) => {
|
|
|
587
746
|
)
|
|
588
747
|
},
|
|
589
748
|
schema: schema$1.mergeSchema(schema, options?.schema),
|
|
749
|
+
rateLimit: [
|
|
750
|
+
{
|
|
751
|
+
pathMatcher(path) {
|
|
752
|
+
return path.startsWith("/phone-number");
|
|
753
|
+
},
|
|
754
|
+
window: 60 * 1e3,
|
|
755
|
+
max: 10
|
|
756
|
+
}
|
|
757
|
+
],
|
|
590
758
|
$ERROR_CODES: ERROR_CODES
|
|
591
759
|
};
|
|
592
760
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as better_call from 'better-call';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { U as User, I as InferOptionSchema } from '../../shared/better-auth.
|
|
4
|
-
import '../../shared/better-auth.
|
|
5
|
-
import '../../shared/better-auth.
|
|
3
|
+
import { U as User, I as InferOptionSchema } from '../../shared/better-auth.BcU1Kjyq.cjs';
|
|
4
|
+
import '../../shared/better-auth.CYegVoq1.cjs';
|
|
5
|
+
import '../../shared/better-auth.DTiSPWEk.cjs';
|
|
6
6
|
import 'jose';
|
|
7
7
|
import 'kysely';
|
|
8
8
|
import 'better-sqlite3';
|
|
@@ -50,6 +50,12 @@ interface PhoneNumberOptions {
|
|
|
50
50
|
* by default any string is accepted
|
|
51
51
|
*/
|
|
52
52
|
phoneNumberValidator?: (phoneNumber: string) => boolean | Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Require a phone number verification before signing in
|
|
55
|
+
*
|
|
56
|
+
* @default false
|
|
57
|
+
*/
|
|
58
|
+
requireVerification?: boolean;
|
|
53
59
|
/**
|
|
54
60
|
* Callback when phone number is verified
|
|
55
61
|
*/
|
|
@@ -89,6 +95,11 @@ interface PhoneNumberOptions {
|
|
|
89
95
|
* Custom schema for the admin plugin
|
|
90
96
|
*/
|
|
91
97
|
schema?: InferOptionSchema<typeof schema>;
|
|
98
|
+
/**
|
|
99
|
+
* Allowed attempts for the OTP code
|
|
100
|
+
* @default 3
|
|
101
|
+
*/
|
|
102
|
+
allowedAttempts?: number;
|
|
92
103
|
}
|
|
93
104
|
declare const phoneNumber: (options?: PhoneNumberOptions) => {
|
|
94
105
|
id: "phone-number";
|
|
@@ -329,20 +340,77 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
|
|
|
329
340
|
summary: string;
|
|
330
341
|
description: string;
|
|
331
342
|
responses: {
|
|
332
|
-
200: {
|
|
343
|
+
"200": {
|
|
333
344
|
description: string;
|
|
334
345
|
content: {
|
|
335
346
|
"application/json": {
|
|
336
347
|
schema: {
|
|
337
348
|
type: "object";
|
|
338
349
|
properties: {
|
|
339
|
-
|
|
340
|
-
|
|
350
|
+
status: {
|
|
351
|
+
type: string;
|
|
352
|
+
description: string;
|
|
353
|
+
enum: boolean[];
|
|
341
354
|
};
|
|
342
|
-
|
|
343
|
-
|
|
355
|
+
token: {
|
|
356
|
+
type: string;
|
|
357
|
+
nullable: boolean;
|
|
358
|
+
description: string;
|
|
359
|
+
};
|
|
360
|
+
user: {
|
|
361
|
+
type: string;
|
|
362
|
+
nullable: boolean;
|
|
363
|
+
properties: {
|
|
364
|
+
id: {
|
|
365
|
+
type: string;
|
|
366
|
+
description: string;
|
|
367
|
+
};
|
|
368
|
+
email: {
|
|
369
|
+
type: string;
|
|
370
|
+
format: string;
|
|
371
|
+
nullable: boolean;
|
|
372
|
+
description: string;
|
|
373
|
+
};
|
|
374
|
+
emailVerified: {
|
|
375
|
+
type: string;
|
|
376
|
+
nullable: boolean;
|
|
377
|
+
description: string;
|
|
378
|
+
};
|
|
379
|
+
name: {
|
|
380
|
+
type: string;
|
|
381
|
+
nullable: boolean;
|
|
382
|
+
description: string;
|
|
383
|
+
};
|
|
384
|
+
image: {
|
|
385
|
+
type: string;
|
|
386
|
+
format: string;
|
|
387
|
+
nullable: boolean;
|
|
388
|
+
description: string;
|
|
389
|
+
};
|
|
390
|
+
phoneNumber: {
|
|
391
|
+
type: string;
|
|
392
|
+
description: string;
|
|
393
|
+
};
|
|
394
|
+
phoneNumberVerified: {
|
|
395
|
+
type: string;
|
|
396
|
+
description: string;
|
|
397
|
+
};
|
|
398
|
+
createdAt: {
|
|
399
|
+
type: string;
|
|
400
|
+
format: string;
|
|
401
|
+
description: string;
|
|
402
|
+
};
|
|
403
|
+
updatedAt: {
|
|
404
|
+
type: string;
|
|
405
|
+
format: string;
|
|
406
|
+
description: string;
|
|
407
|
+
};
|
|
408
|
+
};
|
|
409
|
+
required: string[];
|
|
410
|
+
description: string;
|
|
344
411
|
};
|
|
345
412
|
};
|
|
413
|
+
required: string[];
|
|
346
414
|
};
|
|
347
415
|
};
|
|
348
416
|
};
|
|
@@ -398,6 +466,31 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
|
|
|
398
466
|
}, {
|
|
399
467
|
phoneNumber: string;
|
|
400
468
|
}>;
|
|
469
|
+
metadata: {
|
|
470
|
+
openapi: {
|
|
471
|
+
description: string;
|
|
472
|
+
responses: {
|
|
473
|
+
"200": {
|
|
474
|
+
description: string;
|
|
475
|
+
content: {
|
|
476
|
+
"application/json": {
|
|
477
|
+
schema: {
|
|
478
|
+
type: "object";
|
|
479
|
+
properties: {
|
|
480
|
+
status: {
|
|
481
|
+
type: string;
|
|
482
|
+
description: string;
|
|
483
|
+
enum: boolean[];
|
|
484
|
+
};
|
|
485
|
+
};
|
|
486
|
+
required: string[];
|
|
487
|
+
};
|
|
488
|
+
};
|
|
489
|
+
};
|
|
490
|
+
};
|
|
491
|
+
};
|
|
492
|
+
};
|
|
493
|
+
};
|
|
401
494
|
} & {
|
|
402
495
|
use: any[];
|
|
403
496
|
};
|
|
@@ -451,6 +544,31 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
|
|
|
451
544
|
otp: string;
|
|
452
545
|
phoneNumber: string;
|
|
453
546
|
}>;
|
|
547
|
+
metadata: {
|
|
548
|
+
openapi: {
|
|
549
|
+
description: string;
|
|
550
|
+
responses: {
|
|
551
|
+
"200": {
|
|
552
|
+
description: string;
|
|
553
|
+
content: {
|
|
554
|
+
"application/json": {
|
|
555
|
+
schema: {
|
|
556
|
+
type: "object";
|
|
557
|
+
properties: {
|
|
558
|
+
status: {
|
|
559
|
+
type: string;
|
|
560
|
+
description: string;
|
|
561
|
+
enum: boolean[];
|
|
562
|
+
};
|
|
563
|
+
};
|
|
564
|
+
required: string[];
|
|
565
|
+
};
|
|
566
|
+
};
|
|
567
|
+
};
|
|
568
|
+
};
|
|
569
|
+
};
|
|
570
|
+
};
|
|
571
|
+
};
|
|
454
572
|
} & {
|
|
455
573
|
use: any[];
|
|
456
574
|
};
|
|
@@ -476,6 +594,11 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
|
|
|
476
594
|
};
|
|
477
595
|
};
|
|
478
596
|
};
|
|
597
|
+
rateLimit: {
|
|
598
|
+
pathMatcher(path: string): boolean;
|
|
599
|
+
window: number;
|
|
600
|
+
max: number;
|
|
601
|
+
}[];
|
|
479
602
|
$ERROR_CODES: {
|
|
480
603
|
readonly INVALID_PHONE_NUMBER: "Invalid phone number";
|
|
481
604
|
readonly PHONE_NUMBER_EXIST: "Phone number already exist";
|
|
@@ -484,6 +607,7 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
|
|
|
484
607
|
readonly OTP_NOT_FOUND: "OTP not found";
|
|
485
608
|
readonly OTP_EXPIRED: "OTP expired";
|
|
486
609
|
readonly INVALID_OTP: "Invalid OTP";
|
|
610
|
+
readonly PHONE_NUMBER_NOT_VERIFIED: "Phone number not verified";
|
|
487
611
|
};
|
|
488
612
|
};
|
|
489
613
|
declare const schema: {
|