@tern-secure/backend 1.2.0-canary.v20251003171521 → 1.2.0-canary.v20251008165428
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/admin/index.mjs +531 -22
- package/dist/admin/index.mjs.map +1 -1
- package/dist/auth/getauth.d.ts +8 -0
- package/dist/auth/getauth.d.ts.map +1 -1
- package/dist/auth/index.js +136 -200
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs +4 -67
- package/dist/auth/index.mjs.map +1 -1
- package/dist/{chunk-4SGWLAJG.mjs → chunk-3ZLDOHI2.mjs} +4 -68
- package/dist/chunk-3ZLDOHI2.mjs.map +1 -0
- package/dist/{chunk-WZYVAHZ3.mjs → chunk-SVZUAXAW.mjs} +115 -1
- package/dist/chunk-SVZUAXAW.mjs.map +1 -0
- package/dist/chunk-VSYYHCUV.mjs +71 -0
- package/dist/chunk-VSYYHCUV.mjs.map +1 -0
- package/dist/{chunk-YKIA5EBF.mjs → chunk-YGNTGJTP.mjs} +94 -4
- package/dist/chunk-YGNTGJTP.mjs.map +1 -0
- package/dist/fireRestApi/endpoints/TokenApi.d.ts +2 -2
- package/dist/fireRestApi/endpoints/TokenApi.d.ts.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +359 -92
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +84 -7
- package/dist/index.mjs.map +1 -1
- package/dist/jwt/customJwt.d.ts +11 -0
- package/dist/jwt/customJwt.d.ts.map +1 -0
- package/dist/jwt/index.d.ts +1 -0
- package/dist/jwt/index.d.ts.map +1 -1
- package/dist/jwt/index.js +104 -0
- package/dist/jwt/index.js.map +1 -1
- package/dist/jwt/index.mjs +7 -1
- package/dist/jwt/index.mjs.map +1 -1
- package/dist/tokens/cookie.d.ts +5 -0
- package/dist/tokens/cookie.d.ts.map +1 -0
- package/dist/tokens/request.d.ts.map +1 -1
- package/dist/tokens/types.d.ts +1 -12
- package/dist/tokens/types.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +12 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/options.d.ts +3 -3
- package/dist/utils/options.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-4SGWLAJG.mjs.map +0 -1
- package/dist/chunk-WZYVAHZ3.mjs.map +0 -1
- package/dist/chunk-XTYEXHJD.mjs +0 -554
- package/dist/chunk-XTYEXHJD.mjs.map +0 -1
- package/dist/chunk-YKIA5EBF.mjs.map +0 -1
- package/dist/tokens/sessionConfig.d.ts +0 -14
- package/dist/tokens/sessionConfig.d.ts.map +0 -1
package/dist/chunk-XTYEXHJD.mjs
DELETED
|
@@ -1,554 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
constants,
|
|
3
|
-
createTernSecureRequest
|
|
4
|
-
} from "./chunk-4SGWLAJG.mjs";
|
|
5
|
-
|
|
6
|
-
// src/admin/sessionTernSecure.ts
|
|
7
|
-
import { handleFirebaseAuthError } from "@tern-secure/shared/errors";
|
|
8
|
-
|
|
9
|
-
// src/utils/admin-init.ts
|
|
10
|
-
import admin from "firebase-admin";
|
|
11
|
-
|
|
12
|
-
// src/utils/config.ts
|
|
13
|
-
var loadAdminConfig = () => ({
|
|
14
|
-
projectId: process.env.FIREBASE_PROJECT_ID || "",
|
|
15
|
-
clientEmail: process.env.FIREBASE_CLIENT_EMAIL || "",
|
|
16
|
-
privateKey: process.env.FIREBASE_PRIVATE_KEY || ""
|
|
17
|
-
});
|
|
18
|
-
var validateAdminConfig = (config) => {
|
|
19
|
-
const requiredFields = [
|
|
20
|
-
"projectId",
|
|
21
|
-
"clientEmail",
|
|
22
|
-
"privateKey"
|
|
23
|
-
];
|
|
24
|
-
const errors = [];
|
|
25
|
-
requiredFields.forEach((field) => {
|
|
26
|
-
if (!config[field]) {
|
|
27
|
-
errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
return {
|
|
31
|
-
isValid: errors.length === 0,
|
|
32
|
-
errors,
|
|
33
|
-
config
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
var initializeAdminConfig = () => {
|
|
37
|
-
const config = loadAdminConfig();
|
|
38
|
-
const validationResult = validateAdminConfig(config);
|
|
39
|
-
if (!validationResult.isValid) {
|
|
40
|
-
throw new Error(
|
|
41
|
-
`Firebase Admin configuration validation failed:
|
|
42
|
-
${validationResult.errors.join("\n")}`
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
return config;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// src/utils/admin-init.ts
|
|
49
|
-
if (!admin.apps.length) {
|
|
50
|
-
try {
|
|
51
|
-
const config = initializeAdminConfig();
|
|
52
|
-
admin.initializeApp({
|
|
53
|
-
credential: admin.credential.cert({
|
|
54
|
-
...config,
|
|
55
|
-
privateKey: config.privateKey.replace(/\\n/g, "\n")
|
|
56
|
-
})
|
|
57
|
-
});
|
|
58
|
-
} catch (error) {
|
|
59
|
-
console.error("Firebase admin initialization error", error);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
var adminTernSecureAuth = admin.auth();
|
|
63
|
-
var adminTernSecureDb = admin.firestore();
|
|
64
|
-
var TernSecureTenantManager = admin.auth().tenantManager();
|
|
65
|
-
function getAuthForTenant(tenantId) {
|
|
66
|
-
if (tenantId) {
|
|
67
|
-
return TernSecureTenantManager.authForTenant(tenantId);
|
|
68
|
-
}
|
|
69
|
-
return admin.auth();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// src/admin/sessionTernSecure.ts
|
|
73
|
-
var SESSION_CONSTANTS = {
|
|
74
|
-
COOKIE_NAME: "_session_cookie",
|
|
75
|
-
//DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1000, // 5 days
|
|
76
|
-
//DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5, // 5days
|
|
77
|
-
DEFAULT_EXPIRES_IN_MS: 5 * 60 * 1e3,
|
|
78
|
-
// 5 minutes
|
|
79
|
-
DEFAULT_EXPIRES_IN_SECONDS: 5 * 60,
|
|
80
|
-
REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true
|
|
81
|
-
};
|
|
82
|
-
var COOKIE_OPTIONS = {
|
|
83
|
-
httpOnly: true,
|
|
84
|
-
secure: process.env.NODE_ENV === "production",
|
|
85
|
-
sameSite: "strict",
|
|
86
|
-
path: "/"
|
|
87
|
-
};
|
|
88
|
-
var DEFAULT_COOKIE_CONFIG = {
|
|
89
|
-
DEFAULT_EXPIRES_IN_MS: 5 * 60 * 1e3,
|
|
90
|
-
// 5 minutes
|
|
91
|
-
DEFAULT_EXPIRES_IN_SECONDS: 5 * 60,
|
|
92
|
-
REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true
|
|
93
|
-
};
|
|
94
|
-
var DEFAULT_COOKIE_OPTIONS = {
|
|
95
|
-
httpOnly: true,
|
|
96
|
-
secure: process.env.NODE_ENV === "production",
|
|
97
|
-
sameSite: "strict",
|
|
98
|
-
path: "/"
|
|
99
|
-
};
|
|
100
|
-
var getCookieName = (baseName, prefix) => {
|
|
101
|
-
return prefix ? `${prefix}${baseName}` : baseName;
|
|
102
|
-
};
|
|
103
|
-
var createCookieOptions = (maxAge, overrides) => {
|
|
104
|
-
return {
|
|
105
|
-
maxAge,
|
|
106
|
-
httpOnly: overrides?.httpOnly ?? DEFAULT_COOKIE_OPTIONS.httpOnly,
|
|
107
|
-
secure: overrides?.secure ?? DEFAULT_COOKIE_OPTIONS.secure,
|
|
108
|
-
sameSite: overrides?.sameSite ?? DEFAULT_COOKIE_OPTIONS.sameSite,
|
|
109
|
-
path: overrides?.path ?? DEFAULT_COOKIE_OPTIONS.path
|
|
110
|
-
};
|
|
111
|
-
};
|
|
112
|
-
var getCookiePrefix = () => {
|
|
113
|
-
const isProduction = process.env.NODE_ENV === "production";
|
|
114
|
-
return isProduction ? "__HOST-" : "__dev_";
|
|
115
|
-
};
|
|
116
|
-
async function createSessionCookie(params, cookieStore, options) {
|
|
117
|
-
try {
|
|
118
|
-
const tenantAuth = getAuthForTenant(options?.tenantId || "");
|
|
119
|
-
const idToken = typeof params === "string" ? params : params.idToken;
|
|
120
|
-
const refreshToken = typeof params === "string" ? void 0 : params.refreshToken;
|
|
121
|
-
if (!idToken) {
|
|
122
|
-
return {
|
|
123
|
-
success: false,
|
|
124
|
-
message: "ID token is required",
|
|
125
|
-
error: "INVALID_TOKEN"
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
let decodedToken;
|
|
129
|
-
try {
|
|
130
|
-
decodedToken = await tenantAuth.verifyIdToken(idToken);
|
|
131
|
-
} catch (verifyError) {
|
|
132
|
-
const authError = handleFirebaseAuthError(verifyError);
|
|
133
|
-
return {
|
|
134
|
-
success: false,
|
|
135
|
-
message: authError.message,
|
|
136
|
-
error: authError.code
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
const cookiePromises = [];
|
|
140
|
-
const cookiePrefix = getCookiePrefix();
|
|
141
|
-
const idTokenCookieName = getCookieName(constants.Cookies.IdToken, cookiePrefix);
|
|
142
|
-
cookiePromises.push(
|
|
143
|
-
cookieStore.set(
|
|
144
|
-
idTokenCookieName,
|
|
145
|
-
idToken,
|
|
146
|
-
createCookieOptions(DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS)
|
|
147
|
-
)
|
|
148
|
-
);
|
|
149
|
-
if (refreshToken) {
|
|
150
|
-
const refreshTokenCookieName = getCookieName(constants.Cookies.Refresh, cookiePrefix);
|
|
151
|
-
cookiePromises.push(
|
|
152
|
-
cookieStore.set(
|
|
153
|
-
refreshTokenCookieName,
|
|
154
|
-
refreshToken,
|
|
155
|
-
createCookieOptions(DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS)
|
|
156
|
-
)
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
if (options?.cookies?.session) {
|
|
160
|
-
const sessionOptions = options.cookies.session;
|
|
161
|
-
const sessionCookieName = getCookieName(constants.Cookies.Session);
|
|
162
|
-
const expiresIn = sessionOptions.maxAge ? sessionOptions.maxAge * 1e3 : DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_MS;
|
|
163
|
-
try {
|
|
164
|
-
const sessionCookie = await tenantAuth.createSessionCookie(idToken, { expiresIn });
|
|
165
|
-
cookiePromises.push(
|
|
166
|
-
cookieStore.set(
|
|
167
|
-
sessionCookieName,
|
|
168
|
-
sessionCookie,
|
|
169
|
-
createCookieOptions(
|
|
170
|
-
sessionOptions.maxAge || DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS,
|
|
171
|
-
{
|
|
172
|
-
httpOnly: sessionOptions.httpOnly,
|
|
173
|
-
sameSite: sessionOptions.sameSite,
|
|
174
|
-
path: sessionOptions.path
|
|
175
|
-
}
|
|
176
|
-
)
|
|
177
|
-
)
|
|
178
|
-
);
|
|
179
|
-
} catch (sessionError) {
|
|
180
|
-
console.error(
|
|
181
|
-
"[createSessionCookie] Firebase session cookie creation failed:",
|
|
182
|
-
sessionError
|
|
183
|
-
);
|
|
184
|
-
const authError = handleFirebaseAuthError(sessionError);
|
|
185
|
-
return {
|
|
186
|
-
success: false,
|
|
187
|
-
message: authError.message,
|
|
188
|
-
error: authError.code
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
if (options?.enableCustomToken && decodedToken?.uid) {
|
|
193
|
-
const customTokenCookieName = getCookieName(constants.Cookies.Custom, cookiePrefix);
|
|
194
|
-
const customToken = await createCustomToken(decodedToken.uid, options);
|
|
195
|
-
if (customToken) {
|
|
196
|
-
cookiePromises.push(
|
|
197
|
-
cookieStore.set(
|
|
198
|
-
customTokenCookieName,
|
|
199
|
-
customToken,
|
|
200
|
-
createCookieOptions(DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS)
|
|
201
|
-
)
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
await Promise.all(cookiePromises);
|
|
206
|
-
return {
|
|
207
|
-
success: true,
|
|
208
|
-
message: "Session created successfully",
|
|
209
|
-
expiresIn: DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS
|
|
210
|
-
};
|
|
211
|
-
} catch (error) {
|
|
212
|
-
console.error("[createSessionCookie] Unexpected error:", error);
|
|
213
|
-
const authError = handleFirebaseAuthError(error);
|
|
214
|
-
return {
|
|
215
|
-
success: false,
|
|
216
|
-
message: authError.message || "Failed to create session",
|
|
217
|
-
error: authError.code || "INTERNAL_ERROR"
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
async function clearSessionCookie(cookieStore, options) {
|
|
222
|
-
try {
|
|
223
|
-
const adminAuth = getAuthForTenant(options?.tenantId || "");
|
|
224
|
-
const cookiePrefix = getCookiePrefix();
|
|
225
|
-
const sessionCookieName = getCookieName(constants.Cookies.Session, cookiePrefix);
|
|
226
|
-
const sessionCookie = await cookieStore.get(sessionCookieName);
|
|
227
|
-
const deletionPromises = [];
|
|
228
|
-
if (options?.cookies?.session) {
|
|
229
|
-
deletionPromises.push(cookieStore.delete(sessionCookieName));
|
|
230
|
-
}
|
|
231
|
-
const idTokenCookieName = getCookieName(constants.Cookies.IdToken, cookiePrefix);
|
|
232
|
-
deletionPromises.push(cookieStore.delete(idTokenCookieName));
|
|
233
|
-
const refreshTokenCookieName = getCookieName(constants.Cookies.Refresh, cookiePrefix);
|
|
234
|
-
deletionPromises.push(cookieStore.delete(refreshTokenCookieName));
|
|
235
|
-
const customTokenCookieName = getCookieName(constants.Cookies.Custom, cookiePrefix);
|
|
236
|
-
deletionPromises.push(cookieStore.delete(customTokenCookieName));
|
|
237
|
-
deletionPromises.push(cookieStore.delete(constants.Cookies.Session));
|
|
238
|
-
await Promise.all(deletionPromises);
|
|
239
|
-
if (DEFAULT_COOKIE_CONFIG.REVOKE_REFRESH_TOKENS_ON_SIGNOUT && sessionCookie?.value) {
|
|
240
|
-
try {
|
|
241
|
-
const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie.value);
|
|
242
|
-
await adminAuth.revokeRefreshTokens(decodedClaims.sub);
|
|
243
|
-
} catch (revokeError) {
|
|
244
|
-
console.error("[clearSessionCookie] Failed to revoke refresh tokens:", revokeError);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return {
|
|
248
|
-
success: true,
|
|
249
|
-
message: "Session cleared successfully"
|
|
250
|
-
};
|
|
251
|
-
} catch (error) {
|
|
252
|
-
const authError = handleFirebaseAuthError(error);
|
|
253
|
-
return {
|
|
254
|
-
success: false,
|
|
255
|
-
message: authError.message || "Failed to clear session",
|
|
256
|
-
error: authError.code || "INTERNAL_ERROR"
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
async function createCustomToken(uid, options) {
|
|
261
|
-
const adminAuth = getAuthForTenant(options?.tenantId || "");
|
|
262
|
-
try {
|
|
263
|
-
const customToken = await adminAuth.createCustomToken(uid);
|
|
264
|
-
return customToken;
|
|
265
|
-
} catch (error) {
|
|
266
|
-
console.error("[createCustomToken] Error creating custom token:", error);
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
async function createCustomTokenClaims(uid, developerClaims) {
|
|
271
|
-
const adminAuth = getAuthForTenant();
|
|
272
|
-
try {
|
|
273
|
-
const customToken = await adminAuth.createCustomToken(uid, developerClaims);
|
|
274
|
-
return customToken;
|
|
275
|
-
} catch (error) {
|
|
276
|
-
console.error("[createCustomToken] Error creating custom token:", error);
|
|
277
|
-
return "";
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// src/admin/tenant.ts
|
|
282
|
-
async function createTenant(displayName, emailSignInConfig, multiFactorConfig) {
|
|
283
|
-
try {
|
|
284
|
-
const tenantConfig = {
|
|
285
|
-
displayName,
|
|
286
|
-
emailSignInConfig,
|
|
287
|
-
...multiFactorConfig && { multiFactorConfig }
|
|
288
|
-
};
|
|
289
|
-
const tenant = await TernSecureTenantManager.createTenant(tenantConfig);
|
|
290
|
-
return {
|
|
291
|
-
success: true,
|
|
292
|
-
tenantId: tenant.tenantId,
|
|
293
|
-
displayName: tenant.displayName
|
|
294
|
-
};
|
|
295
|
-
} catch (error) {
|
|
296
|
-
console.error("Error creating tenant:", error);
|
|
297
|
-
throw new Error("Failed to create tenant");
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
async function createTenantUser(email, password, tenantId) {
|
|
301
|
-
try {
|
|
302
|
-
const tenantAuth = TernSecureTenantManager.authForTenant(tenantId);
|
|
303
|
-
const userRecord = await tenantAuth.createUser({
|
|
304
|
-
email,
|
|
305
|
-
password,
|
|
306
|
-
emailVerified: false,
|
|
307
|
-
disabled: false
|
|
308
|
-
});
|
|
309
|
-
return {
|
|
310
|
-
success: true,
|
|
311
|
-
message: "Tenant user created successfully",
|
|
312
|
-
user: userRecord.uid
|
|
313
|
-
};
|
|
314
|
-
} catch (error) {
|
|
315
|
-
console.error("Error creating tenant user:", error);
|
|
316
|
-
throw new Error("Failed to create tenant user");
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// src/admin/nextSessionTernSecure.ts
|
|
321
|
-
import { getCookieName as getCookieName2, getCookiePrefix as getCookiePrefix2 } from "@tern-secure/shared/cookie";
|
|
322
|
-
import { handleFirebaseAuthError as handleFirebaseAuthError2 } from "@tern-secure/shared/errors";
|
|
323
|
-
import { cookies } from "next/headers";
|
|
324
|
-
var SESSION_CONSTANTS2 = {
|
|
325
|
-
COOKIE_NAME: constants.Cookies.Session,
|
|
326
|
-
DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1e3,
|
|
327
|
-
// 5 days
|
|
328
|
-
DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5,
|
|
329
|
-
REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true
|
|
330
|
-
};
|
|
331
|
-
async function CreateNextSessionCookie(idToken) {
|
|
332
|
-
try {
|
|
333
|
-
const expiresIn = 60 * 60 * 24 * 5 * 1e3;
|
|
334
|
-
const sessionCookie = await adminTernSecureAuth.createSessionCookie(idToken, {
|
|
335
|
-
expiresIn
|
|
336
|
-
});
|
|
337
|
-
const cookieStore = await cookies();
|
|
338
|
-
cookieStore.set(constants.Cookies.Session, sessionCookie, {
|
|
339
|
-
maxAge: expiresIn,
|
|
340
|
-
httpOnly: true,
|
|
341
|
-
secure: process.env.NODE_ENV === "production",
|
|
342
|
-
path: "/"
|
|
343
|
-
});
|
|
344
|
-
return { success: true, message: "Session created" };
|
|
345
|
-
} catch (error) {
|
|
346
|
-
return { success: false, message: "Failed to create session" };
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
async function GetNextServerSessionCookie() {
|
|
350
|
-
const cookieStore = await cookies();
|
|
351
|
-
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
352
|
-
if (!sessionCookie) {
|
|
353
|
-
throw new Error("No session cookie found");
|
|
354
|
-
}
|
|
355
|
-
try {
|
|
356
|
-
const decondeClaims = await adminTernSecureAuth.verifySessionCookie(
|
|
357
|
-
sessionCookie,
|
|
358
|
-
true
|
|
359
|
-
);
|
|
360
|
-
return {
|
|
361
|
-
token: sessionCookie,
|
|
362
|
-
userId: decondeClaims.uid
|
|
363
|
-
};
|
|
364
|
-
} catch (error) {
|
|
365
|
-
console.error("Error verifying session:", error);
|
|
366
|
-
throw new Error("Invalid Session");
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
async function GetNextIdToken() {
|
|
370
|
-
const cookieStore = await cookies();
|
|
371
|
-
const token = cookieStore.get("_session_token")?.value;
|
|
372
|
-
if (!token) {
|
|
373
|
-
throw new Error("No session cookie found");
|
|
374
|
-
}
|
|
375
|
-
try {
|
|
376
|
-
const decodedClaims = await adminTernSecureAuth.verifyIdToken(token);
|
|
377
|
-
return {
|
|
378
|
-
token,
|
|
379
|
-
userId: decodedClaims.uid
|
|
380
|
-
};
|
|
381
|
-
} catch (error) {
|
|
382
|
-
console.error("Error verifying session:", error);
|
|
383
|
-
throw new Error("Invalid Session");
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
async function SetNextServerSession(token) {
|
|
387
|
-
try {
|
|
388
|
-
const cookieStore = await cookies();
|
|
389
|
-
cookieStore.set("_session_token", token, {
|
|
390
|
-
httpOnly: true,
|
|
391
|
-
secure: process.env.NODE_ENV === "production",
|
|
392
|
-
sameSite: "strict",
|
|
393
|
-
maxAge: 60 * 60,
|
|
394
|
-
// 1 hour
|
|
395
|
-
path: "/"
|
|
396
|
-
});
|
|
397
|
-
return { success: true, message: "Session created" };
|
|
398
|
-
} catch {
|
|
399
|
-
return { success: false, message: "Failed to create session" };
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
async function SetNextServerToken(token) {
|
|
403
|
-
try {
|
|
404
|
-
const cookieStore = await cookies();
|
|
405
|
-
cookieStore.set("_tern", token, {
|
|
406
|
-
httpOnly: true,
|
|
407
|
-
secure: process.env.NODE_ENV === "production",
|
|
408
|
-
sameSite: "strict",
|
|
409
|
-
maxAge: 60 * 60,
|
|
410
|
-
// 1 hour
|
|
411
|
-
path: "/"
|
|
412
|
-
});
|
|
413
|
-
return { success: true, message: "Session created" };
|
|
414
|
-
} catch {
|
|
415
|
-
return { success: false, message: "Failed to create session" };
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
async function VerifyNextTernIdToken(token) {
|
|
419
|
-
try {
|
|
420
|
-
const decodedToken = await adminTernSecureAuth.verifyIdToken(token);
|
|
421
|
-
return {
|
|
422
|
-
...decodedToken,
|
|
423
|
-
valid: true
|
|
424
|
-
};
|
|
425
|
-
} catch (error) {
|
|
426
|
-
console.error("[VerifyNextTernIdToken] Error verifying session:", error);
|
|
427
|
-
const authError = handleFirebaseAuthError2(error);
|
|
428
|
-
return {
|
|
429
|
-
valid: false,
|
|
430
|
-
error: authError
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
async function VerifyNextTernSessionCookie(session) {
|
|
435
|
-
try {
|
|
436
|
-
const res = await adminTernSecureAuth.verifySessionCookie(session);
|
|
437
|
-
console.warn(
|
|
438
|
-
"[VerifyNextTernSessionCookie] uid in Decoded Token:",
|
|
439
|
-
res.uid
|
|
440
|
-
);
|
|
441
|
-
return {
|
|
442
|
-
valid: true,
|
|
443
|
-
...res
|
|
444
|
-
};
|
|
445
|
-
} catch (error) {
|
|
446
|
-
console.error(
|
|
447
|
-
"[VerifyNextTernSessionCookie] Error verifying session:",
|
|
448
|
-
error
|
|
449
|
-
);
|
|
450
|
-
const authError = handleFirebaseAuthError2(error);
|
|
451
|
-
return {
|
|
452
|
-
valid: false,
|
|
453
|
-
error: authError
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
async function ClearNextSessionCookie(tenantId) {
|
|
458
|
-
try {
|
|
459
|
-
console.log("[clearSessionCookie] Clearing session for tenant:", tenantId);
|
|
460
|
-
const tenantAuth = getAuthForTenant(tenantId);
|
|
461
|
-
const cookieStore = await cookies();
|
|
462
|
-
const sessionCookie = cookieStore.get(SESSION_CONSTANTS2.COOKIE_NAME);
|
|
463
|
-
const cookiePrefix = getCookiePrefix2();
|
|
464
|
-
cookieStore.delete(SESSION_CONSTANTS2.COOKIE_NAME);
|
|
465
|
-
cookieStore.delete(getCookieName2(constants.Cookies.IdToken, cookiePrefix));
|
|
466
|
-
cookieStore.delete(getCookieName2(constants.Cookies.Refresh, cookiePrefix));
|
|
467
|
-
cookieStore.delete(constants.Cookies.Custom);
|
|
468
|
-
if (SESSION_CONSTANTS2.REVOKE_REFRESH_TOKENS_ON_SIGNOUT && sessionCookie?.value) {
|
|
469
|
-
try {
|
|
470
|
-
const decodedClaims = await tenantAuth.verifySessionCookie(
|
|
471
|
-
sessionCookie.value
|
|
472
|
-
);
|
|
473
|
-
await tenantAuth.revokeRefreshTokens(decodedClaims.sub);
|
|
474
|
-
console.log(
|
|
475
|
-
`[clearSessionCookie] Successfully revoked tokens for user: ${decodedClaims.sub}`
|
|
476
|
-
);
|
|
477
|
-
} catch (revokeError) {
|
|
478
|
-
console.error(
|
|
479
|
-
"[ClearNextSessionCookie] Failed to revoke refresh tokens:",
|
|
480
|
-
revokeError
|
|
481
|
-
);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
return { success: true, message: "Session cleared successfully" };
|
|
485
|
-
} catch (error) {
|
|
486
|
-
console.error("Error clearing session:", error);
|
|
487
|
-
return { success: false, message: "Failed to clear session cookies" };
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
// src/instance/backendInstance.ts
|
|
492
|
-
var createBackendInstance = async (request) => {
|
|
493
|
-
const ternSecureRequest = createTernSecureRequest(request);
|
|
494
|
-
const requestState = await authenticateRequest(request);
|
|
495
|
-
return {
|
|
496
|
-
ternSecureRequest,
|
|
497
|
-
requestState
|
|
498
|
-
};
|
|
499
|
-
};
|
|
500
|
-
async function authenticateRequest(request) {
|
|
501
|
-
const sessionCookie = request.headers.get("cookie");
|
|
502
|
-
const sessionToken = sessionCookie?.split(";").find((c) => c.trim().startsWith("_session_cookie="))?.split("=")[1];
|
|
503
|
-
if (!sessionToken) {
|
|
504
|
-
throw new Error("No session token found");
|
|
505
|
-
}
|
|
506
|
-
const verificationResult = await VerifyNextTernSessionCookie(sessionToken);
|
|
507
|
-
if (!verificationResult.valid) {
|
|
508
|
-
throw new Error("Invalid session token");
|
|
509
|
-
}
|
|
510
|
-
return signedIn(
|
|
511
|
-
verificationResult,
|
|
512
|
-
new Headers(request.headers),
|
|
513
|
-
sessionToken
|
|
514
|
-
);
|
|
515
|
-
}
|
|
516
|
-
function signInAuthObject(session) {
|
|
517
|
-
return {
|
|
518
|
-
session,
|
|
519
|
-
userId: session.uid,
|
|
520
|
-
has: {}
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
function signedIn(session, headers = new Headers(), token) {
|
|
524
|
-
const authObject = signInAuthObject(session);
|
|
525
|
-
return {
|
|
526
|
-
auth: () => authObject,
|
|
527
|
-
token,
|
|
528
|
-
headers
|
|
529
|
-
};
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
export {
|
|
533
|
-
initializeAdminConfig,
|
|
534
|
-
adminTernSecureAuth,
|
|
535
|
-
adminTernSecureDb,
|
|
536
|
-
TernSecureTenantManager,
|
|
537
|
-
createSessionCookie,
|
|
538
|
-
clearSessionCookie,
|
|
539
|
-
createCustomTokenClaims,
|
|
540
|
-
createTenant,
|
|
541
|
-
createTenantUser,
|
|
542
|
-
CreateNextSessionCookie,
|
|
543
|
-
GetNextServerSessionCookie,
|
|
544
|
-
GetNextIdToken,
|
|
545
|
-
SetNextServerSession,
|
|
546
|
-
SetNextServerToken,
|
|
547
|
-
VerifyNextTernIdToken,
|
|
548
|
-
VerifyNextTernSessionCookie,
|
|
549
|
-
ClearNextSessionCookie,
|
|
550
|
-
createBackendInstance,
|
|
551
|
-
authenticateRequest,
|
|
552
|
-
signedIn
|
|
553
|
-
};
|
|
554
|
-
//# sourceMappingURL=chunk-XTYEXHJD.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/admin/sessionTernSecure.ts","../src/utils/admin-init.ts","../src/utils/config.ts","../src/admin/tenant.ts","../src/admin/nextSessionTernSecure.ts","../src/instance/backendInstance.ts"],"sourcesContent":["'use server';\r\nimport { handleFirebaseAuthError } from '@tern-secure/shared/errors';\r\nimport type {\r\n CookieStore,\r\n SessionParams,\r\n SessionResult,\r\n TernSecureHandlerOptions,\r\n} from '@tern-secure/types';\r\n\r\nimport { constants } from '../constants';\r\nimport { getAuthForTenant } from '../utils/admin-init';\r\n\r\nconst SESSION_CONSTANTS = {\r\n COOKIE_NAME: '_session_cookie',\r\n //DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1000, // 5 days\r\n //DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5, // 5days\r\n DEFAULT_EXPIRES_IN_MS: 5 * 60 * 1000, // 5 minutes\r\n DEFAULT_EXPIRES_IN_SECONDS: 5 * 60,\r\n REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true,\r\n} as const;\r\n\r\nconst COOKIE_OPTIONS = {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n sameSite: 'strict' as const,\r\n path: '/',\r\n} as const;\r\n\r\nexport async function createSessionCookie_old(\r\n params: SessionParams | string,\r\n cookieStore: CookieStore,\r\n options?: TernSecureHandlerOptions,\r\n): Promise<SessionResult> {\r\n try {\r\n const tenantAuth = getAuthForTenant(options?.tenantId || '');\r\n\r\n let decodedToken;\r\n let sessionCookie;\r\n\r\n const idToken = typeof params === 'string' ? params : params.idToken;\r\n\r\n if (!idToken) {\r\n return {\r\n success: false,\r\n message: 'ID token is required',\r\n error: 'INVALID_TOKEN',\r\n };\r\n }\r\n\r\n try {\r\n decodedToken = await tenantAuth.verifyIdToken(idToken);\r\n } catch (verifyError) {\r\n const authError = handleFirebaseAuthError(verifyError);\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n };\r\n }\r\n\r\n if (!decodedToken) {\r\n return {\r\n success: false,\r\n message: 'Invalid ID token',\r\n error: 'INVALID_TOKEN',\r\n };\r\n }\r\n\r\n try {\r\n sessionCookie = await tenantAuth.createSessionCookie(idToken, {\r\n expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_MS,\r\n });\r\n } catch (sessionError) {\r\n console.error('[createSessionCookie] Firebase session cookie creation failed:', sessionError);\r\n const authError = handleFirebaseAuthError(sessionError);\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n };\r\n }\r\n\r\n try {\r\n await cookieStore.set(constants.Cookies.IdToken, idToken, {\r\n maxAge: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,\r\n ...COOKIE_OPTIONS,\r\n });\r\n await cookieStore.set(SESSION_CONSTANTS.COOKIE_NAME, sessionCookie, {\r\n maxAge: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,\r\n ...COOKIE_OPTIONS,\r\n });\r\n } catch (cookieError) {\r\n console.error('[createSessionCookie] Failed to set session cookie:', cookieError);\r\n return {\r\n success: false,\r\n message: 'Failed to set session cookie',\r\n error: 'COOKIE_SET_FAILED',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n message: 'Session created successfully',\r\n expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,\r\n };\r\n } catch (error) {\r\n console.error('[createSessionCookie] Unexpected error:', error);\r\n const authError = handleFirebaseAuthError(error);\r\n return {\r\n success: false,\r\n message: authError.message || 'Failed to create session',\r\n error: authError.code || 'INTERNAL_ERROR',\r\n };\r\n }\r\n}\r\n\r\nexport async function clearSessionCookie_old(\r\n cookieStore: CookieStore,\r\n options?: TernSecureHandlerOptions,\r\n): Promise<SessionResult> {\r\n try {\r\n const adminAuth = getAuthForTenant(options?.tenantId || '');\r\n const sessionCookie = await cookieStore.get(SESSION_CONSTANTS.COOKIE_NAME);\r\n\r\n await cookieStore.delete(SESSION_CONSTANTS.COOKIE_NAME);\r\n await cookieStore.delete(constants.Cookies.IdToken);\r\n await cookieStore.delete(constants.Cookies.Refresh);\r\n await cookieStore.delete(constants.Cookies.Custom);\r\n await cookieStore.delete(constants.Cookies.Session);\r\n\r\n if (SESSION_CONSTANTS.REVOKE_REFRESH_TOKENS_ON_SIGNOUT && sessionCookie?.value) {\r\n try {\r\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie.value);\r\n await adminAuth.revokeRefreshTokens(decodedClaims.sub);\r\n } catch (revokeError) {\r\n console.error('[clearSessionCookie] Failed to revoke refresh tokens:', revokeError);\r\n }\r\n }\r\n return {\r\n success: true,\r\n message: 'Session cleared successfully',\r\n };\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error);\r\n return {\r\n success: false,\r\n message: authError.message || 'Failed to clear session',\r\n error: authError.code || 'INTERNAL_ERROR',\r\n };\r\n }\r\n}\r\n\r\nexport async function createCustomToken_old(\r\n uid: string,\r\n options?: TernSecureHandlerOptions,\r\n): Promise<string | null> {\r\n const adminAuth = getAuthForTenant(options?.tenantId || '');\r\n try {\r\n const customToken = await adminAuth.createCustomToken(uid);\r\n return customToken;\r\n } catch (error) {\r\n console.error('[createCustomToken] Error creating custom token:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Generates cookie name with optional prefix\r\n */\r\n\r\nconst DEFAULT_COOKIE_CONFIG = {\r\n DEFAULT_EXPIRES_IN_MS: 5 * 60 * 1000, // 5 minutes\r\n DEFAULT_EXPIRES_IN_SECONDS: 5 * 60,\r\n REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true,\r\n} as const;\r\n\r\nconst DEFAULT_COOKIE_OPTIONS = {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n sameSite: 'strict' as const,\r\n path: '/',\r\n} as const;\r\n\r\n/**\r\n * Generates cookie name with optional prefix\r\n */\r\nconst getCookieName = (baseName: string, prefix?: string): string => {\r\n return prefix ? `${prefix}${baseName}` : baseName;\r\n};\r\n\r\n/**\r\n * Creates standard cookie options with optional overrides\r\n */\r\nconst createCookieOptions = (\r\n maxAge: number,\r\n overrides?: {\r\n httpOnly?: boolean;\r\n secure?: boolean;\r\n sameSite?: 'strict' | 'lax' | 'none';\r\n path?: string;\r\n },\r\n) => {\r\n return {\r\n maxAge,\r\n httpOnly: overrides?.httpOnly ?? DEFAULT_COOKIE_OPTIONS.httpOnly,\r\n secure: overrides?.secure ?? DEFAULT_COOKIE_OPTIONS.secure,\r\n sameSite: overrides?.sameSite ?? DEFAULT_COOKIE_OPTIONS.sameSite,\r\n path: overrides?.path ?? DEFAULT_COOKIE_OPTIONS.path,\r\n };\r\n};\r\n\r\n/**\r\n * Determines the appropriate cookie prefix based on environment and options\r\n */\r\nconst getCookiePrefix = (): string => {\r\n const isProduction = process.env.NODE_ENV === 'production';\r\n return isProduction ? '__HOST-' : '__dev_';\r\n};\r\n\r\n/**\r\n * Creates cookies for user session management\r\n * @param params - Session parameters containing idToken and optional refreshToken\r\n * @param cookieStore - Cookie store interface for managing cookies\r\n * @param options - TernSecure handler options containing cookie configurations\r\n */\r\nexport async function createSessionCookie(\r\n params: SessionParams | string,\r\n cookieStore: CookieStore,\r\n options?: TernSecureHandlerOptions,\r\n): Promise<SessionResult> {\r\n try {\r\n const tenantAuth = getAuthForTenant(options?.tenantId || '');\r\n\r\n const idToken = typeof params === 'string' ? params : params.idToken;\r\n const refreshToken = typeof params === 'string' ? undefined : (params as any).refreshToken;\r\n\r\n if (!idToken) {\r\n return {\r\n success: false,\r\n message: 'ID token is required',\r\n error: 'INVALID_TOKEN',\r\n };\r\n }\r\n\r\n // Verify the ID token\r\n let decodedToken;\r\n try {\r\n decodedToken = await tenantAuth.verifyIdToken(idToken);\r\n } catch (verifyError) {\r\n const authError = handleFirebaseAuthError(verifyError);\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n };\r\n }\r\n\r\n const cookiePromises: Promise<void>[] = [];\r\n const cookiePrefix = getCookiePrefix();\r\n\r\n // Always set idToken cookie by default\r\n const idTokenCookieName = getCookieName(constants.Cookies.IdToken, cookiePrefix);\r\n cookiePromises.push(\r\n cookieStore.set(\r\n idTokenCookieName,\r\n idToken,\r\n createCookieOptions(DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS),\r\n ),\r\n );\r\n\r\n // Always set refreshToken cookie by default if provided\r\n if (refreshToken) {\r\n const refreshTokenCookieName = getCookieName(constants.Cookies.Refresh, cookiePrefix);\r\n cookiePromises.push(\r\n cookieStore.set(\r\n refreshTokenCookieName,\r\n refreshToken,\r\n createCookieOptions(DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS),\r\n ),\r\n );\r\n }\r\n\r\n // Create and set session cookie only if session config is provided\r\n if (options?.cookies?.session) {\r\n const sessionOptions = options.cookies.session;\r\n const sessionCookieName = getCookieName(constants.Cookies.Session); //removed prefix for test\r\n const expiresIn = sessionOptions.maxAge\r\n ? sessionOptions.maxAge * 1000\r\n : DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_MS;\r\n\r\n try {\r\n const sessionCookie = await tenantAuth.createSessionCookie(idToken, { expiresIn });\r\n cookiePromises.push(\r\n cookieStore.set(\r\n sessionCookieName,\r\n sessionCookie,\r\n createCookieOptions(\r\n sessionOptions.maxAge || DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS,\r\n {\r\n httpOnly: sessionOptions.httpOnly,\r\n sameSite: sessionOptions.sameSite,\r\n path: sessionOptions.path,\r\n },\r\n ),\r\n ),\r\n );\r\n } catch (sessionError) {\r\n console.error(\r\n '[createSessionCookie] Firebase session cookie creation failed:',\r\n sessionError,\r\n );\r\n const authError = handleFirebaseAuthError(sessionError);\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n };\r\n }\r\n }\r\n\r\n // Create and set custom token cookie only if enableCustomToken is true\r\n if (options?.enableCustomToken && decodedToken?.uid) {\r\n const customTokenCookieName = getCookieName(constants.Cookies.Custom, cookiePrefix);\r\n const customToken = await createCustomToken(decodedToken.uid, options);\r\n if (customToken) {\r\n cookiePromises.push(\r\n cookieStore.set(\r\n customTokenCookieName,\r\n customToken,\r\n createCookieOptions(DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS),\r\n ),\r\n );\r\n }\r\n }\r\n\r\n await Promise.all(cookiePromises);\r\n\r\n return {\r\n success: true,\r\n message: 'Session created successfully',\r\n expiresIn: DEFAULT_COOKIE_CONFIG.DEFAULT_EXPIRES_IN_SECONDS,\r\n };\r\n } catch (error) {\r\n console.error('[createSessionCookie] Unexpected error:', error);\r\n const authError = handleFirebaseAuthError(error);\r\n return {\r\n success: false,\r\n message: authError.message || 'Failed to create session',\r\n error: authError.code || 'INTERNAL_ERROR',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Clears user session cookies\r\n * @param cookieStore - Cookie store interface for managing cookies\r\n * @param options - TernSecure handler options containing cookie configurations\r\n */\r\nexport async function clearSessionCookie(\r\n cookieStore: CookieStore,\r\n options?: TernSecureHandlerOptions,\r\n): Promise<SessionResult> {\r\n try {\r\n const adminAuth = getAuthForTenant(options?.tenantId || '');\r\n const cookiePrefix = getCookiePrefix();\r\n\r\n // Get the session cookie name for revocation purposes\r\n const sessionCookieName = getCookieName(constants.Cookies.Session, cookiePrefix);\r\n const sessionCookie = await cookieStore.get(sessionCookieName);\r\n\r\n const deletionPromises: Promise<void>[] = [];\r\n\r\n // Delete all cookie types\r\n // Session cookie (only if it was configured)\r\n if (options?.cookies?.session) {\r\n deletionPromises.push(cookieStore.delete(sessionCookieName));\r\n }\r\n\r\n // Always delete default cookies\r\n const idTokenCookieName = getCookieName(constants.Cookies.IdToken, cookiePrefix);\r\n deletionPromises.push(cookieStore.delete(idTokenCookieName));\r\n\r\n const refreshTokenCookieName = getCookieName(constants.Cookies.Refresh, cookiePrefix);\r\n deletionPromises.push(cookieStore.delete(refreshTokenCookieName));\r\n\r\n const customTokenCookieName = getCookieName(constants.Cookies.Custom, cookiePrefix);\r\n deletionPromises.push(cookieStore.delete(customTokenCookieName));\r\n\r\n // Also delete legacy cookie names for backward compatibility\r\n deletionPromises.push(cookieStore.delete(constants.Cookies.Session));\r\n\r\n await Promise.all(deletionPromises);\r\n\r\n // Revoke refresh tokens if session cookie exists and revocation is enabled\r\n if (DEFAULT_COOKIE_CONFIG.REVOKE_REFRESH_TOKENS_ON_SIGNOUT && sessionCookie?.value) {\r\n try {\r\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie.value);\r\n await adminAuth.revokeRefreshTokens(decodedClaims.sub);\r\n } catch (revokeError) {\r\n console.error('[clearSessionCookie] Failed to revoke refresh tokens:', revokeError);\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n message: 'Session cleared successfully',\r\n };\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error);\r\n return {\r\n success: false,\r\n message: authError.message || 'Failed to clear session',\r\n error: authError.code || 'INTERNAL_ERROR',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates a custom token for a user\r\n * @param uid - User ID to create the custom token for\r\n * @param options - TernSecure handler options\r\n * @returns Promise resolving to the custom token string or null if creation fails\r\n */\r\nexport async function createCustomToken(\r\n uid: string,\r\n options?: TernSecureHandlerOptions,\r\n): Promise<string | null> {\r\n const adminAuth = getAuthForTenant(options?.tenantId || '');\r\n try {\r\n const customToken = await adminAuth.createCustomToken(uid);\r\n return customToken;\r\n } catch (error) {\r\n console.error('[createCustomToken] Error creating custom token:', error);\r\n return null;\r\n }\r\n}\r\n\r\n\r\nexport async function createCustomTokenClaims(\r\n uid: string,\r\n developerClaims?: { [key: string]: unknown },\r\n): Promise<string> {\r\n const adminAuth = getAuthForTenant();\r\n try {\r\n const customToken = await adminAuth.createCustomToken(uid, developerClaims);\r\n return customToken;\r\n } catch (error) {\r\n console.error('[createCustomToken] Error creating custom token:', error);\r\n return '';\r\n }\r\n}\r\n","import admin from 'firebase-admin';\r\n\r\nimport { initializeAdminConfig } from './config';\r\n\r\nif (!admin.apps.length) {\r\n try {\r\n const config = initializeAdminConfig();\r\n admin.initializeApp({\r\n credential: admin.credential.cert({\r\n ...config,\r\n privateKey: config.privateKey.replace(/\\\\n/g, '\\n'),\r\n }),\r\n });\r\n } catch (error) {\r\n console.error('Firebase admin initialization error', error);\r\n }\r\n}\r\n\r\nexport const adminTernSecureAuth: admin.auth.Auth = admin.auth();\r\nexport const adminTernSecureDb: admin.firestore.Firestore = admin.firestore();\r\nexport const TernSecureTenantManager: admin.auth.TenantManager = admin.auth().tenantManager();\r\n\r\n/**\r\n * Gets the appropriate Firebase Auth instance.\r\n * If a tenantId is provided, it returns the Auth instance for that tenant.\r\n * Otherwise, it returns the default project-level Auth instance.\r\n * @param tenantId - The optional tenant ID.\r\n * @returns An admin.auth.Auth instance.\r\n */\r\nexport function getAuthForTenant(tenantId?: string): admin.auth.Auth {\r\n if (tenantId) {\r\n return TernSecureTenantManager.authForTenant(tenantId) as unknown as admin.auth.Auth;\r\n }\r\n return admin.auth();\r\n}","import type { \r\n AdminConfigValidationResult, \r\n ConfigValidationResult, \r\n TernSecureAdminConfig, \r\n TernSecureConfig} from '@tern-secure/types'\r\n\r\n/**\r\n * Loads Firebase configuration from environment variables\r\n * @returns {TernSecureConfig} Firebase configuration object\r\n */\r\nexport const loadFireConfig = (): TernSecureConfig => ({\r\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\r\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\r\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\r\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\r\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\r\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\r\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || undefined,\r\n})\r\n\r\n/**\r\n * Validates Firebase configuration\r\n * @param {TernSecureConfig} config - Firebase configuration object\r\n * @throws {Error} If required configuration values are missing\r\n * @returns {TernSecureConfig} Validated configuration object\r\n */\r\nexport const validateConfig = (config: TernSecureConfig): ConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureConfig)[] = [\r\n 'apiKey',\r\n 'authDomain',\r\n 'projectId',\r\n 'storageBucket',\r\n 'messagingSenderId',\r\n 'appId'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeConfig = (): TernSecureConfig => {\r\n const config = loadFireConfig()\r\n const validationResult = validateConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}\r\n\r\n/**\r\n * Loads Firebase Admin configuration from environment variables\r\n * @returns {AdminConfig} Firebase Admin configuration object\r\n */\r\nexport const loadAdminConfig = (): TernSecureAdminConfig => ({\r\n projectId: process.env.FIREBASE_PROJECT_ID || '',\r\n clientEmail: process.env.FIREBASE_CLIENT_EMAIL || '',\r\n privateKey: process.env.FIREBASE_PRIVATE_KEY || '',\r\n})\r\n\r\n/**\r\n * Validates Firebase Admin configuration\r\n * @param {AdminConfig} config - Firebase Admin configuration object\r\n * @returns {ConfigValidationResult} Validation result\r\n */\r\nexport const validateAdminConfig = (config: TernSecureAdminConfig): AdminConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureAdminConfig)[] = [\r\n 'projectId',\r\n 'clientEmail',\r\n 'privateKey'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes admin configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeAdminConfig = (): TernSecureAdminConfig => {\r\n const config = loadAdminConfig()\r\n const validationResult = validateAdminConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase Admin configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}","import type { SignInResponse } from '@tern-secure/types';\r\n\r\nimport { TernSecureTenantManager } from \"../utils/admin-init\";\r\n\r\n\r\nexport async function createTenant(\r\n displayName: string,\r\n emailSignInConfig: {\r\n enabled: boolean;\r\n passwordRequired: boolean;\r\n },\r\n multiFactorConfig?: {\r\n state: 'ENABLED' | 'DISABLED';\r\n factorIds: \"phone\"[];\r\n testPhoneNumbers?: {\r\n [phoneNumber: string]: string;\r\n }\r\n }\r\n) {\r\n try {\r\n const tenantConfig = {\r\n displayName,\r\n emailSignInConfig,\r\n ...(multiFactorConfig && { multiFactorConfig })\r\n };\r\n\r\n const tenant = await TernSecureTenantManager.createTenant(tenantConfig);\r\n \r\n return {\r\n success: true,\r\n tenantId: tenant.tenantId,\r\n displayName: tenant.displayName,\r\n };\r\n } catch (error) {\r\n console.error('Error creating tenant:', error);\r\n throw new Error('Failed to create tenant');\r\n }\r\n}\r\n\r\nexport async function createTenantUser(\r\n email: string,\r\n password: string,\r\n tenantId: string\r\n): Promise<SignInResponse> {\r\n try {\r\n const tenantAuth = TernSecureTenantManager.authForTenant(tenantId);\r\n \r\n const userRecord = await tenantAuth.createUser({\r\n email,\r\n password,\r\n emailVerified: false,\r\n disabled: false\r\n });\r\n\r\n return {\r\n success: true,\r\n message: 'Tenant user created successfully',\r\n user: userRecord.uid,\r\n };\r\n } catch (error) {\r\n console.error('Error creating tenant user:', error);\r\n throw new Error('Failed to create tenant user');\r\n }\r\n}\r\n","\"use server\";\n\nimport { getCookieName, getCookiePrefix } from '@tern-secure/shared/cookie';\nimport { handleFirebaseAuthError } from \"@tern-secure/shared/errors\";\nimport type { TernVerificationResult } from \"@tern-secure/types\";\nimport { cookies } from \"next/headers\";\n\nimport { constants } from '../constants';\nimport { adminTernSecureAuth as adminAuth, getAuthForTenant } from \"../utils/admin-init\";\n\n\nconst SESSION_CONSTANTS = {\n COOKIE_NAME: constants.Cookies.Session,\n DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1000, // 5 days\n DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5,\n REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true,\n} as const;\n\nexport async function CreateNextSessionCookie(idToken: string) {\n try {\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\n const sessionCookie = await adminAuth.createSessionCookie(idToken, {\n expiresIn,\n });\n\n const cookieStore = await cookies();\n cookieStore.set(constants.Cookies.Session, sessionCookie, {\n maxAge: expiresIn,\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n path: \"/\",\n });\n return { success: true, message: \"Session created\" };\n } catch (error) {\n return { success: false, message: \"Failed to create session\" };\n }\n}\n\nexport async function GetNextServerSessionCookie() {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get(\"_session_cookie\")?.value;\n\n if (!sessionCookie) {\n throw new Error(\"No session cookie found\");\n }\n\n try {\n const decondeClaims = await adminAuth.verifySessionCookie(\n sessionCookie,\n true\n );\n return {\n token: sessionCookie,\n userId: decondeClaims.uid,\n };\n } catch (error) {\n console.error(\"Error verifying session:\", error);\n throw new Error(\"Invalid Session\");\n }\n}\n\nexport async function GetNextIdToken() {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"_session_token\")?.value;\n\n if (!token) {\n throw new Error(\"No session cookie found\");\n }\n\n try {\n const decodedClaims = await adminAuth.verifyIdToken(token);\n return {\n token: token,\n userId: decodedClaims.uid,\n };\n } catch (error) {\n console.error(\"Error verifying session:\", error);\n throw new Error(\"Invalid Session\");\n }\n}\n\nexport async function SetNextServerSession(token: string) {\n try {\n const cookieStore = await cookies();\n cookieStore.set(\"_session_token\", token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"strict\",\n maxAge: 60 * 60, // 1 hour\n path: \"/\",\n });\n return { success: true, message: \"Session created\" };\n } catch {\n return { success: false, message: \"Failed to create session\" };\n }\n}\n\nexport async function SetNextServerToken(token: string) {\n try {\n const cookieStore = await cookies();\n cookieStore.set(\"_tern\", token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"strict\",\n maxAge: 60 * 60, // 1 hour\n path: \"/\",\n });\n return { success: true, message: \"Session created\" };\n } catch {\n return { success: false, message: \"Failed to create session\" };\n }\n}\n\nexport async function VerifyNextTernIdToken(\n token: string\n): Promise<TernVerificationResult> {\n try {\n const decodedToken = await adminAuth.verifyIdToken(token);\n return {\n ...decodedToken,\n valid: true,\n };\n } catch (error) {\n console.error(\"[VerifyNextTernIdToken] Error verifying session:\", error);\n const authError = handleFirebaseAuthError(error);\n return {\n valid: false,\n error: authError,\n };\n }\n}\n\nexport async function VerifyNextTernSessionCookie(\n session: string\n): Promise<TernVerificationResult> {\n try {\n const res = await adminAuth.verifySessionCookie(session);\n console.warn(\n \"[VerifyNextTernSessionCookie] uid in Decoded Token:\",\n res.uid\n );\n return {\n valid: true,\n ...res,\n };\n } catch (error) {\n console.error(\n \"[VerifyNextTernSessionCookie] Error verifying session:\",\n error\n );\n const authError = handleFirebaseAuthError(error);\n return {\n valid: false,\n error: authError,\n };\n }\n}\n\nexport async function ClearNextSessionCookie(tenantId?: string) {\n try {\n console.log(\"[clearSessionCookie] Clearing session for tenant:\", tenantId);\n const tenantAuth = getAuthForTenant(tenantId);\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get(SESSION_CONSTANTS.COOKIE_NAME);\n const cookiePrefix = getCookiePrefix();\n\n cookieStore.delete(SESSION_CONSTANTS.COOKIE_NAME);\n cookieStore.delete(getCookieName(constants.Cookies.IdToken, cookiePrefix));\n cookieStore.delete(getCookieName(constants.Cookies.Refresh, cookiePrefix));\n cookieStore.delete(constants.Cookies.Custom);\n\n if (\n SESSION_CONSTANTS.REVOKE_REFRESH_TOKENS_ON_SIGNOUT &&\n sessionCookie?.value\n ) {\n try {\n const decodedClaims = await tenantAuth.verifySessionCookie(\n sessionCookie.value\n );\n await tenantAuth.revokeRefreshTokens(decodedClaims.sub);\n console.log(\n `[clearSessionCookie] Successfully revoked tokens for user: ${decodedClaims.sub}`\n );\n } catch (revokeError) {\n console.error(\n \"[ClearNextSessionCookie] Failed to revoke refresh tokens:\",\n revokeError\n );\n }\n }\n return { success: true, message: \"Session cleared successfully\" };\n } catch (error) {\n console.error(\"Error clearing session:\", error);\n return { success: false, message: \"Failed to clear session cookies\" };\n }\n}\n","import type { CheckCustomClaims, DecodedIdToken,SharedSignInAuthObjectProperties } from \"@tern-secure/types\";\n\nimport { VerifyNextTernSessionCookie } from \"../admin/nextSessionTernSecure\";\nimport type { TernSecureRequest} from \"../tokens/ternSecureRequest\";\nimport { createTernSecureRequest } from \"../tokens/ternSecureRequest\";\n\nexport type SignInAuthObject = SharedSignInAuthObjectProperties & {\n has: CheckCustomClaims\n}\n\nexport type SignInState = {\n auth: () => SignInAuthObject\n token: string\n headers: Headers\n}\n\nexport type RequestState = SignInState\n\nexport interface BackendInstance {\n ternSecureRequest: TernSecureRequest;\n requestState: RequestState;\n}\n\nexport const createBackendInstance = async (request: Request): Promise<BackendInstance> => {\n const ternSecureRequest = createTernSecureRequest(request);\n const requestState = await authenticateRequest(request);\n \n return {\n ternSecureRequest,\n requestState,\n };\n};\n\nexport async function authenticateRequest(request: Request): Promise<RequestState> {\n const sessionCookie = request.headers.get('cookie');\n const sessionToken = sessionCookie?.split(';')\n .find(c => c.trim().startsWith('_session_cookie='))\n ?.split('=')[1];\n \n if (!sessionToken) {\n throw new Error(\"No session token found\");\n }\n\n const verificationResult = await VerifyNextTernSessionCookie(sessionToken);\n\n if (!verificationResult.valid) {\n throw new Error(\"Invalid session token\");\n }\n\n return signedIn(\n verificationResult as DecodedIdToken,\n new Headers(request.headers),\n sessionToken\n );\n}\n\nexport function signInAuthObject(\n session: DecodedIdToken,\n): SignInAuthObject {\n return {\n session,\n userId: session.uid,\n has: {} as CheckCustomClaims,\n };\n}\n\nexport function signedIn(\n session: DecodedIdToken,\n headers: Headers = new Headers(),\n token: string\n): SignInState {\n const authObject = signInAuthObject(session);\n return {\n auth: () => authObject,\n token,\n headers,\n };\n}\n"],"mappings":"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","names":["getCookieName","getCookiePrefix","handleFirebaseAuthError","SESSION_CONSTANTS","handleFirebaseAuthError","getCookiePrefix","getCookieName"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tokens/keys.ts","../src/tokens/verify.ts"],"sourcesContent":["import { type RemoteJWKSetOptions } from 'jose';\n\nimport {\n CACHE_CONTROL_REGEX,\n DEFAULT_CACHE_DURATION,\n GOOGLE_PUBLIC_KEYS_URL,\n MAX_CACHE_LAST_UPDATED_AT_SECONDS\n} from '../constants';\nimport { TokenVerificationError, TokenVerificationErrorReason } from '../utils/errors';\n\nexport type PublicKeys = { [key: string]: string };\n\ninterface PublicKeysResponse {\n keys: PublicKeys;\n expiresAt: number;\n}\n\nexport type LoadJWKFromRemoteOptions = RemoteJWKSetOptions & {\n kid: string;\n keyURL?: string;\n skipJwksCache?: boolean;\n};\n\ntype CertificateCache = Record<string, string>;\n\nlet cache: CertificateCache = {};\nlet lastUpdatedAt = 0;\nlet googleExpiresAt = 0;\n\nfunction getFromCache(kid: string) {\n return cache[kid];\n}\n\nfunction getCacheValues() {\n return Object.values(cache);\n}\n\nfunction setInCache(kid: string, certificate: string, shouldExpire = true) {\n cache[kid] = certificate;\n lastUpdatedAt = shouldExpire ? Date.now() : -1;\n}\n\nasync function fetchPublicKeys(keyUrl: string): Promise<PublicKeysResponse> {\n const url = new URL(keyUrl);\n const response = await fetch(url);\n if (!response.ok) {\n throw new TokenVerificationError({\n message: `Error loading public keys from ${url.href} with code=${response.status} `,\n reason: TokenVerificationErrorReason.TokenInvalid,\n });\n }\n\n const data = await response.json();\n const expiresAt = getExpiresAt(response);\n\n return {\n keys: data,\n expiresAt,\n };\n}\n\nexport async function loadJWKFromRemote({\n keyURL = GOOGLE_PUBLIC_KEYS_URL,\n skipJwksCache,\n kid,\n}: LoadJWKFromRemoteOptions): Promise<string> {\n if (skipJwksCache || isCacheExpired() || !getFromCache(kid)) {\n const { keys, expiresAt } = await fetchPublicKeys(keyURL);\n\n if (!keys || Object.keys(keys).length === 0) {\n throw new TokenVerificationError({\n message: `The JWKS endpoint ${keyURL} returned no keys`,\n reason: TokenVerificationErrorReason.RemoteJWKFailedToLoad,\n });\n }\n googleExpiresAt = expiresAt;\n\n Object.entries(keys).forEach(([keyId, cert]) => {\n setInCache(keyId, cert);\n });\n }\n const cert = getFromCache(kid);\n if (!cert) {\n getCacheValues();\n const availableKids = Object.keys(cache).sort().join(', ');\n\n throw new TokenVerificationError({\n message: `No public key found for kid \"${kid}\". Available kids: [${availableKids}]`,\n reason: TokenVerificationErrorReason.TokenInvalid,\n });\n }\n return cert;\n}\n\nfunction isCacheExpired() {\n const now = Date.now();\n if (lastUpdatedAt === -1) {\n return false;\n }\n\n const cacheAge = now - lastUpdatedAt;\n const maxCacheAge = MAX_CACHE_LAST_UPDATED_AT_SECONDS * 1000;\n const localCacheExpired = cacheAge >= maxCacheAge;\n const googleCacheExpired = now >= googleExpiresAt;\n\n const isExpired = localCacheExpired || googleCacheExpired;\n\n if (isExpired) {\n cache = {};\n }\n\n return isExpired;\n}\n\nfunction getExpiresAt(res: Response) {\n const cacheControlHeader = res.headers.get('cache-control');\n if (!cacheControlHeader) {\n return Date.now() + DEFAULT_CACHE_DURATION;\n }\n const maxAgeMatch = cacheControlHeader.match(CACHE_CONTROL_REGEX);\n const maxAge = maxAgeMatch ? parseInt(maxAgeMatch[1], 10) : DEFAULT_CACHE_DURATION / 1000;\n\n return Date.now() + maxAge * 1000;\n}\n\nexport const getCacheStats = () => ({\n localExpiry: lastUpdatedAt + MAX_CACHE_LAST_UPDATED_AT_SECONDS * 1000,\n googleExpiry: googleExpiresAt,\n cacheCount: Object.keys(cache).length,\n});\n","import type { DecodedIdToken, TernSecureConfig } from '@tern-secure/types';\n\nimport type { JwtReturnType } from '../jwt/types';\nimport { ternDecodeJwt, verifyJwt, type VerifyJwtOptions } from '../jwt/verifyJwt';\nimport { TokenVerificationError, TokenVerificationErrorReason } from '../utils/errors';\nimport type { LoadJWKFromRemoteOptions } from './keys';\nimport { loadJWKFromRemote } from './keys';\n\nexport type VerifyTokenVOptions = Omit<VerifyJwtOptions, 'key'> & Omit<LoadJWKFromRemoteOptions, 'kid'> & {\n jwtKey?: string;\n};\n\nexport { TernSecureConfig };\n\nexport async function verifyToken(\n token: string,\n options: VerifyTokenVOptions,\n): Promise<JwtReturnType<DecodedIdToken, TokenVerificationError>> {\n const { data: decodedResult, errors } = ternDecodeJwt(token);\n\n if (errors) {\n return { errors };\n }\n\n const { header } = decodedResult;\n const { kid } = header;\n\n if (!kid) {\n return {\n errors: [\n new TokenVerificationError({\n reason: TokenVerificationErrorReason.TokenInvalid,\n message: 'JWT \"kid\" header is missing.',\n }),\n ],\n };\n }\n\n try {\n const key = options.jwtKey || (await loadJWKFromRemote({ ...options, kid }));\n\n if (!key) {\n return {\n errors: [\n new TokenVerificationError({\n reason: TokenVerificationErrorReason.TokenInvalid,\n message: `No public key found for kid \"${kid}\".`,\n }),\n ],\n };\n }\n return await verifyJwt(token, { ...options, key });\n } catch (error) {\n if (error instanceof TokenVerificationError) {\n return { errors: [error] };\n }\n return {\n errors: [error as TokenVerificationError],\n };\n }\n}\n"],"mappings":"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","names":["cert"]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { RequestOptions } from "./types";
|
|
2
|
-
export declare const getSessionConfig: (options?: RequestOptions) => {
|
|
3
|
-
COOKIE_NAME: string | undefined;
|
|
4
|
-
DEFAULT_EXPIRES_IN_MS: number | undefined;
|
|
5
|
-
DEFAULT_EXPIRES_IN_SECONDS: number;
|
|
6
|
-
REVOKE_REFRESH_TOKENS_ON_SIGNOUT: boolean | undefined;
|
|
7
|
-
};
|
|
8
|
-
export declare const getCookieOptions: (options?: RequestOptions) => {
|
|
9
|
-
httpOnly: boolean | undefined;
|
|
10
|
-
secure: boolean | undefined;
|
|
11
|
-
sameSite: "none" | "lax" | "strict" | undefined;
|
|
12
|
-
path: string | undefined;
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=sessionConfig.d.ts.map
|