@tern-secure/backend 1.2.0-canary.v20250919134427 → 1.2.0-canary.v20251002175916
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/auth/package.json +5 -0
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +200 -182
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +23 -489
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/nextSessionTernSecure.d.ts.map +1 -1
- package/dist/admin/sessionTernSecure.d.ts +27 -5
- package/dist/admin/sessionTernSecure.d.ts.map +1 -1
- package/dist/auth/getauth.d.ts +15 -0
- package/dist/auth/getauth.d.ts.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +694 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +53 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/{chunk-ZIO4EKS5.mjs → chunk-4SGWLAJG.mjs} +8 -31
- package/dist/chunk-4SGWLAJG.mjs.map +1 -0
- package/dist/chunk-NEPV6OWI.mjs +550 -0
- package/dist/chunk-NEPV6OWI.mjs.map +1 -0
- package/dist/chunk-YKIA5EBF.mjs +142 -0
- package/dist/chunk-YKIA5EBF.mjs.map +1 -0
- package/dist/constants.d.ts +4 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/fireRestApi/createFireApi.d.ts +12 -0
- package/dist/fireRestApi/createFireApi.d.ts.map +1 -0
- package/dist/fireRestApi/emulator.d.ts +4 -0
- package/dist/fireRestApi/emulator.d.ts.map +1 -0
- package/dist/fireRestApi/endpointUrl.d.ts +6 -0
- package/dist/fireRestApi/endpointUrl.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/AbstractApi.d.ts +7 -0
- package/dist/fireRestApi/endpoints/AbstractApi.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/EmailApi.d.ts +14 -0
- package/dist/fireRestApi/endpoints/EmailApi.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/PasswordApi.d.ts +20 -0
- package/dist/fireRestApi/endpoints/PasswordApi.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/SignInTokenApi.d.ts +11 -0
- package/dist/fireRestApi/endpoints/SignInTokenApi.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/SignUpApi.d.ts +11 -0
- package/dist/fireRestApi/endpoints/SignUpApi.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/TokenApi.d.ts +21 -0
- package/dist/fireRestApi/endpoints/TokenApi.d.ts.map +1 -0
- package/dist/fireRestApi/endpoints/index.d.ts +6 -0
- package/dist/fireRestApi/endpoints/index.d.ts.map +1 -0
- package/dist/fireRestApi/index.d.ts +2 -0
- package/dist/fireRestApi/index.d.ts.map +1 -0
- package/dist/fireRestApi/request.d.ts +34 -0
- package/dist/fireRestApi/request.d.ts.map +1 -0
- package/dist/fireRestApi/resources/JSON.d.ts +50 -0
- package/dist/fireRestApi/resources/JSON.d.ts.map +1 -0
- package/dist/fireRestApi/resources/Token.d.ts +13 -0
- package/dist/fireRestApi/resources/Token.d.ts.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +271 -75
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +257 -179
- package/dist/index.mjs.map +1 -1
- package/dist/instance/backendFireInstance.d.ts +4 -4
- package/dist/instance/backendFireInstance.d.ts.map +1 -1
- package/dist/instance/backendInstanceEdge.d.ts +2 -2
- package/dist/instance/backendInstanceEdge.d.ts.map +1 -1
- package/dist/tokens/authstate.d.ts +1 -1
- package/dist/tokens/authstate.d.ts.map +1 -1
- package/dist/tokens/keys.d.ts.map +1 -1
- package/dist/tokens/request.d.ts +3 -3
- package/dist/tokens/request.d.ts.map +1 -1
- package/dist/tokens/requestFire.d.ts.map +1 -1
- package/dist/tokens/types.d.ts +5 -2
- package/dist/tokens/types.d.ts.map +1 -1
- package/dist/utils/options.d.ts +1 -1
- package/dist/utils/options.d.ts.map +1 -1
- package/package.json +14 -3
- package/dist/admin/gemini.sessionTernSecure.d.ts +0 -8
- package/dist/admin/gemini.sessionTernSecure.d.ts.map +0 -1
- package/dist/chunk-ZIO4EKS5.mjs.map +0 -1
package/dist/admin/index.mjs
CHANGED
|
@@ -1,493 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
];
|
|
25
|
-
const errors = [];
|
|
26
|
-
requiredFields.forEach((field) => {
|
|
27
|
-
if (!config[field]) {
|
|
28
|
-
errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
return {
|
|
32
|
-
isValid: errors.length === 0,
|
|
33
|
-
errors,
|
|
34
|
-
config
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
var initializeAdminConfig = () => {
|
|
38
|
-
const config = loadAdminConfig();
|
|
39
|
-
const validationResult = validateAdminConfig(config);
|
|
40
|
-
if (!validationResult.isValid) {
|
|
41
|
-
throw new Error(
|
|
42
|
-
`Firebase Admin configuration validation failed:
|
|
43
|
-
${validationResult.errors.join("\n")}`
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
return config;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
// src/utils/admin-init.ts
|
|
50
|
-
if (!admin.apps.length) {
|
|
51
|
-
try {
|
|
52
|
-
const config = initializeAdminConfig();
|
|
53
|
-
admin.initializeApp({
|
|
54
|
-
credential: admin.credential.cert({
|
|
55
|
-
...config,
|
|
56
|
-
privateKey: config.privateKey.replace(/\\n/g, "\n")
|
|
57
|
-
})
|
|
58
|
-
});
|
|
59
|
-
} catch (error) {
|
|
60
|
-
console.error("Firebase admin initialization error", error);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
var adminTernSecureAuth = admin.auth();
|
|
64
|
-
var adminTernSecureDb = admin.firestore();
|
|
65
|
-
var TernSecureTenantManager = admin.auth().tenantManager();
|
|
66
|
-
function getAuthForTenant(tenantId) {
|
|
67
|
-
if (tenantId) {
|
|
68
|
-
return TernSecureTenantManager.authForTenant(tenantId);
|
|
69
|
-
}
|
|
70
|
-
return admin.auth();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// src/admin/sessionTernSecure.ts
|
|
74
|
-
var SESSION_CONSTANTS = {
|
|
75
|
-
COOKIE_NAME: "_session_cookie",
|
|
76
|
-
//DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1000, // 5 days
|
|
77
|
-
//DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5, // 5days
|
|
78
|
-
DEFAULT_EXPIRES_IN_MS: 5 * 60 * 1e3,
|
|
79
|
-
// 5 minutes
|
|
80
|
-
DEFAULT_EXPIRES_IN_SECONDS: 5 * 60,
|
|
81
|
-
REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true
|
|
82
|
-
};
|
|
83
|
-
var COOKIE_OPTIONS = {
|
|
84
|
-
httpOnly: true,
|
|
85
|
-
secure: process.env.NODE_ENV === "production",
|
|
86
|
-
sameSite: "strict",
|
|
87
|
-
path: "/"
|
|
88
|
-
};
|
|
89
|
-
async function createSessionCookie(params, cookieStore, options) {
|
|
90
|
-
try {
|
|
91
|
-
const tenantAuth = getAuthForTenant(options?.tenantId);
|
|
92
|
-
const sessionConfig = getSessionConfig(options);
|
|
93
|
-
const cookieOptions = getCookieOptions(options);
|
|
94
|
-
let decodedToken;
|
|
95
|
-
let sessionCookie;
|
|
96
|
-
const idToken = typeof params === "string" ? params : params.idToken;
|
|
97
|
-
if (!idToken) {
|
|
98
|
-
const error = new Error("ID token is required for session creation");
|
|
99
|
-
console.error("[createSessionCookie] Missing ID token:", error);
|
|
100
|
-
return {
|
|
101
|
-
success: false,
|
|
102
|
-
message: "ID token is required",
|
|
103
|
-
error: "INVALID_TOKEN",
|
|
104
|
-
cookieSet: false
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
try {
|
|
108
|
-
console.log("Verifying ID token for tenant:", options?.tenantId);
|
|
109
|
-
decodedToken = await tenantAuth.verifyIdToken(idToken);
|
|
110
|
-
} catch (verifyError) {
|
|
111
|
-
console.error(
|
|
112
|
-
"[createSessionCookie] ID token verification failed:",
|
|
113
|
-
verifyError
|
|
114
|
-
);
|
|
115
|
-
const authError = handleFirebaseAuthError(verifyError);
|
|
116
|
-
return {
|
|
117
|
-
success: false,
|
|
118
|
-
message: authError.message,
|
|
119
|
-
error: authError.code,
|
|
120
|
-
cookieSet: false
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
if (!decodedToken) {
|
|
124
|
-
const error = new Error("Invalid ID token - verification returned null");
|
|
125
|
-
console.error(
|
|
126
|
-
"[createSessionCookie] Token verification returned null:",
|
|
127
|
-
error
|
|
128
|
-
);
|
|
129
|
-
return {
|
|
130
|
-
success: false,
|
|
131
|
-
message: "Invalid ID token",
|
|
132
|
-
error: "INVALID_TOKEN",
|
|
133
|
-
cookieSet: false
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
sessionCookie = await tenantAuth.createSessionCookie(idToken, {
|
|
138
|
-
expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_MS
|
|
139
|
-
});
|
|
140
|
-
} catch (sessionError) {
|
|
141
|
-
console.error(
|
|
142
|
-
"[createSessionCookie] Firebase session cookie creation failed:",
|
|
143
|
-
sessionError
|
|
144
|
-
);
|
|
145
|
-
const authError = handleFirebaseAuthError(sessionError);
|
|
146
|
-
return {
|
|
147
|
-
success: false,
|
|
148
|
-
message: authError.message,
|
|
149
|
-
error: authError.code,
|
|
150
|
-
cookieSet: false
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
let cookieSetSuccessfully = false;
|
|
154
|
-
try {
|
|
155
|
-
cookieStore.set(SESSION_CONSTANTS.COOKIE_NAME, sessionCookie, {
|
|
156
|
-
maxAge: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,
|
|
157
|
-
...COOKIE_OPTIONS
|
|
158
|
-
});
|
|
159
|
-
const verifySetCookie = await cookieStore.get(
|
|
160
|
-
SESSION_CONSTANTS.COOKIE_NAME
|
|
161
|
-
);
|
|
162
|
-
cookieSetSuccessfully = !!verifySetCookie?.value;
|
|
163
|
-
if (!cookieSetSuccessfully) {
|
|
164
|
-
const error = new Error("Session cookie was not set successfully");
|
|
165
|
-
console.error(
|
|
166
|
-
"[createSessionCookie] Cookie verification failed:",
|
|
167
|
-
error
|
|
168
|
-
);
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
171
|
-
} catch (cookieError) {
|
|
172
|
-
console.error(
|
|
173
|
-
"[createSessionCookie] Failed to set session cookie:",
|
|
174
|
-
cookieError
|
|
175
|
-
);
|
|
176
|
-
return {
|
|
177
|
-
success: false,
|
|
178
|
-
message: "Failed to set session cookie",
|
|
179
|
-
error: "COOKIE_SET_FAILED",
|
|
180
|
-
cookieSet: false
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
console.log(
|
|
184
|
-
`[createSessionCookie] Session cookie created successfully for user: ${decodedToken.uid}`
|
|
185
|
-
);
|
|
186
|
-
return {
|
|
187
|
-
success: true,
|
|
188
|
-
message: "Session created successfully",
|
|
189
|
-
expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,
|
|
190
|
-
cookieSet: cookieSetSuccessfully
|
|
191
|
-
};
|
|
192
|
-
} catch (error) {
|
|
193
|
-
console.error("[createSessionCookie] Unexpected error:", error);
|
|
194
|
-
const authError = handleFirebaseAuthError(error);
|
|
195
|
-
return {
|
|
196
|
-
success: false,
|
|
197
|
-
message: authError.message || "Failed to create session",
|
|
198
|
-
error: authError.code || "INTERNAL_ERROR",
|
|
199
|
-
cookieSet: false
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
async function clearSessionCookie(cookieStore, options) {
|
|
204
|
-
try {
|
|
205
|
-
const adminAuth = getAuthForTenant(options?.tenantId);
|
|
206
|
-
const sessionCookie = await cookieStore.get(SESSION_CONSTANTS.COOKIE_NAME);
|
|
207
|
-
await cookieStore.delete(SESSION_CONSTANTS.COOKIE_NAME);
|
|
208
|
-
await cookieStore.delete("_session_token");
|
|
209
|
-
await cookieStore.delete("_session");
|
|
210
|
-
if (SESSION_CONSTANTS.REVOKE_REFRESH_TOKENS_ON_SIGNOUT && sessionCookie?.value) {
|
|
211
|
-
try {
|
|
212
|
-
const decodedClaims = await adminAuth.verifySessionCookie(
|
|
213
|
-
sessionCookie.value
|
|
214
|
-
);
|
|
215
|
-
await adminAuth.revokeRefreshTokens(decodedClaims.sub);
|
|
216
|
-
console.log(
|
|
217
|
-
`[clearSessionCookie] Successfully revoked tokens for user: ${decodedClaims.sub}`
|
|
218
|
-
);
|
|
219
|
-
} catch (revokeError) {
|
|
220
|
-
console.error(
|
|
221
|
-
"[clearSessionCookie] Failed to revoke refresh tokens:",
|
|
222
|
-
revokeError
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
console.log("[clearSessionCookie] Session cookies cleared successfully");
|
|
227
|
-
return {
|
|
228
|
-
success: true,
|
|
229
|
-
message: "Session cleared successfully",
|
|
230
|
-
cookieSet: false
|
|
231
|
-
};
|
|
232
|
-
} catch (error) {
|
|
233
|
-
console.error("[clearSessionCookie] Unexpected error:", error);
|
|
234
|
-
const authError = handleFirebaseAuthError(error);
|
|
235
|
-
return {
|
|
236
|
-
success: false,
|
|
237
|
-
message: authError.message || "Failed to clear session",
|
|
238
|
-
error: authError.code || "INTERNAL_ERROR",
|
|
239
|
-
cookieSet: false
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// src/admin/tenant.ts
|
|
245
|
-
async function createTenant(displayName, emailSignInConfig, multiFactorConfig) {
|
|
246
|
-
try {
|
|
247
|
-
const tenantConfig = {
|
|
248
|
-
displayName,
|
|
249
|
-
emailSignInConfig,
|
|
250
|
-
...multiFactorConfig && { multiFactorConfig }
|
|
251
|
-
};
|
|
252
|
-
const tenant = await TernSecureTenantManager.createTenant(tenantConfig);
|
|
253
|
-
return {
|
|
254
|
-
success: true,
|
|
255
|
-
tenantId: tenant.tenantId,
|
|
256
|
-
displayName: tenant.displayName
|
|
257
|
-
};
|
|
258
|
-
} catch (error) {
|
|
259
|
-
console.error("Error creating tenant:", error);
|
|
260
|
-
throw new Error("Failed to create tenant");
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
async function createTenantUser(email, password, tenantId) {
|
|
264
|
-
try {
|
|
265
|
-
const tenantAuth = TernSecureTenantManager.authForTenant(tenantId);
|
|
266
|
-
const userRecord = await tenantAuth.createUser({
|
|
267
|
-
email,
|
|
268
|
-
password,
|
|
269
|
-
emailVerified: false,
|
|
270
|
-
disabled: false
|
|
271
|
-
});
|
|
272
|
-
return {
|
|
273
|
-
success: true,
|
|
274
|
-
message: "Tenant user created successfully",
|
|
275
|
-
user: userRecord.uid
|
|
276
|
-
};
|
|
277
|
-
} catch (error) {
|
|
278
|
-
console.error("Error creating tenant user:", error);
|
|
279
|
-
throw new Error("Failed to create tenant user");
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// src/admin/nextSessionTernSecure.ts
|
|
284
|
-
import { handleFirebaseAuthError as handleFirebaseAuthError2 } from "@tern-secure/shared/errors";
|
|
285
|
-
import { cookies } from "next/headers";
|
|
286
|
-
var SESSION_CONSTANTS2 = {
|
|
287
|
-
COOKIE_NAME: "_session_cookie",
|
|
288
|
-
DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1e3,
|
|
289
|
-
// 5 days
|
|
290
|
-
DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5,
|
|
291
|
-
REVOKE_REFRESH_TOKENS_ON_SIGNOUT: true
|
|
292
|
-
};
|
|
293
|
-
async function CreateNextSessionCookie(idToken) {
|
|
294
|
-
try {
|
|
295
|
-
const expiresIn = 60 * 60 * 24 * 5 * 1e3;
|
|
296
|
-
const sessionCookie = await adminTernSecureAuth.createSessionCookie(idToken, {
|
|
297
|
-
expiresIn
|
|
298
|
-
});
|
|
299
|
-
const cookieStore = await cookies();
|
|
300
|
-
cookieStore.set("_session_cookie", sessionCookie, {
|
|
301
|
-
maxAge: expiresIn,
|
|
302
|
-
httpOnly: true,
|
|
303
|
-
secure: process.env.NODE_ENV === "production",
|
|
304
|
-
path: "/"
|
|
305
|
-
});
|
|
306
|
-
return { success: true, message: "Session created" };
|
|
307
|
-
} catch (error) {
|
|
308
|
-
return { success: false, message: "Failed to create session" };
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
async function GetNextServerSessionCookie() {
|
|
312
|
-
const cookieStore = await cookies();
|
|
313
|
-
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
314
|
-
if (!sessionCookie) {
|
|
315
|
-
throw new Error("No session cookie found");
|
|
316
|
-
}
|
|
317
|
-
try {
|
|
318
|
-
const decondeClaims = await adminTernSecureAuth.verifySessionCookie(
|
|
319
|
-
sessionCookie,
|
|
320
|
-
true
|
|
321
|
-
);
|
|
322
|
-
return {
|
|
323
|
-
token: sessionCookie,
|
|
324
|
-
userId: decondeClaims.uid
|
|
325
|
-
};
|
|
326
|
-
} catch (error) {
|
|
327
|
-
console.error("Error verifying session:", error);
|
|
328
|
-
throw new Error("Invalid Session");
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
async function GetNextIdToken() {
|
|
332
|
-
const cookieStore = await cookies();
|
|
333
|
-
const token = cookieStore.get("_session_token")?.value;
|
|
334
|
-
if (!token) {
|
|
335
|
-
throw new Error("No session cookie found");
|
|
336
|
-
}
|
|
337
|
-
try {
|
|
338
|
-
const decodedClaims = await adminTernSecureAuth.verifyIdToken(token);
|
|
339
|
-
return {
|
|
340
|
-
token,
|
|
341
|
-
userId: decodedClaims.uid
|
|
342
|
-
};
|
|
343
|
-
} catch (error) {
|
|
344
|
-
console.error("Error verifying session:", error);
|
|
345
|
-
throw new Error("Invalid Session");
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
async function SetNextServerSession(token) {
|
|
349
|
-
try {
|
|
350
|
-
const cookieStore = await cookies();
|
|
351
|
-
cookieStore.set("_session_token", token, {
|
|
352
|
-
httpOnly: true,
|
|
353
|
-
secure: process.env.NODE_ENV === "production",
|
|
354
|
-
sameSite: "strict",
|
|
355
|
-
maxAge: 60 * 60,
|
|
356
|
-
// 1 hour
|
|
357
|
-
path: "/"
|
|
358
|
-
});
|
|
359
|
-
return { success: true, message: "Session created" };
|
|
360
|
-
} catch {
|
|
361
|
-
return { success: false, message: "Failed to create session" };
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
async function SetNextServerToken(token) {
|
|
365
|
-
try {
|
|
366
|
-
const cookieStore = await cookies();
|
|
367
|
-
cookieStore.set("_tern", token, {
|
|
368
|
-
httpOnly: true,
|
|
369
|
-
secure: process.env.NODE_ENV === "production",
|
|
370
|
-
sameSite: "strict",
|
|
371
|
-
maxAge: 60 * 60,
|
|
372
|
-
// 1 hour
|
|
373
|
-
path: "/"
|
|
374
|
-
});
|
|
375
|
-
return { success: true, message: "Session created" };
|
|
376
|
-
} catch {
|
|
377
|
-
return { success: false, message: "Failed to create session" };
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
async function VerifyNextTernIdToken(token) {
|
|
381
|
-
try {
|
|
382
|
-
const decodedToken = await adminTernSecureAuth.verifyIdToken(token);
|
|
383
|
-
return {
|
|
384
|
-
...decodedToken,
|
|
385
|
-
valid: true
|
|
386
|
-
};
|
|
387
|
-
} catch (error) {
|
|
388
|
-
console.error("[VerifyNextTernIdToken] Error verifying session:", error);
|
|
389
|
-
const authError = handleFirebaseAuthError2(error);
|
|
390
|
-
return {
|
|
391
|
-
valid: false,
|
|
392
|
-
error: authError
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
async function VerifyNextTernSessionCookie(session) {
|
|
397
|
-
try {
|
|
398
|
-
const res = await adminTernSecureAuth.verifySessionCookie(session);
|
|
399
|
-
console.warn(
|
|
400
|
-
"[VerifyNextTernSessionCookie] uid in Decoded Token:",
|
|
401
|
-
res.uid
|
|
402
|
-
);
|
|
403
|
-
return {
|
|
404
|
-
valid: true,
|
|
405
|
-
...res
|
|
406
|
-
};
|
|
407
|
-
} catch (error) {
|
|
408
|
-
console.error(
|
|
409
|
-
"[VerifyNextTernSessionCookie] Error verifying session:",
|
|
410
|
-
error
|
|
411
|
-
);
|
|
412
|
-
const authError = handleFirebaseAuthError2(error);
|
|
413
|
-
return {
|
|
414
|
-
valid: false,
|
|
415
|
-
error: authError
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
async function ClearNextSessionCookie(tenantId) {
|
|
420
|
-
try {
|
|
421
|
-
console.log("[clearSessionCookie] Clearing session for tenant:", tenantId);
|
|
422
|
-
const tenantAuth = getAuthForTenant(tenantId);
|
|
423
|
-
const cookieStore = await cookies();
|
|
424
|
-
const sessionCookie = cookieStore.get(SESSION_CONSTANTS2.COOKIE_NAME);
|
|
425
|
-
cookieStore.delete(SESSION_CONSTANTS2.COOKIE_NAME);
|
|
426
|
-
cookieStore.delete("_session_token");
|
|
427
|
-
cookieStore.delete("_session");
|
|
428
|
-
if (SESSION_CONSTANTS2.REVOKE_REFRESH_TOKENS_ON_SIGNOUT && sessionCookie?.value) {
|
|
429
|
-
try {
|
|
430
|
-
const decodedClaims = await tenantAuth.verifySessionCookie(
|
|
431
|
-
sessionCookie.value
|
|
432
|
-
);
|
|
433
|
-
await tenantAuth.revokeRefreshTokens(decodedClaims.sub);
|
|
434
|
-
console.log(
|
|
435
|
-
`[clearSessionCookie] Successfully revoked tokens for user: ${decodedClaims.sub}`
|
|
436
|
-
);
|
|
437
|
-
} catch (revokeError) {
|
|
438
|
-
console.error(
|
|
439
|
-
"[ClearNextSessionCookie] Failed to revoke refresh tokens:",
|
|
440
|
-
revokeError
|
|
441
|
-
);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
return { success: true, message: "Session cleared successfully" };
|
|
445
|
-
} catch (error) {
|
|
446
|
-
console.error("Error clearing session:", error);
|
|
447
|
-
return { success: false, message: "Failed to clear session cookies" };
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// src/instance/backendInstance.ts
|
|
452
|
-
var createBackendInstance = async (request) => {
|
|
453
|
-
const ternSecureRequest = createTernSecureRequest(request);
|
|
454
|
-
const requestState = await authenticateRequest(request);
|
|
455
|
-
return {
|
|
456
|
-
ternSecureRequest,
|
|
457
|
-
requestState
|
|
458
|
-
};
|
|
459
|
-
};
|
|
460
|
-
async function authenticateRequest(request) {
|
|
461
|
-
const sessionCookie = request.headers.get("cookie");
|
|
462
|
-
const sessionToken = sessionCookie?.split(";").find((c) => c.trim().startsWith("_session_cookie="))?.split("=")[1];
|
|
463
|
-
if (!sessionToken) {
|
|
464
|
-
throw new Error("No session token found");
|
|
465
|
-
}
|
|
466
|
-
const verificationResult = await VerifyNextTernSessionCookie(sessionToken);
|
|
467
|
-
if (!verificationResult.valid) {
|
|
468
|
-
throw new Error("Invalid session token");
|
|
469
|
-
}
|
|
470
|
-
return signedIn(
|
|
471
|
-
verificationResult,
|
|
472
|
-
new Headers(request.headers),
|
|
473
|
-
sessionToken
|
|
474
|
-
);
|
|
475
|
-
}
|
|
476
|
-
function signInAuthObject(session) {
|
|
477
|
-
return {
|
|
478
|
-
session,
|
|
479
|
-
userId: session.uid,
|
|
480
|
-
has: {}
|
|
481
|
-
};
|
|
482
|
-
}
|
|
483
|
-
function signedIn(session, headers = new Headers(), token) {
|
|
484
|
-
const authObject = signInAuthObject(session);
|
|
485
|
-
return {
|
|
486
|
-
auth: () => authObject,
|
|
487
|
-
token,
|
|
488
|
-
headers
|
|
489
|
-
};
|
|
490
|
-
}
|
|
2
|
+
ClearNextSessionCookie,
|
|
3
|
+
CreateNextSessionCookie,
|
|
4
|
+
GetNextIdToken,
|
|
5
|
+
GetNextServerSessionCookie,
|
|
6
|
+
SetNextServerSession,
|
|
7
|
+
SetNextServerToken,
|
|
8
|
+
TernSecureTenantManager,
|
|
9
|
+
VerifyNextTernIdToken,
|
|
10
|
+
VerifyNextTernSessionCookie,
|
|
11
|
+
adminTernSecureAuth,
|
|
12
|
+
adminTernSecureDb,
|
|
13
|
+
authenticateRequest,
|
|
14
|
+
clearSessionCookie,
|
|
15
|
+
createBackendInstance,
|
|
16
|
+
createCustomTokenClaims,
|
|
17
|
+
createSessionCookie,
|
|
18
|
+
createTenant,
|
|
19
|
+
createTenantUser,
|
|
20
|
+
initializeAdminConfig,
|
|
21
|
+
signedIn
|
|
22
|
+
} from "../chunk-NEPV6OWI.mjs";
|
|
23
|
+
import "../chunk-4SGWLAJG.mjs";
|
|
491
24
|
export {
|
|
492
25
|
ClearNextSessionCookie,
|
|
493
26
|
CreateNextSessionCookie,
|
|
@@ -503,6 +36,7 @@ export {
|
|
|
503
36
|
authenticateRequest,
|
|
504
37
|
clearSessionCookie,
|
|
505
38
|
createBackendInstance,
|
|
39
|
+
createCustomTokenClaims,
|
|
506
40
|
createSessionCookie,
|
|
507
41
|
createTenant,
|
|
508
42
|
createTenantUser,
|
package/dist/admin/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\n\r\nimport { handleFirebaseAuthError } from \"@tern-secure/shared/errors\";\r\nimport type {\r\n CookieStore,\r\n SessionParams,\r\n SessionResult,\r\n} from \"@tern-secure/types\";\r\n\r\nimport { getCookieOptions, getSessionConfig } from \"../tokens/sessionConfig\";\r\nimport type { RequestOptions } from \"../tokens/types\";\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\n\r\nexport async function createSessionCookie(\r\n params: SessionParams | string,\r\n cookieStore: CookieStore,\r\n options?: RequestOptions\r\n): Promise<SessionResult> {\r\n try {\r\n const tenantAuth = getAuthForTenant(options?.tenantId);\r\n\r\n const sessionConfig = getSessionConfig(options);\r\n const cookieOptions = getCookieOptions(options);\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 const error = new Error(\"ID token is required for session creation\");\r\n console.error(\"[createSessionCookie] Missing ID token:\", error);\r\n return {\r\n success: false,\r\n message: \"ID token is required\",\r\n error: \"INVALID_TOKEN\",\r\n cookieSet: false,\r\n };\r\n }\r\n\r\n try {\r\n console.log(\"Verifying ID token for tenant:\", options?.tenantId);\r\n decodedToken = await tenantAuth.verifyIdToken(idToken);\r\n } catch (verifyError) {\r\n console.error(\r\n \"[createSessionCookie] ID token verification failed:\",\r\n verifyError\r\n );\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 cookieSet: false,\r\n };\r\n }\r\n\r\n if (!decodedToken) {\r\n const error = new Error(\"Invalid ID token - verification returned null\");\r\n console.error(\r\n \"[createSessionCookie] Token verification returned null:\",\r\n error\r\n );\r\n return {\r\n success: false,\r\n message: \"Invalid ID token\",\r\n error: \"INVALID_TOKEN\",\r\n cookieSet: false,\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(\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 cookieSet: false,\r\n };\r\n }\r\n\r\n // Set the cookie and verify it was set\r\n let cookieSetSuccessfully = false;\r\n try {\r\n //const cookieStore = await cookies();\r\n cookieStore.set(SESSION_CONSTANTS.COOKIE_NAME, sessionCookie, {\r\n maxAge: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,\r\n ...COOKIE_OPTIONS,\r\n });\r\n\r\n // Verify the cookie was actually set\r\n const verifySetCookie = await cookieStore.get(\r\n SESSION_CONSTANTS.COOKIE_NAME\r\n );\r\n cookieSetSuccessfully = !!verifySetCookie?.value;\r\n\r\n if (!cookieSetSuccessfully) {\r\n const error = new Error(\"Session cookie was not set successfully\");\r\n console.error(\r\n \"[createSessionCookie] Cookie verification failed:\",\r\n error\r\n );\r\n throw error;\r\n }\r\n } catch (cookieError) {\r\n console.error(\r\n \"[createSessionCookie] Failed to set session cookie:\",\r\n cookieError\r\n );\r\n return {\r\n success: false,\r\n message: \"Failed to set session cookie\",\r\n error: \"COOKIE_SET_FAILED\",\r\n cookieSet: false,\r\n };\r\n }\r\n\r\n console.log(\r\n `[createSessionCookie] Session cookie created successfully for user: ${decodedToken.uid}`\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 cookieSet: cookieSetSuccessfully,\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 cookieSet: false,\r\n };\r\n }\r\n}\r\n\r\nexport async function clearSessionCookie(\r\n cookieStore: CookieStore,\r\n options?: RequestOptions\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(\"_session_token\");\r\n await cookieStore.delete(\"_session\");\r\n\r\n if (\r\n SESSION_CONSTANTS.REVOKE_REFRESH_TOKENS_ON_SIGNOUT &&\r\n sessionCookie?.value\r\n ) {\r\n try {\r\n const decodedClaims = await adminAuth.verifySessionCookie(\r\n sessionCookie.value\r\n );\r\n await adminAuth.revokeRefreshTokens(decodedClaims.sub);\r\n console.log(\r\n `[clearSessionCookie] Successfully revoked tokens for user: ${decodedClaims.sub}`\r\n );\r\n } catch (revokeError) {\r\n console.error(\r\n \"[clearSessionCookie] Failed to revoke refresh tokens:\",\r\n revokeError\r\n );\r\n }\r\n }\r\n\r\n console.log(\"[clearSessionCookie] Session cookies cleared successfully\");\r\n return {\r\n success: true,\r\n message: \"Session cleared successfully\",\r\n cookieSet: false,\r\n };\r\n } catch (error) {\r\n console.error(\"[clearSessionCookie] Unexpected error:\", 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 cookieSet: false,\r\n };\r\n }\r\n}\r\n\r\nexport async function createCustomToken(uid: string, options?: RequestOptions): 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","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 { handleFirebaseAuthError } from \"@tern-secure/shared/errors\";\nimport type { TernVerificationResult } from \"@tern-secure/types\";\nimport { cookies } from \"next/headers\";\n\nimport { adminTernSecureAuth as adminAuth, getAuthForTenant } from \"../utils/admin-init\";\n\n\nconst SESSION_CONSTANTS = {\n COOKIE_NAME: \"_session_cookie\",\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(\"_session_cookie\", 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\n cookieStore.delete(SESSION_CONSTANTS.COOKIE_NAME);\n cookieStore.delete(\"_session_token\");\n cookieStore.delete(\"_session\");\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":["handleFirebaseAuthError","SESSION_CONSTANTS","handleFirebaseAuthError"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextSessionTernSecure.d.ts","sourceRoot":"","sources":["../../src/admin/nextSessionTernSecure.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"nextSessionTernSecure.d.ts","sourceRoot":"","sources":["../../src/admin/nextSessionTernSecure.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAcjE,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM;;;GAkB5D;AAED,wBAAsB,0BAA0B;;;GAqB/C;AAED,wBAAsB,cAAc;;;GAkBnC;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM;;;GAcvD;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;;GAcrD;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,sBAAsB,CAAC,CAejC;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,sBAAsB,CAAC,CAsBjC;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM;;;GAkC7D"}
|
|
@@ -1,6 +1,28 @@
|
|
|
1
|
-
import type { CookieStore, SessionParams, SessionResult } from
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
1
|
+
import type { CookieStore, SessionParams, SessionResult, TernSecureHandlerOptions } from '@tern-secure/types';
|
|
2
|
+
export declare function createSessionCookie_old(params: SessionParams | string, cookieStore: CookieStore, options?: TernSecureHandlerOptions): Promise<SessionResult>;
|
|
3
|
+
export declare function clearSessionCookie_old(cookieStore: CookieStore, options?: TernSecureHandlerOptions): Promise<SessionResult>;
|
|
4
|
+
export declare function createCustomToken_old(uid: string, options?: TernSecureHandlerOptions): Promise<string | null>;
|
|
5
|
+
/**
|
|
6
|
+
* Creates cookies for user session management
|
|
7
|
+
* @param params - Session parameters containing idToken and optional refreshToken
|
|
8
|
+
* @param cookieStore - Cookie store interface for managing cookies
|
|
9
|
+
* @param options - TernSecure handler options containing cookie configurations
|
|
10
|
+
*/
|
|
11
|
+
export declare function createSessionCookie(params: SessionParams | string, cookieStore: CookieStore, options?: TernSecureHandlerOptions): Promise<SessionResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Clears user session cookies
|
|
14
|
+
* @param cookieStore - Cookie store interface for managing cookies
|
|
15
|
+
* @param options - TernSecure handler options containing cookie configurations
|
|
16
|
+
*/
|
|
17
|
+
export declare function clearSessionCookie(cookieStore: CookieStore, options?: TernSecureHandlerOptions): Promise<SessionResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a custom token for a user
|
|
20
|
+
* @param uid - User ID to create the custom token for
|
|
21
|
+
* @param options - TernSecure handler options
|
|
22
|
+
* @returns Promise resolving to the custom token string or null if creation fails
|
|
23
|
+
*/
|
|
24
|
+
export declare function createCustomToken(uid: string, options?: TernSecureHandlerOptions): Promise<string | null>;
|
|
25
|
+
export declare function createCustomTokenClaims(uid: string, developerClaims?: {
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}): Promise<string>;
|
|
6
28
|
//# sourceMappingURL=sessionTernSecure.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionTernSecure.d.ts","sourceRoot":"","sources":["../../src/admin/sessionTernSecure.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessionTernSecure.d.ts","sourceRoot":"","sources":["../../src/admin/sessionTernSecure.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAqB5B,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,GAAG,MAAM,EAC9B,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CAkFxB;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CA+BxB;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAuDD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GAAG,MAAM,EAC9B,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CA0HxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,aAAa,CAAC,CAsDxB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAGD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,eAAe,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,MAAM,CAAC,CASjB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AuthenticateRequestOptions } from '../tokens/types';
|
|
2
|
+
export interface IdAndRefreshTokens {
|
|
3
|
+
idToken: string;
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CustomTokens {
|
|
7
|
+
idToken: string;
|
|
8
|
+
refreshToken: string;
|
|
9
|
+
customToken: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function getAuth(options: AuthenticateRequestOptions): {
|
|
12
|
+
customForIdAndRefreshToken: (customToken: string) => Promise<IdAndRefreshTokens>;
|
|
13
|
+
createCustomIdAndRefreshToken: (idToken: string) => Promise<CustomTokens>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=getauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getauth.d.ts","sourceRoot":"","sources":["../../src/auth/getauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAGlE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAgB,OAAO,CAAC,OAAO,EAAE,0BAA0B;8CAI1C,MAAM,KAClB,OAAO,CAAC,kBAAkB,CAAC;6CAiBwB,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC;EA0BrF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|