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,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import * as better_call from 'better-call';
|
|
3
|
-
import { H as HookEndpointContext } from '../../shared/better-auth.
|
|
4
|
-
import '../../shared/better-auth.
|
|
5
|
-
import '../../shared/better-auth.
|
|
3
|
+
import { H as HookEndpointContext } from '../../shared/better-auth.DQ7OSJbI.mjs';
|
|
4
|
+
import '../../shared/better-auth.CYegVoq1.mjs';
|
|
5
|
+
import '../../shared/better-auth.B88xucNq.mjs';
|
|
6
6
|
import 'jose';
|
|
7
7
|
import 'kysely';
|
|
8
8
|
import 'better-sqlite3';
|
|
@@ -48,6 +48,11 @@ interface EmailOTPOptions {
|
|
|
48
48
|
* @Default false
|
|
49
49
|
*/
|
|
50
50
|
disableSignUp?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Allowed attempts for the OTP code
|
|
53
|
+
* @default 3
|
|
54
|
+
*/
|
|
55
|
+
allowedAttempts?: number;
|
|
51
56
|
}
|
|
52
57
|
declare const emailOTP: (options: EmailOTPOptions) => {
|
|
53
58
|
id: "email-otp";
|
|
@@ -239,7 +244,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
239
244
|
openapi: {
|
|
240
245
|
description: string;
|
|
241
246
|
responses: {
|
|
242
|
-
200: {
|
|
247
|
+
"200": {
|
|
243
248
|
description: string;
|
|
244
249
|
content: {
|
|
245
250
|
"application/json": {
|
|
@@ -248,8 +253,11 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
248
253
|
properties: {
|
|
249
254
|
otp: {
|
|
250
255
|
type: string;
|
|
256
|
+
nullable: boolean;
|
|
257
|
+
description: string;
|
|
251
258
|
};
|
|
252
259
|
};
|
|
260
|
+
required: string[];
|
|
253
261
|
};
|
|
254
262
|
};
|
|
255
263
|
};
|
|
@@ -361,9 +369,20 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
361
369
|
schema: {
|
|
362
370
|
type: "object";
|
|
363
371
|
properties: {
|
|
372
|
+
status: {
|
|
373
|
+
type: string;
|
|
374
|
+
description: string;
|
|
375
|
+
enum: boolean[];
|
|
376
|
+
};
|
|
377
|
+
token: {
|
|
378
|
+
type: string;
|
|
379
|
+
nullable: boolean;
|
|
380
|
+
description: string;
|
|
381
|
+
};
|
|
364
382
|
user: {
|
|
365
383
|
$ref: string;
|
|
366
384
|
};
|
|
385
|
+
required: string[];
|
|
367
386
|
};
|
|
368
387
|
};
|
|
369
388
|
};
|
|
@@ -450,13 +469,15 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
450
469
|
schema: {
|
|
451
470
|
type: "object";
|
|
452
471
|
properties: {
|
|
453
|
-
|
|
454
|
-
|
|
472
|
+
token: {
|
|
473
|
+
type: string;
|
|
474
|
+
description: string;
|
|
455
475
|
};
|
|
456
|
-
|
|
476
|
+
user: {
|
|
457
477
|
$ref: string;
|
|
458
478
|
};
|
|
459
479
|
};
|
|
480
|
+
required: string[];
|
|
460
481
|
};
|
|
461
482
|
};
|
|
462
483
|
};
|
|
@@ -522,6 +543,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
522
543
|
properties: {
|
|
523
544
|
success: {
|
|
524
545
|
type: string;
|
|
546
|
+
description: string;
|
|
525
547
|
};
|
|
526
548
|
};
|
|
527
549
|
};
|
|
@@ -620,9 +642,10 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
620
642
|
};
|
|
621
643
|
$ERROR_CODES: {
|
|
622
644
|
readonly OTP_EXPIRED: "otp expired";
|
|
623
|
-
readonly INVALID_OTP: "
|
|
624
|
-
readonly INVALID_EMAIL: "
|
|
625
|
-
readonly USER_NOT_FOUND: "
|
|
645
|
+
readonly INVALID_OTP: "Invalid OTP";
|
|
646
|
+
readonly INVALID_EMAIL: "Invalid email";
|
|
647
|
+
readonly USER_NOT_FOUND: "User not found";
|
|
648
|
+
readonly TOO_MANY_ATTEMPTS: "Too many attempts";
|
|
626
649
|
};
|
|
627
650
|
rateLimit: ({
|
|
628
651
|
pathMatcher(path: string): path is "/email-otp/send-verification-otp";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import * as better_call from 'better-call';
|
|
3
|
-
import { H as HookEndpointContext } from '../../shared/better-auth.
|
|
4
|
-
import '../../shared/better-auth.
|
|
5
|
-
import '../../shared/better-auth.
|
|
3
|
+
import { H as HookEndpointContext } from '../../shared/better-auth.CA2hFK4N.js';
|
|
4
|
+
import '../../shared/better-auth.CYegVoq1.js';
|
|
5
|
+
import '../../shared/better-auth.DNTAFSt1.js';
|
|
6
6
|
import 'jose';
|
|
7
7
|
import 'kysely';
|
|
8
8
|
import 'better-sqlite3';
|
|
@@ -48,6 +48,11 @@ interface EmailOTPOptions {
|
|
|
48
48
|
* @Default false
|
|
49
49
|
*/
|
|
50
50
|
disableSignUp?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Allowed attempts for the OTP code
|
|
53
|
+
* @default 3
|
|
54
|
+
*/
|
|
55
|
+
allowedAttempts?: number;
|
|
51
56
|
}
|
|
52
57
|
declare const emailOTP: (options: EmailOTPOptions) => {
|
|
53
58
|
id: "email-otp";
|
|
@@ -239,7 +244,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
239
244
|
openapi: {
|
|
240
245
|
description: string;
|
|
241
246
|
responses: {
|
|
242
|
-
200: {
|
|
247
|
+
"200": {
|
|
243
248
|
description: string;
|
|
244
249
|
content: {
|
|
245
250
|
"application/json": {
|
|
@@ -248,8 +253,11 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
248
253
|
properties: {
|
|
249
254
|
otp: {
|
|
250
255
|
type: string;
|
|
256
|
+
nullable: boolean;
|
|
257
|
+
description: string;
|
|
251
258
|
};
|
|
252
259
|
};
|
|
260
|
+
required: string[];
|
|
253
261
|
};
|
|
254
262
|
};
|
|
255
263
|
};
|
|
@@ -361,9 +369,20 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
361
369
|
schema: {
|
|
362
370
|
type: "object";
|
|
363
371
|
properties: {
|
|
372
|
+
status: {
|
|
373
|
+
type: string;
|
|
374
|
+
description: string;
|
|
375
|
+
enum: boolean[];
|
|
376
|
+
};
|
|
377
|
+
token: {
|
|
378
|
+
type: string;
|
|
379
|
+
nullable: boolean;
|
|
380
|
+
description: string;
|
|
381
|
+
};
|
|
364
382
|
user: {
|
|
365
383
|
$ref: string;
|
|
366
384
|
};
|
|
385
|
+
required: string[];
|
|
367
386
|
};
|
|
368
387
|
};
|
|
369
388
|
};
|
|
@@ -450,13 +469,15 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
450
469
|
schema: {
|
|
451
470
|
type: "object";
|
|
452
471
|
properties: {
|
|
453
|
-
|
|
454
|
-
|
|
472
|
+
token: {
|
|
473
|
+
type: string;
|
|
474
|
+
description: string;
|
|
455
475
|
};
|
|
456
|
-
|
|
476
|
+
user: {
|
|
457
477
|
$ref: string;
|
|
458
478
|
};
|
|
459
479
|
};
|
|
480
|
+
required: string[];
|
|
460
481
|
};
|
|
461
482
|
};
|
|
462
483
|
};
|
|
@@ -522,6 +543,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
522
543
|
properties: {
|
|
523
544
|
success: {
|
|
524
545
|
type: string;
|
|
546
|
+
description: string;
|
|
525
547
|
};
|
|
526
548
|
};
|
|
527
549
|
};
|
|
@@ -620,9 +642,10 @@ declare const emailOTP: (options: EmailOTPOptions) => {
|
|
|
620
642
|
};
|
|
621
643
|
$ERROR_CODES: {
|
|
622
644
|
readonly OTP_EXPIRED: "otp expired";
|
|
623
|
-
readonly INVALID_OTP: "
|
|
624
|
-
readonly INVALID_EMAIL: "
|
|
625
|
-
readonly USER_NOT_FOUND: "
|
|
645
|
+
readonly INVALID_OTP: "Invalid OTP";
|
|
646
|
+
readonly INVALID_EMAIL: "Invalid email";
|
|
647
|
+
readonly USER_NOT_FOUND: "User not found";
|
|
648
|
+
readonly TOO_MANY_ATTEMPTS: "Too many attempts";
|
|
626
649
|
};
|
|
627
650
|
rateLimit: ({
|
|
628
651
|
pathMatcher(path: string): path is "/email-otp/send-verification-otp";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { APIError } from 'better-call';
|
|
3
|
-
import { c as createAuthMiddleware, a as createAuthEndpoint } from '../../shared/better-auth.
|
|
3
|
+
import { c as createAuthMiddleware, a as createAuthEndpoint } from '../../shared/better-auth.CWwVo_61.mjs';
|
|
4
4
|
import { setSessionCookie } from '../../cookies/index.mjs';
|
|
5
|
-
import '../../shared/better-auth.
|
|
5
|
+
import '../../shared/better-auth.Cc72UxUH.mjs';
|
|
6
6
|
import '../../shared/better-auth.8zoxzg-F.mjs';
|
|
7
|
-
import '../../shared/better-auth.
|
|
7
|
+
import '../../shared/better-auth.Cqykj82J.mjs';
|
|
8
8
|
import 'defu';
|
|
9
9
|
import '@better-auth/utils/hash';
|
|
10
10
|
import '@noble/ciphers/chacha';
|
|
@@ -25,12 +25,12 @@ import '../../shared/better-auth.DCVeP5-W.mjs';
|
|
|
25
25
|
import '../../shared/better-auth.DdzSJf-n.mjs';
|
|
26
26
|
import '@better-auth/utils/random';
|
|
27
27
|
import '../../shared/better-auth.BdyOG_p4.mjs';
|
|
28
|
+
import '../../shared/better-auth.tB5eU6EY.mjs';
|
|
28
29
|
import '../../shared/better-auth.BUPPRXfK.mjs';
|
|
29
30
|
import '@better-auth/utils/hmac';
|
|
30
31
|
import '../../shared/better-auth.DDEbWX-S.mjs';
|
|
31
32
|
import '../../shared/better-auth.VTXNLFMT.mjs';
|
|
32
33
|
import 'jose/errors';
|
|
33
|
-
import '../../shared/better-auth.tB5eU6EY.mjs';
|
|
34
34
|
import '@better-auth/utils/binary';
|
|
35
35
|
|
|
36
36
|
const types = ["email-verification", "sign-in", "forget-password"];
|
|
@@ -42,9 +42,10 @@ const emailOTP = (options) => {
|
|
|
42
42
|
};
|
|
43
43
|
const ERROR_CODES = {
|
|
44
44
|
OTP_EXPIRED: "otp expired",
|
|
45
|
-
INVALID_OTP: "
|
|
46
|
-
INVALID_EMAIL: "
|
|
47
|
-
USER_NOT_FOUND: "
|
|
45
|
+
INVALID_OTP: "Invalid OTP",
|
|
46
|
+
INVALID_EMAIL: "Invalid email",
|
|
47
|
+
USER_NOT_FOUND: "User not found",
|
|
48
|
+
TOO_MANY_ATTEMPTS: "Too many attempts"
|
|
48
49
|
};
|
|
49
50
|
return {
|
|
50
51
|
id: "email-otp",
|
|
@@ -113,7 +114,7 @@ const emailOTP = (options) => {
|
|
|
113
114
|
ctx.request
|
|
114
115
|
);
|
|
115
116
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
116
|
-
value: otp
|
|
117
|
+
value: `${otp}:0`,
|
|
117
118
|
identifier: `${ctx.body.type}-otp-${email}`,
|
|
118
119
|
expiresAt: getDate(opts.expiresIn, "sec")
|
|
119
120
|
}).catch(async (error) => {
|
|
@@ -121,7 +122,7 @@ const emailOTP = (options) => {
|
|
|
121
122
|
`${ctx.body.type}-otp-${email}`
|
|
122
123
|
);
|
|
123
124
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
124
|
-
value: otp
|
|
125
|
+
value: `${otp}:0`,
|
|
125
126
|
identifier: `${ctx.body.type}-otp-${email}`,
|
|
126
127
|
expiresAt: getDate(opts.expiresIn, "sec")
|
|
127
128
|
});
|
|
@@ -177,7 +178,7 @@ const emailOTP = (options) => {
|
|
|
177
178
|
ctx.request
|
|
178
179
|
);
|
|
179
180
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
180
|
-
value: otp
|
|
181
|
+
value: `${otp}:0`,
|
|
181
182
|
identifier: `${ctx.body.type}-otp-${email}`,
|
|
182
183
|
expiresAt: getDate(opts.expiresIn, "sec")
|
|
183
184
|
});
|
|
@@ -199,17 +200,20 @@ const emailOTP = (options) => {
|
|
|
199
200
|
openapi: {
|
|
200
201
|
description: "Get verification OTP",
|
|
201
202
|
responses: {
|
|
202
|
-
200: {
|
|
203
|
-
description: "
|
|
203
|
+
"200": {
|
|
204
|
+
description: "OTP retrieved successfully or not found/expired",
|
|
204
205
|
content: {
|
|
205
206
|
"application/json": {
|
|
206
207
|
schema: {
|
|
207
208
|
type: "object",
|
|
208
209
|
properties: {
|
|
209
210
|
otp: {
|
|
210
|
-
type: "string"
|
|
211
|
+
type: "string",
|
|
212
|
+
nullable: true,
|
|
213
|
+
description: "The stored OTP, or null if not found or expired"
|
|
211
214
|
}
|
|
212
|
-
}
|
|
215
|
+
},
|
|
216
|
+
required: ["otp"]
|
|
213
217
|
}
|
|
214
218
|
}
|
|
215
219
|
}
|
|
@@ -256,9 +260,20 @@ const emailOTP = (options) => {
|
|
|
256
260
|
schema: {
|
|
257
261
|
type: "object",
|
|
258
262
|
properties: {
|
|
263
|
+
status: {
|
|
264
|
+
type: "boolean",
|
|
265
|
+
description: "Indicates if the verification was successful",
|
|
266
|
+
enum: [true]
|
|
267
|
+
},
|
|
268
|
+
token: {
|
|
269
|
+
type: "string",
|
|
270
|
+
nullable: true,
|
|
271
|
+
description: "Session token if autoSignInAfterVerification is enabled, otherwise null"
|
|
272
|
+
},
|
|
259
273
|
user: {
|
|
260
274
|
$ref: "#/components/schemas/User"
|
|
261
|
-
}
|
|
275
|
+
},
|
|
276
|
+
required: ["status", "token", "user"]
|
|
262
277
|
}
|
|
263
278
|
}
|
|
264
279
|
}
|
|
@@ -289,8 +304,23 @@ const emailOTP = (options) => {
|
|
|
289
304
|
message: ERROR_CODES.OTP_EXPIRED
|
|
290
305
|
});
|
|
291
306
|
}
|
|
292
|
-
const
|
|
293
|
-
|
|
307
|
+
const [otpValue, attempts] = verificationValue.value.split(":");
|
|
308
|
+
const allowedAttempts = options?.allowedAttempts || 3;
|
|
309
|
+
if (attempts && parseInt(attempts) >= allowedAttempts) {
|
|
310
|
+
await ctx.context.internalAdapter.deleteVerificationValue(
|
|
311
|
+
verificationValue.id
|
|
312
|
+
);
|
|
313
|
+
throw new APIError("FORBIDDEN", {
|
|
314
|
+
message: ERROR_CODES.TOO_MANY_ATTEMPTS
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
if (ctx.body.otp !== otpValue) {
|
|
318
|
+
await ctx.context.internalAdapter.updateVerificationValue(
|
|
319
|
+
verificationValue.id,
|
|
320
|
+
{
|
|
321
|
+
value: `${otpValue}:${parseInt(attempts || "0") + 1}`
|
|
322
|
+
}
|
|
323
|
+
);
|
|
294
324
|
throw new APIError("BAD_REQUEST", {
|
|
295
325
|
message: ERROR_CODES.INVALID_OTP
|
|
296
326
|
});
|
|
@@ -315,7 +345,7 @@ const emailOTP = (options) => {
|
|
|
315
345
|
if (ctx.context.options.emailVerification?.autoSignInAfterVerification) {
|
|
316
346
|
const session = await ctx.context.internalAdapter.createSession(
|
|
317
347
|
updatedUser.id,
|
|
318
|
-
ctx.
|
|
348
|
+
ctx.headers
|
|
319
349
|
);
|
|
320
350
|
await setSessionCookie(ctx, {
|
|
321
351
|
session,
|
|
@@ -373,13 +403,15 @@ const emailOTP = (options) => {
|
|
|
373
403
|
schema: {
|
|
374
404
|
type: "object",
|
|
375
405
|
properties: {
|
|
406
|
+
token: {
|
|
407
|
+
type: "string",
|
|
408
|
+
description: "Session token for the authenticated session"
|
|
409
|
+
},
|
|
376
410
|
user: {
|
|
377
411
|
$ref: "#/components/schemas/User"
|
|
378
|
-
},
|
|
379
|
-
session: {
|
|
380
|
-
$ref: "#/components/schemas/Session"
|
|
381
412
|
}
|
|
382
|
-
}
|
|
413
|
+
},
|
|
414
|
+
required: ["token", "user"]
|
|
383
415
|
}
|
|
384
416
|
}
|
|
385
417
|
}
|
|
@@ -403,8 +435,23 @@ const emailOTP = (options) => {
|
|
|
403
435
|
message: ERROR_CODES.OTP_EXPIRED
|
|
404
436
|
});
|
|
405
437
|
}
|
|
406
|
-
const
|
|
407
|
-
|
|
438
|
+
const [otpValue, attempts] = verificationValue.value.split(":");
|
|
439
|
+
const allowedAttempts = options?.allowedAttempts || 3;
|
|
440
|
+
if (attempts && parseInt(attempts) >= allowedAttempts) {
|
|
441
|
+
await ctx.context.internalAdapter.deleteVerificationValue(
|
|
442
|
+
verificationValue.id
|
|
443
|
+
);
|
|
444
|
+
throw new APIError("FORBIDDEN", {
|
|
445
|
+
message: ERROR_CODES.TOO_MANY_ATTEMPTS
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
if (ctx.body.otp !== otpValue) {
|
|
449
|
+
await ctx.context.internalAdapter.updateVerificationValue(
|
|
450
|
+
verificationValue.id,
|
|
451
|
+
{
|
|
452
|
+
value: `${otpValue}:${parseInt(attempts || "0") + 1}`
|
|
453
|
+
}
|
|
454
|
+
);
|
|
408
455
|
throw new APIError("BAD_REQUEST", {
|
|
409
456
|
message: ERROR_CODES.INVALID_OTP
|
|
410
457
|
});
|
|
@@ -429,7 +476,7 @@ const emailOTP = (options) => {
|
|
|
429
476
|
);
|
|
430
477
|
const session2 = await ctx.context.internalAdapter.createSession(
|
|
431
478
|
newUser.id,
|
|
432
|
-
ctx.
|
|
479
|
+
ctx.headers
|
|
433
480
|
);
|
|
434
481
|
await setSessionCookie(ctx, {
|
|
435
482
|
session: session2,
|
|
@@ -459,7 +506,7 @@ const emailOTP = (options) => {
|
|
|
459
506
|
}
|
|
460
507
|
const session = await ctx.context.internalAdapter.createSession(
|
|
461
508
|
user.user.id,
|
|
462
|
-
ctx.
|
|
509
|
+
ctx.headers
|
|
463
510
|
);
|
|
464
511
|
await setSessionCookie(ctx, {
|
|
465
512
|
session,
|
|
@@ -500,7 +547,8 @@ const emailOTP = (options) => {
|
|
|
500
547
|
type: "object",
|
|
501
548
|
properties: {
|
|
502
549
|
success: {
|
|
503
|
-
type: "boolean"
|
|
550
|
+
type: "boolean",
|
|
551
|
+
description: "Indicates if the OTP was sent successfully"
|
|
504
552
|
}
|
|
505
553
|
}
|
|
506
554
|
}
|
|
@@ -524,7 +572,7 @@ const emailOTP = (options) => {
|
|
|
524
572
|
ctx.request
|
|
525
573
|
);
|
|
526
574
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
527
|
-
value: otp
|
|
575
|
+
value: `${otp}:0`,
|
|
528
576
|
identifier: `forget-password-otp-${email}`,
|
|
529
577
|
expiresAt: getDate(opts.expiresIn, "sec")
|
|
530
578
|
});
|
|
@@ -601,12 +649,30 @@ const emailOTP = (options) => {
|
|
|
601
649
|
});
|
|
602
650
|
}
|
|
603
651
|
if (verificationValue.expiresAt < /* @__PURE__ */ new Date()) {
|
|
652
|
+
await ctx.context.internalAdapter.deleteVerificationValue(
|
|
653
|
+
verificationValue.id
|
|
654
|
+
);
|
|
604
655
|
throw new APIError("BAD_REQUEST", {
|
|
605
656
|
message: ERROR_CODES.OTP_EXPIRED
|
|
606
657
|
});
|
|
607
658
|
}
|
|
608
|
-
const
|
|
609
|
-
|
|
659
|
+
const [otpValue, attempts] = verificationValue.value.split(":");
|
|
660
|
+
const allowedAttempts = options?.allowedAttempts || 3;
|
|
661
|
+
if (attempts && parseInt(attempts) >= allowedAttempts) {
|
|
662
|
+
await ctx.context.internalAdapter.deleteVerificationValue(
|
|
663
|
+
verificationValue.id
|
|
664
|
+
);
|
|
665
|
+
throw new APIError("FORBIDDEN", {
|
|
666
|
+
message: ERROR_CODES.TOO_MANY_ATTEMPTS
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
if (ctx.body.otp !== otpValue) {
|
|
670
|
+
await ctx.context.internalAdapter.updateVerificationValue(
|
|
671
|
+
verificationValue.id,
|
|
672
|
+
{
|
|
673
|
+
value: `${otpValue}:${parseInt(attempts || "0") + 1}`
|
|
674
|
+
}
|
|
675
|
+
);
|
|
610
676
|
throw new APIError("BAD_REQUEST", {
|
|
611
677
|
message: ERROR_CODES.INVALID_OTP
|
|
612
678
|
});
|
|
@@ -658,7 +724,7 @@ const emailOTP = (options) => {
|
|
|
658
724
|
ctx.request
|
|
659
725
|
);
|
|
660
726
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
661
|
-
value: otp
|
|
727
|
+
value: `${otp}:0`,
|
|
662
728
|
identifier: `email-verification-otp-${email}`,
|
|
663
729
|
expiresAt: getDate(opts.expiresIn, "sec")
|
|
664
730
|
});
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const fetch = require('@better-fetch/fetch');
|
|
4
4
|
const betterCall = require('better-call');
|
|
5
5
|
const zod = require('zod');
|
|
6
|
-
const refreshToken = require('../../shared/better-auth.
|
|
6
|
+
const refreshToken = require('../../shared/better-auth.Dg0siV5C.cjs');
|
|
7
7
|
const cookies_index = require('../../cookies/index.cjs');
|
|
8
|
-
require('../../shared/better-auth.
|
|
8
|
+
require('../../shared/better-auth.DcWKCjjf.cjs');
|
|
9
9
|
require('../../shared/better-auth.DiSjtgs9.cjs');
|
|
10
10
|
require('../../shared/better-auth.GpOOav9x.cjs');
|
|
11
11
|
require('defu');
|
|
@@ -25,13 +25,13 @@ require('@noble/hashes/utils');
|
|
|
25
25
|
require('../../shared/better-auth.CYeOI8C-.cjs');
|
|
26
26
|
require('@better-auth/utils/random');
|
|
27
27
|
require('../../shared/better-auth.ANpbi45u.cjs');
|
|
28
|
+
require('../../shared/better-auth.D3mtHEZg.cjs');
|
|
28
29
|
require('../../shared/better-auth.C1hdVENX.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
37
|
async function getUserInfo(tokens, finalUserInfoUrl) {
|
|
@@ -97,7 +97,8 @@ const genericOAuth = (options) => {
|
|
|
97
97
|
let finalTokenUrl = c.tokenUrl;
|
|
98
98
|
if (c.discoveryUrl) {
|
|
99
99
|
const discovery = await fetch.betterFetch(c.discoveryUrl, {
|
|
100
|
-
method: "GET"
|
|
100
|
+
method: "GET",
|
|
101
|
+
headers: c.discoveryHeaders
|
|
101
102
|
});
|
|
102
103
|
if (discovery.data) {
|
|
103
104
|
finalTokenUrl = discovery.data.token_endpoint;
|
|
@@ -125,7 +126,8 @@ const genericOAuth = (options) => {
|
|
|
125
126
|
let finalTokenUrl = c.tokenUrl;
|
|
126
127
|
if (c.discoveryUrl) {
|
|
127
128
|
const discovery = await fetch.betterFetch(c.discoveryUrl, {
|
|
128
|
-
method: "GET"
|
|
129
|
+
method: "GET",
|
|
130
|
+
headers: c.discoveryHeaders
|
|
129
131
|
});
|
|
130
132
|
if (discovery.data) {
|
|
131
133
|
finalTokenUrl = discovery.data.token_endpoint;
|
|
@@ -142,6 +144,7 @@ const genericOAuth = (options) => {
|
|
|
142
144
|
clientId: c.clientId,
|
|
143
145
|
clientSecret: c.clientSecret
|
|
144
146
|
},
|
|
147
|
+
authentication: c.authentication,
|
|
145
148
|
tokenEndpoint: finalTokenUrl
|
|
146
149
|
});
|
|
147
150
|
},
|
|
@@ -257,6 +260,8 @@ const genericOAuth = (options) => {
|
|
|
257
260
|
let finalTokenUrl = tokenUrl;
|
|
258
261
|
if (discoveryUrl) {
|
|
259
262
|
const discovery = await fetch.betterFetch(discoveryUrl, {
|
|
263
|
+
method: "GET",
|
|
264
|
+
headers: config.discoveryHeaders,
|
|
260
265
|
onError(context) {
|
|
261
266
|
ctx.context.logger.error(context.error.message, context.error, {
|
|
262
267
|
discoveryUrl
|
|
@@ -381,7 +386,8 @@ const genericOAuth = (options) => {
|
|
|
381
386
|
let finalUserInfoUrl = provider.userInfoUrl;
|
|
382
387
|
if (provider.discoveryUrl) {
|
|
383
388
|
const discovery = await fetch.betterFetch(provider.discoveryUrl, {
|
|
384
|
-
method: "GET"
|
|
389
|
+
method: "GET",
|
|
390
|
+
headers: provider.discoveryHeaders
|
|
385
391
|
});
|
|
386
392
|
if (discovery.data) {
|
|
387
393
|
finalTokenUrl = discovery.data.token_endpoint;
|
|
@@ -431,18 +437,40 @@ const genericOAuth = (options) => {
|
|
|
431
437
|
if (ctx.context.options.account?.accountLinking?.allowDifferentEmails !== true && link.email !== mapUser.email.toLowerCase()) {
|
|
432
438
|
return redirectOnError("email_doesn't_match");
|
|
433
439
|
}
|
|
434
|
-
const
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
440
|
+
const existingAccount = await ctx.context.internalAdapter.findAccount(userInfo.id);
|
|
441
|
+
if (existingAccount) {
|
|
442
|
+
if (existingAccount.userId !== link.userId) {
|
|
443
|
+
return redirectOnError(
|
|
444
|
+
"account_already_linked_to_different_user"
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
const updateData = Object.fromEntries(
|
|
448
|
+
Object.entries({
|
|
449
|
+
accessToken: tokens.accessToken,
|
|
450
|
+
idToken: tokens.idToken,
|
|
451
|
+
refreshToken: tokens.refreshToken,
|
|
452
|
+
accessTokenExpiresAt: tokens.accessTokenExpiresAt,
|
|
453
|
+
refreshTokenExpiresAt: tokens.refreshTokenExpiresAt,
|
|
454
|
+
scope: tokens.scopes?.join(",")
|
|
455
|
+
}).filter(([_, value]) => value !== void 0)
|
|
456
|
+
);
|
|
457
|
+
await ctx.context.internalAdapter.updateAccount(
|
|
458
|
+
existingAccount.id,
|
|
459
|
+
updateData
|
|
460
|
+
);
|
|
461
|
+
} else {
|
|
462
|
+
const newAccount = await ctx.context.internalAdapter.createAccount({
|
|
463
|
+
userId: link.userId,
|
|
464
|
+
providerId: provider.providerId,
|
|
465
|
+
accountId: userInfo.id,
|
|
466
|
+
accessToken: tokens.accessToken,
|
|
467
|
+
accessTokenExpiresAt: tokens.accessTokenExpiresAt,
|
|
468
|
+
refreshTokenExpiresAt: tokens.refreshTokenExpiresAt,
|
|
469
|
+
scope: tokens.scopes?.join(",")
|
|
470
|
+
});
|
|
471
|
+
if (!newAccount) {
|
|
472
|
+
return redirectOnError("unable_to_link_account");
|
|
473
|
+
}
|
|
446
474
|
}
|
|
447
475
|
let toRedirectTo2;
|
|
448
476
|
try {
|
|
@@ -464,7 +492,8 @@ const genericOAuth = (options) => {
|
|
|
464
492
|
...tokens,
|
|
465
493
|
scope: tokens.scopes?.join(",")
|
|
466
494
|
},
|
|
467
|
-
disableSignUp: provider.disableImplicitSignUp && !requestSignUp || provider.disableSignUp
|
|
495
|
+
disableSignUp: provider.disableImplicitSignUp && !requestSignUp || provider.disableSignUp,
|
|
496
|
+
overrideUserInfo: provider.overrideUserInfo
|
|
468
497
|
});
|
|
469
498
|
if (result.error) {
|
|
470
499
|
return redirectOnError(result.error.split(" ").join("_"));
|
|
@@ -492,7 +521,37 @@ const genericOAuth = (options) => {
|
|
|
492
521
|
providerId: zod.z.string(),
|
|
493
522
|
callbackURL: zod.z.string()
|
|
494
523
|
}),
|
|
495
|
-
use: [refreshToken.sessionMiddleware]
|
|
524
|
+
use: [refreshToken.sessionMiddleware],
|
|
525
|
+
metadata: {
|
|
526
|
+
openapi: {
|
|
527
|
+
description: "Link an OAuth2 account to the current user session",
|
|
528
|
+
responses: {
|
|
529
|
+
"200": {
|
|
530
|
+
description: "Authorization URL generated successfully for linking an OAuth2 account",
|
|
531
|
+
content: {
|
|
532
|
+
"application/json": {
|
|
533
|
+
schema: {
|
|
534
|
+
type: "object",
|
|
535
|
+
properties: {
|
|
536
|
+
url: {
|
|
537
|
+
type: "string",
|
|
538
|
+
format: "uri",
|
|
539
|
+
description: "The authorization URL to redirect the user to for linking the OAuth2 account"
|
|
540
|
+
},
|
|
541
|
+
redirect: {
|
|
542
|
+
type: "boolean",
|
|
543
|
+
description: "Indicates that the client should redirect to the provided URL",
|
|
544
|
+
enum: [true]
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
required: ["url", "redirect"]
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
496
555
|
},
|
|
497
556
|
async (c) => {
|
|
498
557
|
const session = c.context.session;
|
|
@@ -536,6 +595,8 @@ const genericOAuth = (options) => {
|
|
|
536
595
|
});
|
|
537
596
|
}
|
|
538
597
|
const discovery = await fetch.betterFetch(discoveryUrl, {
|
|
598
|
+
method: "GET",
|
|
599
|
+
headers: provider.discoveryHeaders,
|
|
539
600
|
onError(context) {
|
|
540
601
|
c.context.logger.error(context.error.message, context.error, {
|
|
541
602
|
discoveryUrl
|