@better-auth/sso 1.5.0 → 1.5.1-beta.2
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/client.d.mts +1 -2
- package/dist/{index-BQp9TZiG.d.mts → index-DoxMd-mL.d.mts} +61 -11
- package/dist/index.d.mts +2 -56
- package/dist/index.mjs +24 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
package/dist/client.d.mts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { APIError } from "better-auth/api";
|
|
2
|
-
import * as z
|
|
3
|
-
import
|
|
4
|
-
import { Awaitable, OAuth2Tokens, User } from "better-auth";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { Awaitable, BetterAuthPlugin, OAuth2Tokens, User } from "better-auth";
|
|
5
4
|
import * as better_call0 from "better-call";
|
|
6
5
|
|
|
7
6
|
//#region src/saml/algorithms.d.ts
|
|
@@ -418,9 +417,9 @@ interface SSOOptions {
|
|
|
418
417
|
//#region src/routes/domain-verification.d.ts
|
|
419
418
|
declare const requestDomainVerification: (options: SSOOptions) => better_call0.StrictEndpoint<"/sso/request-domain-verification", {
|
|
420
419
|
method: "POST";
|
|
421
|
-
body: z
|
|
422
|
-
providerId: z
|
|
423
|
-
}, z
|
|
420
|
+
body: z.ZodObject<{
|
|
421
|
+
providerId: z.ZodString;
|
|
422
|
+
}, z.core.$strip>;
|
|
424
423
|
metadata: {
|
|
425
424
|
openapi: {
|
|
426
425
|
summary: string;
|
|
@@ -466,9 +465,9 @@ declare const requestDomainVerification: (options: SSOOptions) => better_call0.S
|
|
|
466
465
|
}>;
|
|
467
466
|
declare const verifyDomain: (options: SSOOptions) => better_call0.StrictEndpoint<"/sso/verify-domain", {
|
|
468
467
|
method: "POST";
|
|
469
|
-
body: z
|
|
470
|
-
providerId: z
|
|
471
|
-
}, z
|
|
468
|
+
body: z.ZodObject<{
|
|
469
|
+
providerId: z.ZodString;
|
|
470
|
+
}, z.core.$strip>;
|
|
472
471
|
metadata: {
|
|
473
472
|
openapi: {
|
|
474
473
|
summary: string;
|
|
@@ -1721,5 +1720,56 @@ declare function selectTokenEndpointAuthMethod(doc: OIDCDiscoveryDocument, exist
|
|
|
1721
1720
|
*/
|
|
1722
1721
|
declare function needsRuntimeDiscovery(config: Partial<HydratedOIDCConfig> | undefined): boolean;
|
|
1723
1722
|
//#endregion
|
|
1724
|
-
|
|
1725
|
-
|
|
1723
|
+
//#region src/index.d.ts
|
|
1724
|
+
declare module "@better-auth/core" {
|
|
1725
|
+
interface BetterAuthPluginRegistry<AuthOptions, Options> {
|
|
1726
|
+
sso: {
|
|
1727
|
+
creator: typeof sso;
|
|
1728
|
+
};
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
type DomainVerificationEndpoints = {
|
|
1732
|
+
requestDomainVerification: ReturnType<typeof requestDomainVerification>;
|
|
1733
|
+
verifyDomain: ReturnType<typeof verifyDomain>;
|
|
1734
|
+
};
|
|
1735
|
+
type SSOEndpoints<O extends SSOOptions> = {
|
|
1736
|
+
spMetadata: ReturnType<typeof spMetadata>;
|
|
1737
|
+
registerSSOProvider: ReturnType<typeof registerSSOProvider<O>>;
|
|
1738
|
+
signInSSO: ReturnType<typeof signInSSO>;
|
|
1739
|
+
callbackSSO: ReturnType<typeof callbackSSO>;
|
|
1740
|
+
callbackSSOShared: ReturnType<typeof callbackSSOShared>;
|
|
1741
|
+
callbackSSOSAML: ReturnType<typeof callbackSSOSAML>;
|
|
1742
|
+
acsEndpoint: ReturnType<typeof acsEndpoint>;
|
|
1743
|
+
sloEndpoint: ReturnType<typeof sloEndpoint>;
|
|
1744
|
+
initiateSLO: ReturnType<typeof initiateSLO>;
|
|
1745
|
+
listSSOProviders: ReturnType<typeof listSSOProviders>;
|
|
1746
|
+
getSSOProvider: ReturnType<typeof getSSOProvider>;
|
|
1747
|
+
updateSSOProvider: ReturnType<typeof updateSSOProvider>;
|
|
1748
|
+
deleteSSOProvider: ReturnType<typeof deleteSSOProvider>;
|
|
1749
|
+
};
|
|
1750
|
+
type SSOPlugin<O extends SSOOptions> = {
|
|
1751
|
+
id: "sso";
|
|
1752
|
+
endpoints: SSOEndpoints<O> & (O extends {
|
|
1753
|
+
domainVerification: {
|
|
1754
|
+
enabled: true;
|
|
1755
|
+
};
|
|
1756
|
+
} ? DomainVerificationEndpoints : {});
|
|
1757
|
+
};
|
|
1758
|
+
declare function sso<O extends SSOOptions & {
|
|
1759
|
+
domainVerification?: {
|
|
1760
|
+
enabled: true;
|
|
1761
|
+
};
|
|
1762
|
+
}>(options?: O | undefined): {
|
|
1763
|
+
id: "sso";
|
|
1764
|
+
endpoints: SSOEndpoints<O> & DomainVerificationEndpoints;
|
|
1765
|
+
schema: NonNullable<BetterAuthPlugin["schema"]>;
|
|
1766
|
+
options: O;
|
|
1767
|
+
};
|
|
1768
|
+
declare function sso<O extends SSOOptions>(options?: O | undefined): {
|
|
1769
|
+
id: "sso";
|
|
1770
|
+
endpoints: SSOEndpoints<O>;
|
|
1771
|
+
options: O;
|
|
1772
|
+
};
|
|
1773
|
+
//#endregion
|
|
1774
|
+
export { DataEncryptionAlgorithm as A, TimestampValidationOptions as C, SSOOptions as D, SAMLConfig as E, DigestAlgorithm as M, KeyEncryptionAlgorithm as N, SSOProvider as O, SignatureAlgorithm as P, SAMLConditions as S, OIDCConfig as T, REQUIRED_DISCOVERY_FIELDS as _, fetchDiscoveryDocument as a, DEFAULT_MAX_SAML_METADATA_SIZE as b, normalizeUrl as c, validateDiscoveryUrl as d, DiscoverOIDCConfigParams as f, OIDCDiscoveryDocument as g, HydratedOIDCConfig as h, discoverOIDCConfig as i, DeprecatedAlgorithmBehavior as j, AlgorithmValidationOptions as k, selectTokenEndpointAuthMethod as l, DiscoveryErrorCode as m, sso as n, needsRuntimeDiscovery as o, DiscoveryError as p, computeDiscoveryUrl as r, normalizeDiscoveryUrls as s, SSOPlugin as t, validateDiscoveryDocument as u, RequiredDiscoveryField as v, validateSAMLTimestamp as w, DEFAULT_MAX_SAML_RESPONSE_SIZE as x, DEFAULT_CLOCK_SKEW_MS as y };
|
|
1775
|
+
//# sourceMappingURL=index-DoxMd-mL.d.mts.map
|
package/dist/index.d.mts
CHANGED
|
@@ -1,56 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
//#region src/index.d.ts
|
|
5
|
-
declare module "@better-auth/core" {
|
|
6
|
-
interface BetterAuthPluginRegistry<AuthOptions, Options> {
|
|
7
|
-
sso: {
|
|
8
|
-
creator: typeof sso;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
type DomainVerificationEndpoints = {
|
|
13
|
-
requestDomainVerification: ReturnType<typeof requestDomainVerification>;
|
|
14
|
-
verifyDomain: ReturnType<typeof verifyDomain>;
|
|
15
|
-
};
|
|
16
|
-
type SSOEndpoints<O extends SSOOptions> = {
|
|
17
|
-
spMetadata: ReturnType<typeof spMetadata>;
|
|
18
|
-
registerSSOProvider: ReturnType<typeof registerSSOProvider<O>>;
|
|
19
|
-
signInSSO: ReturnType<typeof signInSSO>;
|
|
20
|
-
callbackSSO: ReturnType<typeof callbackSSO>;
|
|
21
|
-
callbackSSOShared: ReturnType<typeof callbackSSOShared>;
|
|
22
|
-
callbackSSOSAML: ReturnType<typeof callbackSSOSAML>;
|
|
23
|
-
acsEndpoint: ReturnType<typeof acsEndpoint>;
|
|
24
|
-
sloEndpoint: ReturnType<typeof sloEndpoint>;
|
|
25
|
-
initiateSLO: ReturnType<typeof initiateSLO>;
|
|
26
|
-
listSSOProviders: ReturnType<typeof listSSOProviders>;
|
|
27
|
-
getSSOProvider: ReturnType<typeof getSSOProvider>;
|
|
28
|
-
updateSSOProvider: ReturnType<typeof updateSSOProvider>;
|
|
29
|
-
deleteSSOProvider: ReturnType<typeof deleteSSOProvider>;
|
|
30
|
-
};
|
|
31
|
-
type SSOPlugin<O extends SSOOptions> = {
|
|
32
|
-
id: "sso";
|
|
33
|
-
endpoints: SSOEndpoints<O> & (O extends {
|
|
34
|
-
domainVerification: {
|
|
35
|
-
enabled: true;
|
|
36
|
-
};
|
|
37
|
-
} ? DomainVerificationEndpoints : {});
|
|
38
|
-
};
|
|
39
|
-
declare function sso<O extends SSOOptions & {
|
|
40
|
-
domainVerification?: {
|
|
41
|
-
enabled: true;
|
|
42
|
-
};
|
|
43
|
-
}>(options?: O | undefined): {
|
|
44
|
-
id: "sso";
|
|
45
|
-
endpoints: SSOEndpoints<O> & DomainVerificationEndpoints;
|
|
46
|
-
schema: NonNullable<BetterAuthPlugin["schema"]>;
|
|
47
|
-
options: O;
|
|
48
|
-
};
|
|
49
|
-
declare function sso<O extends SSOOptions>(options?: O | undefined): {
|
|
50
|
-
id: "sso";
|
|
51
|
-
endpoints: SSOEndpoints<O>;
|
|
52
|
-
options: O;
|
|
53
|
-
};
|
|
54
|
-
//#endregion
|
|
55
|
-
export { type AlgorithmValidationOptions, DEFAULT_CLOCK_SKEW_MS, DEFAULT_MAX_SAML_METADATA_SIZE, DEFAULT_MAX_SAML_RESPONSE_SIZE, DataEncryptionAlgorithm, type DeprecatedAlgorithmBehavior, DigestAlgorithm, type DiscoverOIDCConfigParams, DiscoveryError, type DiscoveryErrorCode, type HydratedOIDCConfig, KeyEncryptionAlgorithm, type OIDCConfig, type OIDCDiscoveryDocument, REQUIRED_DISCOVERY_FIELDS, type RequiredDiscoveryField, type SAMLConditions, type SAMLConfig, type SSOOptions, SSOPlugin, type SSOProvider, SignatureAlgorithm, type TimestampValidationOptions, computeDiscoveryUrl, discoverOIDCConfig, fetchDiscoveryDocument, needsRuntimeDiscovery, normalizeDiscoveryUrls, normalizeUrl, selectTokenEndpointAuthMethod, sso, validateDiscoveryDocument, validateDiscoveryUrl, validateSAMLTimestamp };
|
|
56
|
-
//# sourceMappingURL=index.d.mts.map
|
|
1
|
+
import { A as DataEncryptionAlgorithm, C as TimestampValidationOptions, D as SSOOptions, E as SAMLConfig, M as DigestAlgorithm, N as KeyEncryptionAlgorithm, O as SSOProvider, P as SignatureAlgorithm, S as SAMLConditions, T as OIDCConfig, _ as REQUIRED_DISCOVERY_FIELDS, a as fetchDiscoveryDocument, b as DEFAULT_MAX_SAML_METADATA_SIZE, c as normalizeUrl, d as validateDiscoveryUrl, f as DiscoverOIDCConfigParams, g as OIDCDiscoveryDocument, h as HydratedOIDCConfig, i as discoverOIDCConfig, j as DeprecatedAlgorithmBehavior, k as AlgorithmValidationOptions, l as selectTokenEndpointAuthMethod, m as DiscoveryErrorCode, n as sso, o as needsRuntimeDiscovery, p as DiscoveryError, r as computeDiscoveryUrl, s as normalizeDiscoveryUrls, t as SSOPlugin, u as validateDiscoveryDocument, v as RequiredDiscoveryField, w as validateSAMLTimestamp, x as DEFAULT_MAX_SAML_RESPONSE_SIZE, y as DEFAULT_CLOCK_SKEW_MS } from "./index-DoxMd-mL.mjs";
|
|
2
|
+
export { AlgorithmValidationOptions, DEFAULT_CLOCK_SKEW_MS, DEFAULT_MAX_SAML_METADATA_SIZE, DEFAULT_MAX_SAML_RESPONSE_SIZE, DataEncryptionAlgorithm, DeprecatedAlgorithmBehavior, DigestAlgorithm, DiscoverOIDCConfigParams, DiscoveryError, DiscoveryErrorCode, HydratedOIDCConfig, KeyEncryptionAlgorithm, OIDCConfig, OIDCDiscoveryDocument, REQUIRED_DISCOVERY_FIELDS, RequiredDiscoveryField, SAMLConditions, SAMLConfig, SSOOptions, SSOPlugin, SSOProvider, SignatureAlgorithm, TimestampValidationOptions, computeDiscoveryUrl, discoverOIDCConfig, fetchDiscoveryDocument, needsRuntimeDiscovery, normalizeDiscoveryUrls, normalizeUrl, selectTokenEndpointAuthMethod, sso, validateDiscoveryDocument, validateDiscoveryUrl, validateSAMLTimestamp };
|
package/dist/index.mjs
CHANGED
|
@@ -3,8 +3,7 @@ import { XMLParser, XMLValidator } from "fast-xml-parser";
|
|
|
3
3
|
import saml from "samlify";
|
|
4
4
|
import { X509Certificate } from "node:crypto";
|
|
5
5
|
import { generateRandomString } from "better-auth/crypto";
|
|
6
|
-
import * as z
|
|
7
|
-
import z from "zod/v4";
|
|
6
|
+
import * as z from "zod";
|
|
8
7
|
import { base64 } from "@better-auth/utils/base64";
|
|
9
8
|
import { BetterFetchError, betterFetch } from "@better-fetch/fetch";
|
|
10
9
|
import { HIDE_METADATA, createAuthorizationURL, generateGenericState, generateState, parseGenericState, parseState, validateAuthorizationCode, validateToken } from "better-auth";
|
|
@@ -218,7 +217,7 @@ async function assignOrganizationByDomain(ctx, options) {
|
|
|
218
217
|
//#region src/routes/domain-verification.ts
|
|
219
218
|
const DNS_LABEL_MAX_LENGTH = 63;
|
|
220
219
|
const DEFAULT_TOKEN_PREFIX = "better-auth-token";
|
|
221
|
-
const domainVerificationBodySchema = z
|
|
220
|
+
const domainVerificationBodySchema = z.object({ providerId: z.string() });
|
|
222
221
|
function getVerificationIdentifier(options, providerId) {
|
|
223
222
|
return `_${options.domainVerification?.tokenPrefix || DEFAULT_TOKEN_PREFIX}-${providerId}`;
|
|
224
223
|
}
|
|
@@ -2374,7 +2373,20 @@ async function handleOIDCCallback(ctx, options, providerId, stateData) {
|
|
|
2374
2373
|
});
|
|
2375
2374
|
if (!tokenResponse) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=token_response_not_found`);
|
|
2376
2375
|
let userInfo = null;
|
|
2377
|
-
|
|
2376
|
+
const mapping = config.mapping || {};
|
|
2377
|
+
if (config.userInfoEndpoint) {
|
|
2378
|
+
const userInfoResponse = await betterFetch(config.userInfoEndpoint, { headers: { Authorization: `Bearer ${tokenResponse.accessToken}` } });
|
|
2379
|
+
if (userInfoResponse.error) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=${userInfoResponse.error.message}`);
|
|
2380
|
+
const rawUserInfo = userInfoResponse.data;
|
|
2381
|
+
userInfo = {
|
|
2382
|
+
...Object.fromEntries(Object.entries(mapping.extraFields || {}).map(([key, value]) => [key, rawUserInfo[value]])),
|
|
2383
|
+
id: rawUserInfo[mapping.id || "sub"],
|
|
2384
|
+
email: rawUserInfo[mapping.email || "email"],
|
|
2385
|
+
emailVerified: options?.trustEmailVerified ? rawUserInfo[mapping.emailVerified || "email_verified"] : false,
|
|
2386
|
+
name: rawUserInfo[mapping.name || "name"],
|
|
2387
|
+
image: rawUserInfo[mapping.image || "picture"]
|
|
2388
|
+
};
|
|
2389
|
+
} else if (tokenResponse.idToken) {
|
|
2378
2390
|
const idToken = decodeJwt(tokenResponse.idToken);
|
|
2379
2391
|
if (!config.jwksEndpoint) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=jwks_endpoint_not_found`);
|
|
2380
2392
|
const verified = await validateToken(tokenResponse.idToken, config.jwksEndpoint, {
|
|
@@ -2385,7 +2397,6 @@ async function handleOIDCCallback(ctx, options, providerId, stateData) {
|
|
|
2385
2397
|
return null;
|
|
2386
2398
|
});
|
|
2387
2399
|
if (!verified) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=token_not_verified`);
|
|
2388
|
-
const mapping = config.mapping || {};
|
|
2389
2400
|
userInfo = {
|
|
2390
2401
|
...Object.fromEntries(Object.entries(mapping.extraFields || {}).map(([key, value]) => [key, verified.payload[value]])),
|
|
2391
2402
|
id: idToken[mapping.id || "sub"],
|
|
@@ -2394,13 +2405,7 @@ async function handleOIDCCallback(ctx, options, providerId, stateData) {
|
|
|
2394
2405
|
name: idToken[mapping.name || "name"],
|
|
2395
2406
|
image: idToken[mapping.image || "picture"]
|
|
2396
2407
|
};
|
|
2397
|
-
}
|
|
2398
|
-
if (!userInfo) {
|
|
2399
|
-
if (!config.userInfoEndpoint) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=user_info_endpoint_not_found`);
|
|
2400
|
-
const userInfoResponse = await betterFetch(config.userInfoEndpoint, { headers: { Authorization: `Bearer ${tokenResponse.accessToken}` } });
|
|
2401
|
-
if (userInfoResponse.error) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=${userInfoResponse.error.message}`);
|
|
2402
|
-
userInfo = userInfoResponse.data;
|
|
2403
|
-
}
|
|
2408
|
+
} else throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=user_info_endpoint_not_found`);
|
|
2404
2409
|
if (!userInfo.email || !userInfo.id) throw ctx.redirect(`${errorURL || callbackURL}?error=invalid_provider&error_description=missing_user_info`);
|
|
2405
2410
|
const isTrustedProvider = "domainVerified" in provider && provider.domainVerified === true && validateEmailDomain(userInfo.email, provider.domain);
|
|
2406
2411
|
const linked = await handleOAuthUserInfo(ctx, {
|
|
@@ -3161,7 +3166,7 @@ async function handleLogoutResponse(ctx, sp, idp, relayState, providerId) {
|
|
|
3161
3166
|
if (inResponseTo) {
|
|
3162
3167
|
const key = `${LOGOUT_REQUEST_KEY_PREFIX}${inResponseTo}`;
|
|
3163
3168
|
if (!await ctx.context.internalAdapter.findVerificationValue(key)) ctx.context.logger.warn("LogoutResponse references unknown or expired request", { inResponseTo });
|
|
3164
|
-
await ctx.context.internalAdapter.
|
|
3169
|
+
await ctx.context.internalAdapter.deleteVerificationByIdentifier(key).catch((e) => ctx.context.logger.warn("Failed to delete logout request verification value", e));
|
|
3165
3170
|
}
|
|
3166
3171
|
deleteSessionCookie(ctx);
|
|
3167
3172
|
const appOrigin = new URL(ctx.context.baseURL).origin;
|
|
@@ -3189,13 +3194,13 @@ async function handleLogoutRequest(ctx, sp, idp, relayState, providerId) {
|
|
|
3189
3194
|
const data = safeJsonParse(stored.value);
|
|
3190
3195
|
if (data) if (!sessionIndex || !data.sessionIndex || sessionIndex === data.sessionIndex) {
|
|
3191
3196
|
await ctx.context.internalAdapter.deleteSession(data.sessionId).catch((e) => ctx.context.logger.warn("Failed to delete session during SLO", { error: e }));
|
|
3192
|
-
await ctx.context.internalAdapter.
|
|
3197
|
+
await ctx.context.internalAdapter.deleteVerificationByIdentifier(`${SAML_SESSION_BY_ID_PREFIX}${data.sessionId}`).catch((e) => ctx.context.logger.warn("Failed to delete SAML session lookup during SLO", e));
|
|
3193
3198
|
} else ctx.context.logger.warn("SessionIndex mismatch in LogoutRequest - skipping session deletion", {
|
|
3194
3199
|
providerId,
|
|
3195
3200
|
requestedSessionIndex: sessionIndex,
|
|
3196
3201
|
storedSessionIndex: data.sessionIndex
|
|
3197
3202
|
});
|
|
3198
|
-
await ctx.context.internalAdapter.
|
|
3203
|
+
await ctx.context.internalAdapter.deleteVerificationByIdentifier(key).catch((e) => ctx.context.logger.warn("Failed to delete SAML session key during SLO", e));
|
|
3199
3204
|
}
|
|
3200
3205
|
const currentSession = await getSessionFromCtx(ctx);
|
|
3201
3206
|
if (currentSession?.session) await ctx.context.internalAdapter.deleteSession(currentSession.session.id);
|
|
@@ -3252,8 +3257,8 @@ const initiateSLO = (options) => {
|
|
|
3252
3257
|
value: providerId,
|
|
3253
3258
|
expiresAt: new Date(Date.now() + ttl)
|
|
3254
3259
|
});
|
|
3255
|
-
if (samlSessionKey) await ctx.context.internalAdapter.
|
|
3256
|
-
await ctx.context.internalAdapter.
|
|
3260
|
+
if (samlSessionKey) await ctx.context.internalAdapter.deleteVerificationByIdentifier(samlSessionKey).catch((e) => ctx.context.logger.warn("Failed to delete SAML session key during logout", e));
|
|
3261
|
+
await ctx.context.internalAdapter.deleteVerificationByIdentifier(sessionLookupKey).catch((e) => ctx.context.logger.warn("Failed to delete session lookup key during logout", e));
|
|
3257
3262
|
await ctx.context.internalAdapter.deleteSession(session.session.id);
|
|
3258
3263
|
deleteSessionCookie(ctx);
|
|
3259
3264
|
throw ctx.redirect(logoutRequest.context);
|
|
@@ -3323,8 +3328,8 @@ function sso(options) {
|
|
|
3323
3328
|
const sessionLookupKey = `${SAML_SESSION_BY_ID_PREFIX}${session.session.id}`;
|
|
3324
3329
|
const sessionLookup = await ctx.context.internalAdapter.findVerificationValue(sessionLookupKey);
|
|
3325
3330
|
if (sessionLookup?.value) {
|
|
3326
|
-
await ctx.context.internalAdapter.
|
|
3327
|
-
await ctx.context.internalAdapter.
|
|
3331
|
+
await ctx.context.internalAdapter.deleteVerificationByIdentifier(sessionLookup.value).catch(() => {});
|
|
3332
|
+
await ctx.context.internalAdapter.deleteVerificationByIdentifier(sessionLookupKey).catch(() => {});
|
|
3328
3333
|
}
|
|
3329
3334
|
})
|
|
3330
3335
|
}],
|