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
|
@@ -7,6 +7,7 @@ const socialProviders_index = require('../social-providers/index.cjs');
|
|
|
7
7
|
require('@better-auth/utils/random');
|
|
8
8
|
const state = require('./better-auth.QbbyHMYf.cjs');
|
|
9
9
|
const logger = require('./better-auth.GpOOav9x.cjs');
|
|
10
|
+
const json = require('./better-auth.D3mtHEZg.cjs');
|
|
10
11
|
const date = require('./better-auth.C1hdVENX.cjs');
|
|
11
12
|
const id = require('./better-auth.Bg6iw3ig.cjs');
|
|
12
13
|
require('@better-auth/utils/hash');
|
|
@@ -20,7 +21,7 @@ require('@better-auth/utils');
|
|
|
20
21
|
require('@better-auth/utils/hex');
|
|
21
22
|
require('@noble/hashes/utils');
|
|
22
23
|
const random = require('./better-auth.CYeOI8C-.cjs');
|
|
23
|
-
const schema$1 = require('./better-auth.
|
|
24
|
+
const schema$1 = require('./better-auth.DcWKCjjf.cjs');
|
|
24
25
|
const env = require('./better-auth.DiSjtgs9.cjs');
|
|
25
26
|
const hmac = require('@better-auth/utils/hmac');
|
|
26
27
|
require('@better-fetch/fetch');
|
|
@@ -28,7 +29,6 @@ require('defu');
|
|
|
28
29
|
const jwt = require('./better-auth.BMYo0QR-.cjs');
|
|
29
30
|
const url = require('./better-auth.C-R0J0n1.cjs');
|
|
30
31
|
const errors = require('jose/errors');
|
|
31
|
-
const json = require('./better-auth.D3mtHEZg.cjs');
|
|
32
32
|
const binary = require('@better-auth/utils/binary');
|
|
33
33
|
|
|
34
34
|
const optionsMiddleware = betterCall.createMiddleware(async () => {
|
|
@@ -323,14 +323,13 @@ const getSession = () => createAuthEndpoint(
|
|
|
323
323
|
type: "object",
|
|
324
324
|
properties: {
|
|
325
325
|
session: {
|
|
326
|
-
type: "object",
|
|
327
326
|
$ref: "#/components/schemas/Session"
|
|
328
327
|
},
|
|
329
328
|
user: {
|
|
330
|
-
type: "object",
|
|
331
329
|
$ref: "#/components/schemas/User"
|
|
332
330
|
}
|
|
333
|
-
}
|
|
331
|
+
},
|
|
332
|
+
required: ["session", "user"]
|
|
334
333
|
}
|
|
335
334
|
}
|
|
336
335
|
}
|
|
@@ -406,7 +405,7 @@ const getSession = () => createAuthEndpoint(
|
|
|
406
405
|
const updateAge = ctx.context.sessionConfig.updateAge;
|
|
407
406
|
const sessionIsDueToBeUpdatedDate = session.session.expiresAt.valueOf() - expiresIn * 1e3 + updateAge * 1e3;
|
|
408
407
|
const shouldBeUpdated = sessionIsDueToBeUpdatedDate <= Date.now();
|
|
409
|
-
if (shouldBeUpdated) {
|
|
408
|
+
if (shouldBeUpdated && (!ctx.query?.disableRefresh || !ctx.context.options.session?.disableSessionRefresh)) {
|
|
410
409
|
const updatedSession = await ctx.context.internalAdapter.updateSession(
|
|
411
410
|
session.session.token,
|
|
412
411
|
{
|
|
@@ -523,18 +522,7 @@ const listSessions = () => createAuthEndpoint(
|
|
|
523
522
|
schema: {
|
|
524
523
|
type: "array",
|
|
525
524
|
items: {
|
|
526
|
-
|
|
527
|
-
properties: {
|
|
528
|
-
token: {
|
|
529
|
-
type: "string"
|
|
530
|
-
},
|
|
531
|
-
userId: {
|
|
532
|
-
type: "string"
|
|
533
|
-
},
|
|
534
|
-
expiresAt: {
|
|
535
|
-
type: "string"
|
|
536
|
-
}
|
|
537
|
-
}
|
|
525
|
+
$ref: "#/components/schemas/Session"
|
|
538
526
|
}
|
|
539
527
|
}
|
|
540
528
|
}
|
|
@@ -582,13 +570,33 @@ const revokeSession = createAuthEndpoint(
|
|
|
582
570
|
type: "object",
|
|
583
571
|
properties: {
|
|
584
572
|
token: {
|
|
585
|
-
type: "string"
|
|
573
|
+
type: "string",
|
|
574
|
+
description: "The token to revoke"
|
|
586
575
|
}
|
|
587
576
|
},
|
|
588
577
|
required: ["token"]
|
|
589
578
|
}
|
|
590
579
|
}
|
|
591
580
|
}
|
|
581
|
+
},
|
|
582
|
+
responses: {
|
|
583
|
+
"200": {
|
|
584
|
+
description: "Success",
|
|
585
|
+
content: {
|
|
586
|
+
"application/json": {
|
|
587
|
+
schema: {
|
|
588
|
+
type: "object",
|
|
589
|
+
properties: {
|
|
590
|
+
status: {
|
|
591
|
+
type: "boolean",
|
|
592
|
+
description: "Indicates if the session was revoked successfully"
|
|
593
|
+
}
|
|
594
|
+
},
|
|
595
|
+
required: ["status"]
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
592
600
|
}
|
|
593
601
|
}
|
|
594
602
|
}
|
|
@@ -636,7 +644,8 @@ const revokeSessions = createAuthEndpoint(
|
|
|
636
644
|
type: "object",
|
|
637
645
|
properties: {
|
|
638
646
|
status: {
|
|
639
|
-
type: "boolean"
|
|
647
|
+
type: "boolean",
|
|
648
|
+
description: "Indicates if all sessions were revoked successfully"
|
|
640
649
|
}
|
|
641
650
|
},
|
|
642
651
|
required: ["status"]
|
|
@@ -683,9 +692,11 @@ const revokeOtherSessions = createAuthEndpoint(
|
|
|
683
692
|
type: "object",
|
|
684
693
|
properties: {
|
|
685
694
|
status: {
|
|
686
|
-
type: "boolean"
|
|
695
|
+
type: "boolean",
|
|
696
|
+
description: "Indicates if all other sessions were revoked successfully"
|
|
687
697
|
}
|
|
688
|
-
}
|
|
698
|
+
},
|
|
699
|
+
required: ["status"]
|
|
689
700
|
}
|
|
690
701
|
}
|
|
691
702
|
}
|
|
@@ -776,11 +787,14 @@ const sendVerificationEmail = createAuthEndpoint(
|
|
|
776
787
|
properties: {
|
|
777
788
|
email: {
|
|
778
789
|
type: "string",
|
|
779
|
-
description: "The email to send the verification email to"
|
|
790
|
+
description: "The email to send the verification email to",
|
|
791
|
+
example: "user@example.com"
|
|
780
792
|
},
|
|
781
793
|
callbackURL: {
|
|
782
794
|
type: "string",
|
|
783
|
-
description: "The URL to use for email verification callback"
|
|
795
|
+
description: "The URL to use for email verification callback",
|
|
796
|
+
example: "https://example.com/callback",
|
|
797
|
+
nullable: true
|
|
784
798
|
}
|
|
785
799
|
},
|
|
786
800
|
required: ["email"]
|
|
@@ -797,7 +811,26 @@ const sendVerificationEmail = createAuthEndpoint(
|
|
|
797
811
|
type: "object",
|
|
798
812
|
properties: {
|
|
799
813
|
status: {
|
|
800
|
-
type: "boolean"
|
|
814
|
+
type: "boolean",
|
|
815
|
+
description: "Indicates if the email was sent successfully",
|
|
816
|
+
example: true
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
},
|
|
823
|
+
"400": {
|
|
824
|
+
description: "Bad Request",
|
|
825
|
+
content: {
|
|
826
|
+
"application/json": {
|
|
827
|
+
schema: {
|
|
828
|
+
type: "object",
|
|
829
|
+
properties: {
|
|
830
|
+
message: {
|
|
831
|
+
type: "string",
|
|
832
|
+
description: "Error message",
|
|
833
|
+
example: "Verification email isn't enabled"
|
|
801
834
|
}
|
|
802
835
|
}
|
|
803
836
|
}
|
|
@@ -844,6 +877,26 @@ const verifyEmail = createAuthEndpoint(
|
|
|
844
877
|
metadata: {
|
|
845
878
|
openapi: {
|
|
846
879
|
description: "Verify the email of the user",
|
|
880
|
+
parameters: [
|
|
881
|
+
{
|
|
882
|
+
name: "token",
|
|
883
|
+
in: "query",
|
|
884
|
+
description: "The token to verify the email",
|
|
885
|
+
required: true,
|
|
886
|
+
schema: {
|
|
887
|
+
type: "string"
|
|
888
|
+
}
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
name: "callbackURL",
|
|
892
|
+
in: "query",
|
|
893
|
+
description: "The URL to redirect to after email verification",
|
|
894
|
+
required: false,
|
|
895
|
+
schema: {
|
|
896
|
+
type: "string"
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
],
|
|
847
900
|
responses: {
|
|
848
901
|
"200": {
|
|
849
902
|
description: "Success",
|
|
@@ -854,13 +907,52 @@ const verifyEmail = createAuthEndpoint(
|
|
|
854
907
|
properties: {
|
|
855
908
|
user: {
|
|
856
909
|
type: "object",
|
|
857
|
-
|
|
910
|
+
properties: {
|
|
911
|
+
id: {
|
|
912
|
+
type: "string",
|
|
913
|
+
description: "User ID"
|
|
914
|
+
},
|
|
915
|
+
email: {
|
|
916
|
+
type: "string",
|
|
917
|
+
description: "User email"
|
|
918
|
+
},
|
|
919
|
+
name: {
|
|
920
|
+
type: "string",
|
|
921
|
+
description: "User name"
|
|
922
|
+
},
|
|
923
|
+
image: {
|
|
924
|
+
type: "string",
|
|
925
|
+
description: "User image URL"
|
|
926
|
+
},
|
|
927
|
+
emailVerified: {
|
|
928
|
+
type: "boolean",
|
|
929
|
+
description: "Indicates if the user email is verified"
|
|
930
|
+
},
|
|
931
|
+
createdAt: {
|
|
932
|
+
type: "string",
|
|
933
|
+
description: "User creation date"
|
|
934
|
+
},
|
|
935
|
+
updatedAt: {
|
|
936
|
+
type: "string",
|
|
937
|
+
description: "User update date"
|
|
938
|
+
}
|
|
939
|
+
},
|
|
940
|
+
required: [
|
|
941
|
+
"id",
|
|
942
|
+
"email",
|
|
943
|
+
"name",
|
|
944
|
+
"image",
|
|
945
|
+
"emailVerified",
|
|
946
|
+
"createdAt",
|
|
947
|
+
"updatedAt"
|
|
948
|
+
]
|
|
858
949
|
},
|
|
859
950
|
status: {
|
|
860
|
-
type: "boolean"
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
951
|
+
type: "boolean",
|
|
952
|
+
description: "Indicates if the email was verified successfully"
|
|
953
|
+
},
|
|
954
|
+
required: ["user", "status"]
|
|
955
|
+
}
|
|
864
956
|
}
|
|
865
957
|
}
|
|
866
958
|
}
|
|
@@ -982,7 +1074,7 @@ const verifyEmail = createAuthEndpoint(
|
|
|
982
1074
|
if (!currentSession || currentSession.user.email !== parsed.email) {
|
|
983
1075
|
const session = await ctx.context.internalAdapter.createSession(
|
|
984
1076
|
user.user.id,
|
|
985
|
-
ctx.
|
|
1077
|
+
ctx.headers
|
|
986
1078
|
);
|
|
987
1079
|
if (!session) {
|
|
988
1080
|
throw new betterCall.APIError("INTERNAL_SERVER_ERROR", {
|
|
@@ -1020,7 +1112,8 @@ async function handleOAuthUserInfo(c, {
|
|
|
1020
1112
|
userInfo,
|
|
1021
1113
|
account,
|
|
1022
1114
|
callbackURL,
|
|
1023
|
-
disableSignUp
|
|
1115
|
+
disableSignUp,
|
|
1116
|
+
overrideUserInfo
|
|
1024
1117
|
}) {
|
|
1025
1118
|
const dbUser = await c.context.internalAdapter.findOAuthUser(
|
|
1026
1119
|
userInfo.email.toLowerCase(),
|
|
@@ -1098,6 +1191,13 @@ async function handleOAuthUserInfo(c, {
|
|
|
1098
1191
|
);
|
|
1099
1192
|
}
|
|
1100
1193
|
}
|
|
1194
|
+
if (overrideUserInfo) {
|
|
1195
|
+
await c.context.internalAdapter.updateUser(dbUser.user.id, {
|
|
1196
|
+
...userInfo,
|
|
1197
|
+
email: userInfo.email.toLowerCase(),
|
|
1198
|
+
emailVerified: userInfo.email.toLocaleLowerCase() === dbUser.user.email ? dbUser.user.emailVerified || userInfo.emailVerified : userInfo.emailVerified
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1101
1201
|
} else {
|
|
1102
1202
|
if (disableSignUp) {
|
|
1103
1203
|
return {
|
|
@@ -1107,11 +1207,11 @@ async function handleOAuthUserInfo(c, {
|
|
|
1107
1207
|
};
|
|
1108
1208
|
}
|
|
1109
1209
|
try {
|
|
1210
|
+
const { id: _, ...restUserInfo } = userInfo;
|
|
1110
1211
|
user = await c.context.internalAdapter.createOAuthUser(
|
|
1111
1212
|
{
|
|
1112
|
-
...
|
|
1113
|
-
email: userInfo.email.toLowerCase()
|
|
1114
|
-
id: void 0
|
|
1213
|
+
...restUserInfo,
|
|
1214
|
+
email: userInfo.email.toLowerCase()
|
|
1115
1215
|
},
|
|
1116
1216
|
{
|
|
1117
1217
|
accessToken: account.accessToken,
|
|
@@ -1167,7 +1267,7 @@ async function handleOAuthUserInfo(c, {
|
|
|
1167
1267
|
}
|
|
1168
1268
|
const session = await c.context.internalAdapter.createSession(
|
|
1169
1269
|
user.id,
|
|
1170
|
-
c.
|
|
1270
|
+
c.headers
|
|
1171
1271
|
);
|
|
1172
1272
|
if (!session) {
|
|
1173
1273
|
return {
|
|
@@ -1297,29 +1397,64 @@ const signInSocial = createAuthEndpoint(
|
|
|
1297
1397
|
metadata: {
|
|
1298
1398
|
openapi: {
|
|
1299
1399
|
description: "Sign in with a social provider",
|
|
1400
|
+
operationId: "socialSignIn",
|
|
1300
1401
|
responses: {
|
|
1301
1402
|
"200": {
|
|
1302
|
-
description: "Success",
|
|
1403
|
+
description: "Success - Returns either session details or redirect URL",
|
|
1303
1404
|
content: {
|
|
1304
1405
|
"application/json": {
|
|
1305
1406
|
schema: {
|
|
1407
|
+
// todo: we need support for multiple schema
|
|
1306
1408
|
type: "object",
|
|
1409
|
+
description: "Session response when idToken is provided",
|
|
1307
1410
|
properties: {
|
|
1308
|
-
|
|
1309
|
-
type: "
|
|
1310
|
-
|
|
1311
|
-
user: {
|
|
1312
|
-
type: "object",
|
|
1313
|
-
ref: "#/components/schemas/User"
|
|
1411
|
+
redirect: {
|
|
1412
|
+
type: "boolean",
|
|
1413
|
+
enum: [false]
|
|
1314
1414
|
},
|
|
1315
|
-
|
|
1316
|
-
type: "string"
|
|
1415
|
+
token: {
|
|
1416
|
+
type: "string",
|
|
1417
|
+
description: "Session token",
|
|
1418
|
+
url: {
|
|
1419
|
+
type: "null",
|
|
1420
|
+
nullable: true
|
|
1421
|
+
},
|
|
1422
|
+
user: {
|
|
1423
|
+
type: "object",
|
|
1424
|
+
properties: {
|
|
1425
|
+
id: { type: "string" },
|
|
1426
|
+
email: { type: "string" },
|
|
1427
|
+
name: {
|
|
1428
|
+
type: "string",
|
|
1429
|
+
nullable: true
|
|
1430
|
+
},
|
|
1431
|
+
image: {
|
|
1432
|
+
type: "string",
|
|
1433
|
+
nullable: true
|
|
1434
|
+
},
|
|
1435
|
+
emailVerified: {
|
|
1436
|
+
type: "boolean"
|
|
1437
|
+
},
|
|
1438
|
+
createdAt: {
|
|
1439
|
+
type: "string",
|
|
1440
|
+
format: "date-time"
|
|
1441
|
+
},
|
|
1442
|
+
updatedAt: {
|
|
1443
|
+
type: "string",
|
|
1444
|
+
format: "date-time"
|
|
1445
|
+
}
|
|
1446
|
+
},
|
|
1447
|
+
required: [
|
|
1448
|
+
"id",
|
|
1449
|
+
"email",
|
|
1450
|
+
"emailVerified",
|
|
1451
|
+
"createdAt",
|
|
1452
|
+
"updatedAt"
|
|
1453
|
+
]
|
|
1454
|
+
}
|
|
1317
1455
|
},
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
}
|
|
1321
|
-
},
|
|
1322
|
-
required: ["redirect"]
|
|
1456
|
+
required: ["redirect", "token", "user"]
|
|
1457
|
+
}
|
|
1323
1458
|
}
|
|
1324
1459
|
}
|
|
1325
1460
|
}
|
|
@@ -1378,7 +1513,14 @@ const signInSocial = createAuthEndpoint(
|
|
|
1378
1513
|
message: BASE_ERROR_CODES.FAILED_TO_GET_USER_INFO
|
|
1379
1514
|
});
|
|
1380
1515
|
}
|
|
1381
|
-
|
|
1516
|
+
const mapProfileToUser = await provider.options?.mapProfileToUser?.(
|
|
1517
|
+
userInfo.user
|
|
1518
|
+
);
|
|
1519
|
+
const userData = {
|
|
1520
|
+
...userInfo.user,
|
|
1521
|
+
...mapProfileToUser
|
|
1522
|
+
};
|
|
1523
|
+
if (!userData.email) {
|
|
1382
1524
|
c.context.logger.error("User email not found", {
|
|
1383
1525
|
provider: c.body.provider
|
|
1384
1526
|
});
|
|
@@ -1388,11 +1530,12 @@ const signInSocial = createAuthEndpoint(
|
|
|
1388
1530
|
}
|
|
1389
1531
|
const data = await handleOAuthUserInfo(c, {
|
|
1390
1532
|
userInfo: {
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1533
|
+
...userData,
|
|
1534
|
+
email: userData.email,
|
|
1535
|
+
id: userData.id,
|
|
1536
|
+
name: userData.name || "",
|
|
1537
|
+
image: userData.image,
|
|
1538
|
+
emailVerified: userData.emailVerified || false
|
|
1396
1539
|
},
|
|
1397
1540
|
account: {
|
|
1398
1541
|
providerId: provider.id,
|
|
@@ -1473,27 +1616,61 @@ const signInEmail = createAuthEndpoint(
|
|
|
1473
1616
|
description: "Sign in with email and password",
|
|
1474
1617
|
responses: {
|
|
1475
1618
|
"200": {
|
|
1476
|
-
description: "Success",
|
|
1619
|
+
description: "Success - Returns either session details or redirect URL",
|
|
1477
1620
|
content: {
|
|
1478
1621
|
"application/json": {
|
|
1479
1622
|
schema: {
|
|
1623
|
+
// todo: we need support for multiple schema
|
|
1480
1624
|
type: "object",
|
|
1625
|
+
description: "Session response when idToken is provided",
|
|
1481
1626
|
properties: {
|
|
1482
|
-
|
|
1483
|
-
type: "
|
|
1627
|
+
redirect: {
|
|
1628
|
+
type: "boolean",
|
|
1629
|
+
enum: [false]
|
|
1484
1630
|
},
|
|
1485
|
-
|
|
1486
|
-
type: "
|
|
1487
|
-
|
|
1631
|
+
token: {
|
|
1632
|
+
type: "string",
|
|
1633
|
+
description: "Session token"
|
|
1488
1634
|
},
|
|
1489
1635
|
url: {
|
|
1490
|
-
type: "
|
|
1636
|
+
type: "null",
|
|
1637
|
+
nullable: true
|
|
1491
1638
|
},
|
|
1492
|
-
|
|
1493
|
-
type: "
|
|
1639
|
+
user: {
|
|
1640
|
+
type: "object",
|
|
1641
|
+
properties: {
|
|
1642
|
+
id: { type: "string" },
|
|
1643
|
+
email: { type: "string" },
|
|
1644
|
+
name: {
|
|
1645
|
+
type: "string",
|
|
1646
|
+
nullable: true
|
|
1647
|
+
},
|
|
1648
|
+
image: {
|
|
1649
|
+
type: "string",
|
|
1650
|
+
nullable: true
|
|
1651
|
+
},
|
|
1652
|
+
emailVerified: {
|
|
1653
|
+
type: "boolean"
|
|
1654
|
+
},
|
|
1655
|
+
createdAt: {
|
|
1656
|
+
type: "string",
|
|
1657
|
+
format: "date-time"
|
|
1658
|
+
},
|
|
1659
|
+
updatedAt: {
|
|
1660
|
+
type: "string",
|
|
1661
|
+
format: "date-time"
|
|
1662
|
+
}
|
|
1663
|
+
},
|
|
1664
|
+
required: [
|
|
1665
|
+
"id",
|
|
1666
|
+
"email",
|
|
1667
|
+
"emailVerified",
|
|
1668
|
+
"createdAt",
|
|
1669
|
+
"updatedAt"
|
|
1670
|
+
]
|
|
1494
1671
|
}
|
|
1495
1672
|
},
|
|
1496
|
-
required: ["
|
|
1673
|
+
required: ["redirect", "token", "user"]
|
|
1497
1674
|
}
|
|
1498
1675
|
}
|
|
1499
1676
|
}
|
|
@@ -1620,7 +1797,8 @@ const schema = zod.z.object({
|
|
|
1620
1797
|
error: zod.z.string().optional(),
|
|
1621
1798
|
device_id: zod.z.string().optional(),
|
|
1622
1799
|
error_description: zod.z.string().optional(),
|
|
1623
|
-
state: zod.z.string().optional()
|
|
1800
|
+
state: zod.z.string().optional(),
|
|
1801
|
+
user: zod.z.string().optional()
|
|
1624
1802
|
});
|
|
1625
1803
|
const callbackOAuth = createAuthEndpoint(
|
|
1626
1804
|
"/callback/:id",
|
|
@@ -1699,7 +1877,10 @@ const callbackOAuth = createAuthEndpoint(
|
|
|
1699
1877
|
c.context.logger.error("", e);
|
|
1700
1878
|
throw redirectOnError("invalid_code");
|
|
1701
1879
|
}
|
|
1702
|
-
const userInfo = await provider.getUserInfo(
|
|
1880
|
+
const userInfo = await provider.getUserInfo({
|
|
1881
|
+
...tokens,
|
|
1882
|
+
user: c.body?.user ? json.safeJSONParse(c.body.user) : void 0
|
|
1883
|
+
}).then((res) => res?.user);
|
|
1703
1884
|
if (!userInfo) {
|
|
1704
1885
|
c.context.logger.error("Unable to get user info");
|
|
1705
1886
|
return redirectOnError("unable_to_get_user_info");
|
|
@@ -1722,19 +1903,34 @@ const callbackOAuth = createAuthEndpoint(
|
|
|
1722
1903
|
if (existingAccount.userId.toString() !== link.userId.toString()) {
|
|
1723
1904
|
return redirectOnError("account_already_linked_to_different_user");
|
|
1724
1905
|
}
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1906
|
+
const updateData = Object.fromEntries(
|
|
1907
|
+
Object.entries({
|
|
1908
|
+
accessToken: tokens.accessToken,
|
|
1909
|
+
idToken: tokens.idToken,
|
|
1910
|
+
refreshToken: tokens.refreshToken,
|
|
1911
|
+
accessTokenExpiresAt: tokens.accessTokenExpiresAt,
|
|
1912
|
+
refreshTokenExpiresAt: tokens.refreshTokenExpiresAt,
|
|
1913
|
+
scope: tokens.scopes?.join(",")
|
|
1914
|
+
}).filter(([_, value]) => value !== void 0)
|
|
1915
|
+
);
|
|
1916
|
+
await c.context.internalAdapter.updateAccount(
|
|
1917
|
+
existingAccount.id,
|
|
1918
|
+
updateData
|
|
1919
|
+
);
|
|
1920
|
+
} else {
|
|
1921
|
+
const newAccount = await c.context.internalAdapter.createAccount(
|
|
1922
|
+
{
|
|
1923
|
+
userId: link.userId,
|
|
1924
|
+
providerId: provider.id,
|
|
1925
|
+
accountId: userInfo.id,
|
|
1926
|
+
...tokens,
|
|
1927
|
+
scope: tokens.scopes?.join(",")
|
|
1928
|
+
},
|
|
1929
|
+
c
|
|
1930
|
+
);
|
|
1931
|
+
if (!newAccount) {
|
|
1932
|
+
return redirectOnError("unable_to_link_account");
|
|
1933
|
+
}
|
|
1738
1934
|
}
|
|
1739
1935
|
let toRedirectTo2;
|
|
1740
1936
|
try {
|
|
@@ -2116,9 +2312,9 @@ const updateUser = () => createAuthEndpoint(
|
|
|
2116
2312
|
schema: {
|
|
2117
2313
|
type: "object",
|
|
2118
2314
|
properties: {
|
|
2119
|
-
|
|
2120
|
-
type: "
|
|
2121
|
-
|
|
2315
|
+
status: {
|
|
2316
|
+
type: "boolean",
|
|
2317
|
+
description: "Indicates if the update was successful"
|
|
2122
2318
|
}
|
|
2123
2319
|
}
|
|
2124
2320
|
}
|
|
@@ -2197,17 +2393,66 @@ const changePassword = createAuthEndpoint(
|
|
|
2197
2393
|
description: "Change the password of the user",
|
|
2198
2394
|
responses: {
|
|
2199
2395
|
"200": {
|
|
2200
|
-
description: "
|
|
2396
|
+
description: "Password successfully changed",
|
|
2201
2397
|
content: {
|
|
2202
2398
|
"application/json": {
|
|
2203
2399
|
schema: {
|
|
2204
2400
|
type: "object",
|
|
2205
2401
|
properties: {
|
|
2402
|
+
token: {
|
|
2403
|
+
type: "string",
|
|
2404
|
+
nullable: true,
|
|
2405
|
+
// Only present if revokeOtherSessions is true
|
|
2406
|
+
description: "New session token if other sessions were revoked"
|
|
2407
|
+
},
|
|
2206
2408
|
user: {
|
|
2207
|
-
|
|
2208
|
-
|
|
2409
|
+
type: "object",
|
|
2410
|
+
properties: {
|
|
2411
|
+
id: {
|
|
2412
|
+
type: "string",
|
|
2413
|
+
description: "The unique identifier of the user"
|
|
2414
|
+
},
|
|
2415
|
+
email: {
|
|
2416
|
+
type: "string",
|
|
2417
|
+
format: "email",
|
|
2418
|
+
description: "The email address of the user"
|
|
2419
|
+
},
|
|
2420
|
+
name: {
|
|
2421
|
+
type: "string",
|
|
2422
|
+
description: "The name of the user"
|
|
2423
|
+
},
|
|
2424
|
+
image: {
|
|
2425
|
+
type: "string",
|
|
2426
|
+
format: "uri",
|
|
2427
|
+
nullable: true,
|
|
2428
|
+
description: "The profile image URL of the user"
|
|
2429
|
+
},
|
|
2430
|
+
emailVerified: {
|
|
2431
|
+
type: "boolean",
|
|
2432
|
+
description: "Whether the email has been verified"
|
|
2433
|
+
},
|
|
2434
|
+
createdAt: {
|
|
2435
|
+
type: "string",
|
|
2436
|
+
format: "date-time",
|
|
2437
|
+
description: "When the user was created"
|
|
2438
|
+
},
|
|
2439
|
+
updatedAt: {
|
|
2440
|
+
type: "string",
|
|
2441
|
+
format: "date-time",
|
|
2442
|
+
description: "When the user was last updated"
|
|
2443
|
+
}
|
|
2444
|
+
},
|
|
2445
|
+
required: [
|
|
2446
|
+
"id",
|
|
2447
|
+
"email",
|
|
2448
|
+
"name",
|
|
2449
|
+
"emailVerified",
|
|
2450
|
+
"createdAt",
|
|
2451
|
+
"updatedAt"
|
|
2452
|
+
]
|
|
2209
2453
|
}
|
|
2210
|
-
}
|
|
2454
|
+
},
|
|
2455
|
+
required: ["user"]
|
|
2211
2456
|
}
|
|
2212
2457
|
}
|
|
2213
2458
|
}
|
|
@@ -2373,11 +2618,23 @@ const deleteUser = createAuthEndpoint(
|
|
|
2373
2618
|
description: "Delete the user",
|
|
2374
2619
|
responses: {
|
|
2375
2620
|
"200": {
|
|
2376
|
-
description: "
|
|
2621
|
+
description: "User deletion processed successfully",
|
|
2377
2622
|
content: {
|
|
2378
2623
|
"application/json": {
|
|
2379
2624
|
schema: {
|
|
2380
|
-
type: "object"
|
|
2625
|
+
type: "object",
|
|
2626
|
+
properties: {
|
|
2627
|
+
success: {
|
|
2628
|
+
type: "boolean",
|
|
2629
|
+
description: "Indicates if the operation was successful"
|
|
2630
|
+
},
|
|
2631
|
+
message: {
|
|
2632
|
+
type: "string",
|
|
2633
|
+
enum: ["User deleted", "Verification email sent"],
|
|
2634
|
+
description: "Status message of the deletion process"
|
|
2635
|
+
}
|
|
2636
|
+
},
|
|
2637
|
+
required: ["success", "message"]
|
|
2381
2638
|
}
|
|
2382
2639
|
}
|
|
2383
2640
|
}
|
|
@@ -2447,7 +2704,9 @@ const deleteUser = createAuthEndpoint(
|
|
|
2447
2704
|
await ctx.context.internalAdapter.createVerificationValue({
|
|
2448
2705
|
value: session.user.id,
|
|
2449
2706
|
identifier: `delete-account-${token}`,
|
|
2450
|
-
expiresAt: new Date(
|
|
2707
|
+
expiresAt: new Date(
|
|
2708
|
+
Date.now() + (ctx.context.options.user.deleteUser?.deleteTokenExpiresIn || 60 * 60 * 24) * 1e3
|
|
2709
|
+
)
|
|
2451
2710
|
});
|
|
2452
2711
|
const url = `${ctx.context.baseURL}/delete-user/callback?token=${token}&callbackURL=${ctx.body.callbackURL || "/"}`;
|
|
2453
2712
|
await ctx.context.options.user.deleteUser.sendDeleteAccountVerification(
|
|
@@ -2489,7 +2748,36 @@ const deleteUserCallback = createAuthEndpoint(
|
|
|
2489
2748
|
token: zod.z.string(),
|
|
2490
2749
|
callbackURL: zod.z.string().optional()
|
|
2491
2750
|
}),
|
|
2492
|
-
use: [originCheck((ctx) => ctx.query.callbackURL)]
|
|
2751
|
+
use: [originCheck((ctx) => ctx.query.callbackURL)],
|
|
2752
|
+
metadata: {
|
|
2753
|
+
openapi: {
|
|
2754
|
+
description: "Callback to complete user deletion with verification token",
|
|
2755
|
+
responses: {
|
|
2756
|
+
"200": {
|
|
2757
|
+
description: "User successfully deleted",
|
|
2758
|
+
content: {
|
|
2759
|
+
"application/json": {
|
|
2760
|
+
schema: {
|
|
2761
|
+
type: "object",
|
|
2762
|
+
properties: {
|
|
2763
|
+
success: {
|
|
2764
|
+
type: "boolean",
|
|
2765
|
+
description: "Indicates if the deletion was successful"
|
|
2766
|
+
},
|
|
2767
|
+
message: {
|
|
2768
|
+
type: "string",
|
|
2769
|
+
enum: ["User deleted"],
|
|
2770
|
+
description: "Confirmation message"
|
|
2771
|
+
}
|
|
2772
|
+
},
|
|
2773
|
+
required: ["success", "message"]
|
|
2774
|
+
}
|
|
2775
|
+
}
|
|
2776
|
+
}
|
|
2777
|
+
}
|
|
2778
|
+
}
|
|
2779
|
+
}
|
|
2780
|
+
}
|
|
2493
2781
|
},
|
|
2494
2782
|
async (ctx) => {
|
|
2495
2783
|
if (!ctx.context.options.user?.deleteUser?.enabled) {
|
|
@@ -2556,20 +2844,24 @@ const changeEmail = createAuthEndpoint(
|
|
|
2556
2844
|
openapi: {
|
|
2557
2845
|
responses: {
|
|
2558
2846
|
"200": {
|
|
2559
|
-
description: "
|
|
2847
|
+
description: "Email change request processed successfully",
|
|
2560
2848
|
content: {
|
|
2561
2849
|
"application/json": {
|
|
2562
2850
|
schema: {
|
|
2563
2851
|
type: "object",
|
|
2564
2852
|
properties: {
|
|
2565
|
-
user: {
|
|
2566
|
-
type: "object",
|
|
2567
|
-
ref: "#/components/schemas/User"
|
|
2568
|
-
},
|
|
2569
2853
|
status: {
|
|
2570
|
-
type: "boolean"
|
|
2854
|
+
type: "boolean",
|
|
2855
|
+
description: "Indicates if the request was successful"
|
|
2856
|
+
},
|
|
2857
|
+
message: {
|
|
2858
|
+
type: "string",
|
|
2859
|
+
enum: ["Email updated", "Verification email sent"],
|
|
2860
|
+
description: "Status message of the email change process",
|
|
2861
|
+
nullable: true
|
|
2571
2862
|
}
|
|
2572
|
-
}
|
|
2863
|
+
},
|
|
2864
|
+
required: ["status"]
|
|
2573
2865
|
}
|
|
2574
2866
|
}
|
|
2575
2867
|
}
|
|
@@ -2772,7 +3064,8 @@ const error = createAuthEndpoint(
|
|
|
2772
3064
|
content: {
|
|
2773
3065
|
"text/html": {
|
|
2774
3066
|
schema: {
|
|
2775
|
-
type: "string"
|
|
3067
|
+
type: "string",
|
|
3068
|
+
description: "The HTML content of the error page"
|
|
2776
3069
|
}
|
|
2777
3070
|
}
|
|
2778
3071
|
}
|
|
@@ -2801,16 +3094,18 @@ const ok = createAuthEndpoint(
|
|
|
2801
3094
|
description: "Check if the API is working",
|
|
2802
3095
|
responses: {
|
|
2803
3096
|
"200": {
|
|
2804
|
-
description: "
|
|
3097
|
+
description: "API is working",
|
|
2805
3098
|
content: {
|
|
2806
3099
|
"application/json": {
|
|
2807
3100
|
schema: {
|
|
2808
3101
|
type: "object",
|
|
2809
3102
|
properties: {
|
|
2810
3103
|
ok: {
|
|
2811
|
-
type: "boolean"
|
|
3104
|
+
type: "boolean",
|
|
3105
|
+
description: "Indicates if the API is working"
|
|
2812
3106
|
}
|
|
2813
|
-
}
|
|
3107
|
+
},
|
|
3108
|
+
required: ["ok"]
|
|
2814
3109
|
}
|
|
2815
3110
|
}
|
|
2816
3111
|
}
|
|
@@ -2851,20 +3146,32 @@ const listUserAccounts = createAuthEndpoint(
|
|
|
2851
3146
|
type: "string"
|
|
2852
3147
|
},
|
|
2853
3148
|
createdAt: {
|
|
2854
|
-
type: "string"
|
|
3149
|
+
type: "string",
|
|
3150
|
+
format: "date-time"
|
|
2855
3151
|
},
|
|
2856
3152
|
updatedAt: {
|
|
3153
|
+
type: "string",
|
|
3154
|
+
format: "date-time"
|
|
3155
|
+
}
|
|
3156
|
+
},
|
|
3157
|
+
accountId: {
|
|
3158
|
+
type: "string"
|
|
3159
|
+
},
|
|
3160
|
+
scopes: {
|
|
3161
|
+
type: "array",
|
|
3162
|
+
items: {
|
|
2857
3163
|
type: "string"
|
|
2858
|
-
},
|
|
2859
|
-
accountId: {
|
|
2860
|
-
type: "string"
|
|
2861
|
-
},
|
|
2862
|
-
scopes: {
|
|
2863
|
-
type: "array",
|
|
2864
|
-
items: { type: "string" }
|
|
2865
3164
|
}
|
|
2866
3165
|
}
|
|
2867
|
-
}
|
|
3166
|
+
},
|
|
3167
|
+
required: [
|
|
3168
|
+
"id",
|
|
3169
|
+
"provider",
|
|
3170
|
+
"createdAt",
|
|
3171
|
+
"updatedAt",
|
|
3172
|
+
"accountId",
|
|
3173
|
+
"scopes"
|
|
3174
|
+
]
|
|
2868
3175
|
}
|
|
2869
3176
|
}
|
|
2870
3177
|
}
|
|
@@ -2907,7 +3214,15 @@ const linkSocialAccount = createAuthEndpoint(
|
|
|
2907
3214
|
*/
|
|
2908
3215
|
provider: zod.z.enum(socialProviders_index.socialProviderList, {
|
|
2909
3216
|
description: "The OAuth2 provider to use"
|
|
2910
|
-
})
|
|
3217
|
+
}),
|
|
3218
|
+
/**
|
|
3219
|
+
* Additional scopes to request when linking the account.
|
|
3220
|
+
* This is useful for requesting additional permissions when
|
|
3221
|
+
* linking a social account compared to the initial authentication.
|
|
3222
|
+
*/
|
|
3223
|
+
scopes: zod.z.array(zod.z.string(), {
|
|
3224
|
+
description: "Additional scopes to request from the provider"
|
|
3225
|
+
}).optional()
|
|
2911
3226
|
}),
|
|
2912
3227
|
use: [sessionMiddleware],
|
|
2913
3228
|
metadata: {
|
|
@@ -2922,10 +3237,12 @@ const linkSocialAccount = createAuthEndpoint(
|
|
|
2922
3237
|
type: "object",
|
|
2923
3238
|
properties: {
|
|
2924
3239
|
url: {
|
|
2925
|
-
type: "string"
|
|
3240
|
+
type: "string",
|
|
3241
|
+
description: "The authorization URL to redirect the user to"
|
|
2926
3242
|
},
|
|
2927
3243
|
redirect: {
|
|
2928
|
-
type: "boolean"
|
|
3244
|
+
type: "boolean",
|
|
3245
|
+
description: "Indicates if the user should be redirected to the authorization URL"
|
|
2929
3246
|
}
|
|
2930
3247
|
},
|
|
2931
3248
|
required: ["url", "redirect"]
|
|
@@ -2960,7 +3277,8 @@ const linkSocialAccount = createAuthEndpoint(
|
|
|
2960
3277
|
const url = await provider.createAuthorizationURL({
|
|
2961
3278
|
state: state$1.state,
|
|
2962
3279
|
codeVerifier: state$1.codeVerifier,
|
|
2963
|
-
redirectURI: `${c.context.baseURL}/callback/${provider.id}
|
|
3280
|
+
redirectURI: `${c.context.baseURL}/callback/${provider.id}`,
|
|
3281
|
+
scopes: c.body.scopes
|
|
2964
3282
|
});
|
|
2965
3283
|
return c.json({
|
|
2966
3284
|
url: url.toString(),
|
|
@@ -2976,7 +3294,29 @@ const unlinkAccount = createAuthEndpoint(
|
|
|
2976
3294
|
providerId: zod.z.string(),
|
|
2977
3295
|
accountId: zod.z.string().optional()
|
|
2978
3296
|
}),
|
|
2979
|
-
use: [freshSessionMiddleware]
|
|
3297
|
+
use: [freshSessionMiddleware],
|
|
3298
|
+
metadata: {
|
|
3299
|
+
openapi: {
|
|
3300
|
+
description: "Unlink an account",
|
|
3301
|
+
responses: {
|
|
3302
|
+
"200": {
|
|
3303
|
+
description: "Success",
|
|
3304
|
+
content: {
|
|
3305
|
+
"application/json": {
|
|
3306
|
+
schema: {
|
|
3307
|
+
type: "object",
|
|
3308
|
+
properties: {
|
|
3309
|
+
status: {
|
|
3310
|
+
type: "boolean"
|
|
3311
|
+
}
|
|
3312
|
+
}
|
|
3313
|
+
}
|
|
3314
|
+
}
|
|
3315
|
+
}
|
|
3316
|
+
}
|
|
3317
|
+
}
|
|
3318
|
+
}
|
|
3319
|
+
}
|
|
2980
3320
|
},
|
|
2981
3321
|
async (ctx) => {
|
|
2982
3322
|
const { providerId, accountId } = ctx.body;
|