@tern-secure/nextjs 5.1.8 → 5.1.10
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/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js +31 -0
- package/dist/cjs/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
- package/dist/cjs/app-router/admin/actions.js +62 -0
- package/dist/cjs/app-router/admin/actions.js.map +1 -0
- package/dist/cjs/app-router/admin/constants.js +29 -0
- package/dist/cjs/app-router/admin/constants.js.map +1 -0
- package/dist/cjs/app-router/admin/fnValidators.js +295 -0
- package/dist/cjs/app-router/admin/fnValidators.js.map +1 -0
- package/dist/cjs/app-router/admin/index.js +16 -3
- package/dist/cjs/app-router/admin/index.js.map +1 -1
- package/dist/cjs/app-router/admin/responses.js +120 -0
- package/dist/cjs/app-router/admin/responses.js.map +1 -0
- package/dist/cjs/app-router/admin/sessionHandlers.js +167 -0
- package/dist/cjs/app-router/admin/sessionHandlers.js.map +1 -0
- package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js +84 -0
- package/dist/cjs/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
- package/dist/cjs/app-router/admin/types.js +127 -0
- package/dist/cjs/app-router/admin/types.js.map +1 -0
- package/dist/cjs/app-router/admin/utils.js +107 -0
- package/dist/cjs/app-router/admin/utils.js.map +1 -0
- package/dist/cjs/app-router/admin/validators.js +217 -0
- package/dist/cjs/app-router/admin/validators.js.map +1 -0
- package/dist/cjs/app-router/client/TernSecureProvider.js +2 -6
- package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/cjs/app-router/server/auth.js +100 -0
- package/dist/cjs/app-router/server/auth.js.map +1 -0
- package/dist/cjs/app-router/server/utils.js +87 -0
- package/dist/cjs/app-router/server/utils.js.map +1 -0
- package/dist/cjs/boundary/components.js +4 -7
- package/dist/cjs/boundary/components.js.map +1 -1
- package/dist/cjs/{components/uiComponents.js → constants.js} +17 -18
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +4 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/constant.js +38 -0
- package/dist/cjs/server/constant.js.map +1 -0
- package/dist/cjs/server/edge-session.js +118 -24
- package/dist/cjs/server/edge-session.js.map +1 -1
- package/dist/cjs/server/headers-utils.js +70 -0
- package/dist/cjs/server/headers-utils.js.map +1 -0
- package/dist/cjs/server/index.js +8 -6
- package/dist/cjs/server/index.js.map +1 -1
- package/dist/cjs/server/jwt-edge.js +47 -19
- package/dist/cjs/server/jwt-edge.js.map +1 -1
- package/dist/cjs/server/jwt.js +11 -4
- package/dist/cjs/server/jwt.js.map +1 -1
- package/dist/cjs/server/nextErrors.js +131 -0
- package/dist/cjs/server/nextErrors.js.map +1 -0
- package/dist/cjs/server/nextFetcher.js +31 -0
- package/dist/cjs/server/nextFetcher.js.map +1 -0
- package/dist/cjs/server/node/SessionTernSecure.js +55 -0
- package/dist/cjs/server/node/SessionTernSecure.js.map +1 -0
- package/dist/cjs/server/{auth.js → node/auth.js} +11 -20
- package/dist/cjs/server/node/auth.js.map +1 -0
- package/dist/cjs/server/node/index.js +40 -0
- package/dist/cjs/server/node/index.js.map +1 -0
- package/dist/cjs/server/node/node-session.js +60 -0
- package/dist/cjs/server/node/node-session.js.map +1 -0
- package/dist/cjs/server/node/ternSecureNodeMiddleware.js +182 -0
- package/dist/cjs/server/node/ternSecureNodeMiddleware.js.map +1 -0
- package/dist/cjs/server/protect.js +90 -0
- package/dist/cjs/server/protect.js.map +1 -0
- package/dist/cjs/server/redirect.js +84 -0
- package/dist/cjs/server/redirect.js.map +1 -0
- package/dist/cjs/server/routeMatcher.js +36 -0
- package/dist/cjs/server/routeMatcher.js.map +1 -0
- package/dist/cjs/server/sdk-versions.js +43 -0
- package/dist/cjs/server/sdk-versions.js.map +1 -0
- package/dist/cjs/server/session-store.js.map +1 -1
- package/dist/cjs/server/ternSecureEdgeMiddleware.js +298 -0
- package/dist/cjs/server/ternSecureEdgeMiddleware.js.map +1 -0
- package/dist/cjs/server/ternSecureFireMiddleware.js +192 -0
- package/dist/cjs/server/ternSecureFireMiddleware.js.map +1 -0
- package/dist/cjs/server/types.js.map +1 -1
- package/dist/cjs/server/utils.js +115 -2
- package/dist/cjs/server/utils.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/NextCookieAdapter.js +44 -0
- package/dist/cjs/utils/NextCookieAdapter.js.map +1 -0
- package/dist/cjs/utils/allNextProviderProps.js +10 -24
- package/dist/cjs/utils/allNextProviderProps.js.map +1 -1
- package/dist/cjs/utils/config.js +38 -2
- package/dist/cjs/utils/config.js.map +1 -1
- package/dist/cjs/utils/construct.js.map +1 -1
- package/dist/cjs/utils/fireconfig.js +38 -0
- package/dist/cjs/utils/fireconfig.js.map +1 -0
- package/dist/cjs/utils/logger.js +101 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/cjs/utils/redis.js +33 -0
- package/dist/cjs/utils/redis.js.map +1 -0
- package/dist/cjs/utils/response.js +38 -0
- package/dist/cjs/utils/response.js.map +1 -0
- package/dist/cjs/utils/serverRedirectAuth.js +39 -0
- package/dist/cjs/utils/serverRedirectAuth.js.map +1 -0
- package/dist/cjs/utils/ternsecure-sw.js +1 -1
- package/dist/cjs/utils/ternsecure-sw.js.map +1 -1
- package/dist/cjs/utils/withLogger.js +82 -0
- package/dist/cjs/utils/withLogger.js.map +1 -0
- package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js +30 -0
- package/dist/esm/__tests__/gemini_fnTernSecureNextHandler.bench.js.map +1 -0
- package/dist/esm/app-router/admin/actions.js +40 -0
- package/dist/esm/app-router/admin/actions.js.map +1 -0
- package/dist/esm/app-router/admin/constants.js +5 -0
- package/dist/esm/app-router/admin/constants.js.map +1 -0
- package/dist/esm/app-router/admin/fnValidators.js +270 -0
- package/dist/esm/app-router/admin/fnValidators.js.map +1 -0
- package/dist/esm/app-router/admin/index.js +16 -2
- package/dist/esm/app-router/admin/index.js.map +1 -1
- package/dist/esm/app-router/admin/responses.js +93 -0
- package/dist/esm/app-router/admin/responses.js.map +1 -0
- package/dist/esm/app-router/admin/sessionHandlers.js +131 -0
- package/dist/esm/app-router/admin/sessionHandlers.js.map +1 -0
- package/dist/esm/app-router/admin/ternsecureNextjsHandler.js +62 -0
- package/dist/esm/app-router/admin/ternsecureNextjsHandler.js.map +1 -0
- package/dist/esm/app-router/admin/types.js +98 -0
- package/dist/esm/app-router/admin/types.js.map +1 -0
- package/dist/esm/app-router/admin/utils.js +80 -0
- package/dist/esm/app-router/admin/utils.js.map +1 -0
- package/dist/esm/app-router/admin/validators.js +189 -0
- package/dist/esm/app-router/admin/validators.js.map +1 -0
- package/dist/esm/app-router/client/TernSecureProvider.js +2 -6
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/server/auth.js +81 -0
- package/dist/esm/app-router/server/auth.js.map +1 -0
- package/dist/esm/app-router/server/utils.js +51 -0
- package/dist/esm/app-router/server/utils.js.map +1 -0
- package/dist/esm/boundary/components.js +4 -7
- package/dist/esm/boundary/components.js.map +1 -1
- package/dist/esm/constants.js +17 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +5 -11
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/constant.js +11 -0
- package/dist/esm/server/constant.js.map +1 -0
- package/dist/esm/server/edge-session.js +113 -22
- package/dist/esm/server/edge-session.js.map +1 -1
- package/dist/esm/server/headers-utils.js +41 -0
- package/dist/esm/server/headers-utils.js.map +1 -0
- package/dist/esm/server/index.js +9 -3
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/server/jwt-edge.js +48 -20
- package/dist/esm/server/jwt-edge.js.map +1 -1
- package/dist/esm/server/jwt.js +12 -5
- package/dist/esm/server/jwt.js.map +1 -1
- package/dist/esm/server/nextErrors.js +97 -0
- package/dist/esm/server/nextErrors.js.map +1 -0
- package/dist/esm/server/nextFetcher.js +7 -0
- package/dist/esm/server/nextFetcher.js.map +1 -0
- package/dist/esm/server/node/SessionTernSecure.js +31 -0
- package/dist/esm/server/node/SessionTernSecure.js.map +1 -0
- package/dist/esm/server/{auth.js → node/auth.js} +11 -20
- package/dist/esm/server/node/auth.js.map +1 -0
- package/dist/esm/server/node/index.js +19 -0
- package/dist/esm/server/node/index.js.map +1 -0
- package/dist/esm/server/node/node-session.js +36 -0
- package/dist/esm/server/node/node-session.js.map +1 -0
- package/dist/esm/server/node/ternSecureNodeMiddleware.js +165 -0
- package/dist/esm/server/node/ternSecureNodeMiddleware.js.map +1 -0
- package/dist/esm/server/protect.js +66 -0
- package/dist/esm/server/protect.js.map +1 -0
- package/dist/esm/server/redirect.js +60 -0
- package/dist/esm/server/redirect.js.map +1 -0
- package/dist/esm/server/routeMatcher.js +12 -0
- package/dist/esm/server/routeMatcher.js.map +1 -0
- package/dist/esm/server/sdk-versions.js +8 -0
- package/dist/esm/server/sdk-versions.js.map +1 -0
- package/dist/esm/server/session-store.js.map +1 -1
- package/dist/esm/server/ternSecureEdgeMiddleware.js +286 -0
- package/dist/esm/server/ternSecureEdgeMiddleware.js.map +1 -0
- package/dist/esm/server/ternSecureFireMiddleware.js +179 -0
- package/dist/esm/server/ternSecureFireMiddleware.js.map +1 -0
- package/dist/esm/server/utils.js +99 -1
- package/dist/esm/server/utils.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/NextCookieAdapter.js +20 -0
- package/dist/esm/utils/NextCookieAdapter.js.map +1 -0
- package/dist/esm/utils/allNextProviderProps.js +10 -24
- package/dist/esm/utils/allNextProviderProps.js.map +1 -1
- package/dist/esm/utils/config.js +34 -1
- package/dist/esm/utils/config.js.map +1 -1
- package/dist/esm/utils/construct.js +1 -1
- package/dist/esm/utils/construct.js.map +1 -1
- package/dist/esm/utils/fireconfig.js +14 -0
- package/dist/esm/utils/fireconfig.js.map +1 -0
- package/dist/esm/utils/logger.js +74 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/redis.js +9 -0
- package/dist/esm/utils/redis.js.map +1 -0
- package/dist/esm/utils/response.js +13 -0
- package/dist/esm/utils/response.js.map +1 -0
- package/dist/esm/utils/serverRedirectAuth.js +17 -0
- package/dist/esm/utils/serverRedirectAuth.js.map +1 -0
- package/dist/esm/utils/ternsecure-sw.js +1 -1
- package/dist/esm/utils/ternsecure-sw.js.map +1 -1
- package/dist/esm/utils/withLogger.js +57 -0
- package/dist/esm/utils/withLogger.js.map +1 -0
- package/package.json +21 -7
- package/server/node/package.json +5 -0
- package/server/package.json +5 -0
- package/dist/cjs/app-router/admin/sessionHandler.js +0 -74
- package/dist/cjs/app-router/admin/sessionHandler.js.map +0 -1
- package/dist/cjs/app-router/client/actions.js +0 -4
- package/dist/cjs/app-router/client/actions.js.map +0 -1
- package/dist/cjs/components/uiComponents.js.map +0 -1
- package/dist/cjs/server/auth.js.map +0 -1
- package/dist/cjs/server/ternSecureMiddleware.js +0 -95
- package/dist/cjs/server/ternSecureMiddleware.js.map +0 -1
- package/dist/cjs/utils/tern-ui-script.js +0 -78
- package/dist/cjs/utils/tern-ui-script.js.map +0 -1
- package/dist/esm/app-router/admin/sessionHandler.js +0 -50
- package/dist/esm/app-router/admin/sessionHandler.js.map +0 -1
- package/dist/esm/app-router/client/actions.js +0 -3
- package/dist/esm/app-router/client/actions.js.map +0 -1
- package/dist/esm/components/uiComponents.js +0 -21
- package/dist/esm/components/uiComponents.js.map +0 -1
- package/dist/esm/server/auth.js.map +0 -1
- package/dist/esm/server/ternSecureMiddleware.js +0 -69
- package/dist/esm/server/ternSecureMiddleware.js.map +0 -1
- package/dist/esm/utils/tern-ui-script.js +0 -44
- package/dist/esm/utils/tern-ui-script.js.map +0 -1
- package/dist/types/app-router/admin/index.d.ts +0 -2
- package/dist/types/app-router/admin/index.d.ts.map +0 -1
- package/dist/types/app-router/admin/sessionHandler.d.ts +0 -3
- package/dist/types/app-router/admin/sessionHandler.d.ts.map +0 -1
- package/dist/types/app-router/client/TernSecureProvider.d.ts +0 -25
- package/dist/types/app-router/client/TernSecureProvider.d.ts.map +0 -1
- package/dist/types/app-router/client/actions.d.ts +0 -2
- package/dist/types/app-router/client/actions.d.ts.map +0 -1
- package/dist/types/app-router/route-handler/internal-route.d.ts +0 -2
- package/dist/types/app-router/route-handler/internal-route.d.ts.map +0 -1
- package/dist/types/boundary/components.d.ts +0 -2
- package/dist/types/boundary/components.d.ts.map +0 -1
- package/dist/types/boundary/hooks.d.ts +0 -2
- package/dist/types/boundary/hooks.d.ts.map +0 -1
- package/dist/types/components/uiComponents.d.ts +0 -6
- package/dist/types/components/uiComponents.d.ts.map +0 -1
- package/dist/types/errors.d.ts +0 -44
- package/dist/types/errors.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/server/auth.d.ts +0 -23
- package/dist/types/server/auth.d.ts.map +0 -1
- package/dist/types/server/crypto.d.ts +0 -3
- package/dist/types/server/crypto.d.ts.map +0 -1
- package/dist/types/server/ctx-store.d.ts +0 -24
- package/dist/types/server/ctx-store.d.ts.map +0 -1
- package/dist/types/server/edge-session.d.ts +0 -4
- package/dist/types/server/edge-session.d.ts.map +0 -1
- package/dist/types/server/index.d.ts +0 -4
- package/dist/types/server/index.d.ts.map +0 -1
- package/dist/types/server/jwt-edge.d.ts +0 -20
- package/dist/types/server/jwt-edge.d.ts.map +0 -1
- package/dist/types/server/jwt.d.ts +0 -20
- package/dist/types/server/jwt.d.ts.map +0 -1
- package/dist/types/server/session-store.d.ts +0 -30
- package/dist/types/server/session-store.d.ts.map +0 -1
- package/dist/types/server/ternSecureMiddleware.d.ts +0 -20
- package/dist/types/server/ternSecureMiddleware.d.ts.map +0 -1
- package/dist/types/server/types.d.ts +0 -26
- package/dist/types/server/types.d.ts.map +0 -1
- package/dist/types/server/utils.d.ts +0 -22
- package/dist/types/server/utils.d.ts.map +0 -1
- package/dist/types/types.d.ts +0 -112
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/utils/admin-init.d.ts +0 -2
- package/dist/types/utils/admin-init.d.ts.map +0 -1
- package/dist/types/utils/allNextProviderProps.d.ts +0 -6
- package/dist/types/utils/allNextProviderProps.d.ts.map +0 -1
- package/dist/types/utils/client-init.d.ts +0 -2
- package/dist/types/utils/client-init.d.ts.map +0 -1
- package/dist/types/utils/config.d.ts +0 -35
- package/dist/types/utils/config.d.ts.map +0 -1
- package/dist/types/utils/construct.d.ts +0 -38
- package/dist/types/utils/construct.d.ts.map +0 -1
- package/dist/types/utils/create-styles.d.ts +0 -99
- package/dist/types/utils/create-styles.d.ts.map +0 -1
- package/dist/types/utils/redirect.d.ts +0 -9
- package/dist/types/utils/redirect.d.ts.map +0 -1
- package/dist/types/utils/tern-ui-script.d.ts +0 -9
- package/dist/types/utils/tern-ui-script.d.ts.map +0 -1
- package/dist/types/utils/ternsecure-sw.d.ts +0 -8
- package/dist/types/utils/ternsecure-sw.d.ts.map +0 -1
package/dist/cjs/server/jwt.js
CHANGED
|
@@ -66,10 +66,6 @@ async function verifyFirebaseToken(token, isSessionCookie = false) {
|
|
|
66
66
|
if (!decoded) {
|
|
67
67
|
throw new Error("Invalid token format");
|
|
68
68
|
}
|
|
69
|
-
console.log("Token details:", {
|
|
70
|
-
header: decoded.header,
|
|
71
|
-
type: isSessionCookie ? "session_cookie" : "id_token"
|
|
72
|
-
});
|
|
73
69
|
let retries = 3;
|
|
74
70
|
let lastError = null;
|
|
75
71
|
while (retries > 0) {
|
|
@@ -81,14 +77,25 @@ async function verifyFirebaseToken(token, isSessionCookie = false) {
|
|
|
81
77
|
algorithms: ["RS256"]
|
|
82
78
|
});
|
|
83
79
|
const firebasePayload = payload;
|
|
80
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
81
|
+
if (firebasePayload.exp <= now) {
|
|
82
|
+
throw new Error("Token has expired");
|
|
83
|
+
}
|
|
84
|
+
if (firebasePayload.iat > now) {
|
|
85
|
+
throw new Error("Token issued time is in the future");
|
|
86
|
+
}
|
|
84
87
|
if (!firebasePayload.sub) {
|
|
85
88
|
throw new Error("Token subject is empty");
|
|
86
89
|
}
|
|
90
|
+
if (firebasePayload.auth_time > now) {
|
|
91
|
+
throw new Error("Token auth time is in the future");
|
|
92
|
+
}
|
|
87
93
|
return {
|
|
88
94
|
valid: true,
|
|
89
95
|
uid: firebasePayload.sub,
|
|
90
96
|
email: firebasePayload.email,
|
|
91
97
|
emailVerified: firebasePayload.email_verified,
|
|
98
|
+
tenant: firebasePayload.firebase.tenant,
|
|
92
99
|
authTime: firebasePayload.auth_time,
|
|
93
100
|
issuedAt: firebasePayload.iat,
|
|
94
101
|
expiresAt: firebasePayload.exp
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/jwt.ts"],"sourcesContent":["import { jwtVerify
|
|
1
|
+
{"version":3,"sources":["../../../src/server/jwt.ts"],"sourcesContent":["import { createRemoteJWKSet,jwtVerify } from \"jose\";\r\nimport { cache } from \"react\";\r\n\r\ninterface FirebaseIdTokenPayload {\r\n iss: string;\r\n aud: string;\r\n auth_time: number;\r\n user_id: string;\r\n sub: string;\r\n iat: number;\r\n exp: number;\r\n email?: string;\r\n email_verified?: boolean;\r\n firebase: {\r\n identities: {\r\n [key: string]: any;\r\n };\r\n sign_in_provider: string;\r\n tenant?: string;\r\n };\r\n}\r\n\r\ninterface FirebaseTokenResult {\r\n valid: boolean;\r\n tenant?: string;\r\n uid?: string;\r\n email?: string | null;\r\n emailVerified?: boolean;\r\n authTime?: number;\r\n issuedAt?: number;\r\n expiresAt?: number;\r\n error?: string;\r\n}\r\n\r\n// Firebase public key endpoints\r\nconst FIREBASE_ID_TOKEN_URL =\r\n \"https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com\";\r\nconst FIREBASE_SESSION_CERT_URL =\r\n \"https://identitytoolkit.googleapis.com/v1/sessionCookiePublicKeys\";\r\n\r\n// Cache the JWKS using React cache\r\nconst getIdTokenJWKS = cache(() => {\r\n return createRemoteJWKSet(new URL(FIREBASE_ID_TOKEN_URL), {\r\n cacheMaxAge: 3600000, // 1 hour\r\n timeoutDuration: 5000, // 5 seconds\r\n cooldownDuration: 30000, // 30 seconds between retries\r\n });\r\n});\r\n\r\nconst getSessionJWKS = cache(() => {\r\n return createRemoteJWKSet(new URL(FIREBASE_SESSION_CERT_URL), {\r\n cacheMaxAge: 3600000, // 1 hour\r\n timeoutDuration: 5000, // 5 seconds\r\n cooldownDuration: 30000, // 30 seconds between retries\r\n });\r\n});\r\n\r\n// Helper to decode JWT without verification\r\nfunction decodeJwt(token: string) {\r\n try {\r\n const [headerB64, payloadB64] = token.split(\".\");\r\n const header = JSON.parse(Buffer.from(headerB64, \"base64\").toString());\r\n const payload = JSON.parse(Buffer.from(payloadB64, \"base64\").toString());\r\n return { header, payload };\r\n } catch (error) {\r\n console.error(\"Error decoding JWT:\", error);\r\n return null;\r\n }\r\n}\r\n\r\nexport async function verifyFirebaseToken(\r\n token: string,\r\n isSessionCookie = false\r\n): Promise<FirebaseTokenResult> {\r\n try {\r\n const projectId = process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID;\r\n if (!projectId) {\r\n throw new Error(\"Firebase Project ID is not configured\");\r\n }\r\n\r\n const decoded = decodeJwt(token);\r\n if (!decoded) {\r\n throw new Error(\"Invalid token format\");\r\n }\r\n\r\n let retries = 3;\r\n let lastError: Error | null = null;\r\n\r\n while (retries > 0) {\r\n try {\r\n // Use different JWKS based on token type\r\n const JWKS = isSessionCookie\r\n ? await getSessionJWKS()\r\n : await getIdTokenJWKS();\r\n\r\n const { payload } = await jwtVerify(token, JWKS, {\r\n issuer: isSessionCookie\r\n ? \"https://session.firebase.google.com/\" + projectId\r\n : \"https://securetoken.google.com/\" + projectId,\r\n audience: projectId,\r\n algorithms: [\"RS256\"],\r\n });\r\n\r\n const firebasePayload = payload as unknown as FirebaseIdTokenPayload;\r\n const now = Math.floor(Date.now() / 1000);\r\n\r\n // Verify token claims\r\n if (firebasePayload.exp <= now) {\r\n throw new Error(\"Token has expired\");\r\n }\r\n\r\n if (firebasePayload.iat > now) {\r\n throw new Error(\"Token issued time is in the future\");\r\n }\r\n\r\n if (!firebasePayload.sub) {\r\n throw new Error(\"Token subject is empty\");\r\n }\r\n\r\n if (firebasePayload.auth_time > now) {\r\n throw new Error(\"Token auth time is in the future\");\r\n }\r\n\r\n return {\r\n valid: true,\r\n uid: firebasePayload.sub,\r\n email: firebasePayload.email,\r\n emailVerified: firebasePayload.email_verified,\r\n tenant: firebasePayload.firebase.tenant,\r\n authTime: firebasePayload.auth_time,\r\n issuedAt: firebasePayload.iat,\r\n expiresAt: firebasePayload.exp,\r\n };\r\n } catch (error) {\r\n lastError = error as Error;\r\n if (error instanceof Error && error.name === \"JWKSNoMatchingKey\") {\r\n console.warn(`JWKS retry attempt ${4 - retries}:`, error.message);\r\n retries--;\r\n if (retries > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, 1000));\r\n continue;\r\n }\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n throw lastError || new Error(\"Failed to verify token after retries\");\r\n } catch (error) {\r\n console.error(\"Token verification details:\", {\r\n error:\r\n error instanceof Error\r\n ? {\r\n name: error.name,\r\n message: error.message,\r\n stack: error.stack,\r\n }\r\n : error,\r\n decoded: decodeJwt(token),\r\n //projectId,\r\n isSessionCookie,\r\n });\r\n\r\n return {\r\n valid: false,\r\n error: error instanceof Error ? error.message : \"Invalid token\",\r\n };\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6C;AAC7C,mBAAsB;AAkCtB,MAAM,wBACJ;AACF,MAAM,4BACJ;AAGF,MAAM,qBAAiB,oBAAM,MAAM;AACjC,aAAO,gCAAmB,IAAI,IAAI,qBAAqB,GAAG;AAAA,IACxD,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA;AAAA,IACjB,kBAAkB;AAAA;AAAA,EACpB,CAAC;AACH,CAAC;AAED,MAAM,qBAAiB,oBAAM,MAAM;AACjC,aAAO,gCAAmB,IAAI,IAAI,yBAAyB,GAAG;AAAA,IAC5D,aAAa;AAAA;AAAA,IACb,iBAAiB;AAAA;AAAA,IACjB,kBAAkB;AAAA;AAAA,EACpB,CAAC;AACH,CAAC;AAGD,SAAS,UAAU,OAAe;AAChC,MAAI;AACF,UAAM,CAAC,WAAW,UAAU,IAAI,MAAM,MAAM,GAAG;AAC/C,UAAM,SAAS,KAAK,MAAM,OAAO,KAAK,WAAW,QAAQ,EAAE,SAAS,CAAC;AACrE,UAAM,UAAU,KAAK,MAAM,OAAO,KAAK,YAAY,QAAQ,EAAE,SAAS,CAAC;AACvE,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,KAAK;AAC1C,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,oBACpB,OACA,kBAAkB,OACY;AAC9B,MAAI;AACF,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,QAAI,UAAU;AACd,QAAI,YAA0B;AAE9B,WAAO,UAAU,GAAG;AAClB,UAAI;AAEF,cAAM,OAAO,kBACT,MAAM,eAAe,IACrB,MAAM,eAAe;AAEzB,cAAM,EAAE,QAAQ,IAAI,UAAM,uBAAU,OAAO,MAAM;AAAA,UAC/C,QAAQ,kBACJ,yCAAyC,YACzC,oCAAoC;AAAA,UACxC,UAAU;AAAA,UACV,YAAY,CAAC,OAAO;AAAA,QACtB,CAAC;AAED,cAAM,kBAAkB;AACxB,cAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAGxC,YAAI,gBAAgB,OAAO,KAAK;AAC9B,gBAAM,IAAI,MAAM,mBAAmB;AAAA,QACrC;AAEA,YAAI,gBAAgB,MAAM,KAAK;AAC7B,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AAEA,YAAI,CAAC,gBAAgB,KAAK;AACxB,gBAAM,IAAI,MAAM,wBAAwB;AAAA,QAC1C;AAEA,YAAI,gBAAgB,YAAY,KAAK;AACnC,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QACpD;AAEA,eAAO;AAAA,UACL,OAAO;AAAA,UACP,KAAK,gBAAgB;AAAA,UACrB,OAAO,gBAAgB;AAAA,UACvB,eAAe,gBAAgB;AAAA,UAC/B,QAAQ,gBAAgB,SAAS;AAAA,UACjC,UAAU,gBAAgB;AAAA,UAC1B,UAAU,gBAAgB;AAAA,UAC1B,WAAW,gBAAgB;AAAA,QAC7B;AAAA,MACF,SAAS,OAAO;AACd,oBAAY;AACZ,YAAI,iBAAiB,SAAS,MAAM,SAAS,qBAAqB;AAChE,kBAAQ,KAAK,sBAAsB,IAAI,OAAO,KAAK,MAAM,OAAO;AAChE;AACA,cAAI,UAAU,GAAG;AACf,kBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AACxD;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,MAAM,sCAAsC;AAAA,EACrE,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B;AAAA,MAC3C,OACE,iBAAiB,QACb;AAAA,QACE,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA,MACf,IACA;AAAA,MACN,SAAS,UAAU,KAAK;AAAA;AAAA,MAExB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var nextErrors_exports = {};
|
|
20
|
+
__export(nextErrors_exports, {
|
|
21
|
+
HTTP_ERROR_FALLBACK_ERROR_CODE: () => HTTP_ERROR_FALLBACK_ERROR_CODE,
|
|
22
|
+
isHTTPAccessFallbackError: () => isHTTPAccessFallbackError,
|
|
23
|
+
isLegacyNextjsNotFoundError: () => isLegacyNextjsNotFoundError,
|
|
24
|
+
isNextjsNotFoundError: () => isNextjsNotFoundError,
|
|
25
|
+
isNextjsRedirectError: () => isNextjsRedirectError,
|
|
26
|
+
isRedirectToSignInError: () => isRedirectToSignInError,
|
|
27
|
+
isRedirectToSignUpError: () => isRedirectToSignUpError,
|
|
28
|
+
nextjsRedirectError: () => nextjsRedirectError,
|
|
29
|
+
redirectToSignInError: () => redirectToSignInError,
|
|
30
|
+
redirectToSignUpError: () => redirectToSignUpError,
|
|
31
|
+
whichHTTPAccessFallbackError: () => whichHTTPAccessFallbackError
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(nextErrors_exports);
|
|
34
|
+
const CONTROL_FLOW_ERROR = {
|
|
35
|
+
REDIRECT_TO_URL: "TERNSECURE_PROTECT_REDIRECT_TO_URL",
|
|
36
|
+
REDIRECT_TO_SIGN_IN: "TERNSECURE_PROTECT_REDIRECT_TO_SIGN_IN",
|
|
37
|
+
REDIRECT_TO_SIGN_UP: "TERNSECURE_PROTECT_REDIRECT_TO_SIGN_UP"
|
|
38
|
+
};
|
|
39
|
+
const LEGACY_NOT_FOUND_ERROR_CODE = "NEXT_NOT_FOUND";
|
|
40
|
+
function isLegacyNextjsNotFoundError(error) {
|
|
41
|
+
if (typeof error !== "object" || error === null || !("digest" in error)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return error.digest === LEGACY_NOT_FOUND_ERROR_CODE;
|
|
45
|
+
}
|
|
46
|
+
const HTTPAccessErrorStatusCodes = {
|
|
47
|
+
NOT_FOUND: 404,
|
|
48
|
+
FORBIDDEN: 403,
|
|
49
|
+
UNAUTHORIZED: 401
|
|
50
|
+
};
|
|
51
|
+
const ALLOWED_CODES = new Set(Object.values(HTTPAccessErrorStatusCodes));
|
|
52
|
+
const HTTP_ERROR_FALLBACK_ERROR_CODE = "NEXT_HTTP_ERROR_FALLBACK";
|
|
53
|
+
function isHTTPAccessFallbackError(error) {
|
|
54
|
+
if (typeof error !== "object" || error === null || !("digest" in error) || typeof error.digest !== "string") {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const [prefix, httpStatus] = error.digest.split(";");
|
|
58
|
+
return prefix === HTTP_ERROR_FALLBACK_ERROR_CODE && ALLOWED_CODES.has(Number(httpStatus));
|
|
59
|
+
}
|
|
60
|
+
function whichHTTPAccessFallbackError(error) {
|
|
61
|
+
if (!isHTTPAccessFallbackError(error)) {
|
|
62
|
+
return void 0;
|
|
63
|
+
}
|
|
64
|
+
const [, httpStatus] = error.digest.split(";");
|
|
65
|
+
return Number(httpStatus);
|
|
66
|
+
}
|
|
67
|
+
function isNextjsNotFoundError(error) {
|
|
68
|
+
return isLegacyNextjsNotFoundError(error) || // Checks for the error thrown from `notFound()` for canary versions of next@15
|
|
69
|
+
whichHTTPAccessFallbackError(error) === HTTPAccessErrorStatusCodes.NOT_FOUND;
|
|
70
|
+
}
|
|
71
|
+
const REDIRECT_ERROR_CODE = "NEXT_REDIRECT";
|
|
72
|
+
function nextjsRedirectError(url, extra, type = "replace", statusCode = 307) {
|
|
73
|
+
const error = new Error(REDIRECT_ERROR_CODE);
|
|
74
|
+
error.digest = `${REDIRECT_ERROR_CODE};${type};${url};${statusCode};`;
|
|
75
|
+
error.tern_digest = CONTROL_FLOW_ERROR.REDIRECT_TO_URL;
|
|
76
|
+
Object.assign(error, extra);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
function buildReturnBackUrl(url, returnBackUrl) {
|
|
80
|
+
return returnBackUrl === null ? "" : returnBackUrl || url;
|
|
81
|
+
}
|
|
82
|
+
function redirectToSignInError(url, returnBackUrl) {
|
|
83
|
+
nextjsRedirectError(url, {
|
|
84
|
+
tern_digest: CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN,
|
|
85
|
+
returnBackUrl: buildReturnBackUrl(url, returnBackUrl)
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function redirectToSignUpError(url, returnBackUrl) {
|
|
89
|
+
nextjsRedirectError(url, {
|
|
90
|
+
tern_digest: CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_UP,
|
|
91
|
+
returnBackUrl: buildReturnBackUrl(url, returnBackUrl)
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function isNextjsRedirectError(error) {
|
|
95
|
+
if (typeof error !== "object" || error === null || !("digest" in error) || typeof error.digest !== "string") {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const digest = error.digest.split(";");
|
|
99
|
+
const [errorCode, type] = digest;
|
|
100
|
+
const destination = digest.slice(2, -2).join(";");
|
|
101
|
+
const status = digest.at(-2);
|
|
102
|
+
const statusCode = Number(status);
|
|
103
|
+
return errorCode === REDIRECT_ERROR_CODE && (type === "replace" || type === "push") && typeof destination === "string" && !isNaN(statusCode) && statusCode === 307;
|
|
104
|
+
}
|
|
105
|
+
function isRedirectToSignInError(error) {
|
|
106
|
+
if (isNextjsRedirectError(error) && "tern_digest" in error) {
|
|
107
|
+
return error.tern_digest === CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
function isRedirectToSignUpError(error) {
|
|
112
|
+
if (isNextjsRedirectError(error) && "tern_digest" in error) {
|
|
113
|
+
return error.tern_digest === CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_UP;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
118
|
+
0 && (module.exports = {
|
|
119
|
+
HTTP_ERROR_FALLBACK_ERROR_CODE,
|
|
120
|
+
isHTTPAccessFallbackError,
|
|
121
|
+
isLegacyNextjsNotFoundError,
|
|
122
|
+
isNextjsNotFoundError,
|
|
123
|
+
isNextjsRedirectError,
|
|
124
|
+
isRedirectToSignInError,
|
|
125
|
+
isRedirectToSignUpError,
|
|
126
|
+
nextjsRedirectError,
|
|
127
|
+
redirectToSignInError,
|
|
128
|
+
redirectToSignUpError,
|
|
129
|
+
whichHTTPAccessFallbackError
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=nextErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/nextErrors.ts"],"sourcesContent":["\nconst CONTROL_FLOW_ERROR = {\n REDIRECT_TO_URL: 'TERNSECURE_PROTECT_REDIRECT_TO_URL',\n REDIRECT_TO_SIGN_IN: 'TERNSECURE_PROTECT_REDIRECT_TO_SIGN_IN',\n REDIRECT_TO_SIGN_UP: 'TERNSECURE_PROTECT_REDIRECT_TO_SIGN_UP',\n};\n\n/**\n * In-house implementation of `notFound()`\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/components/not-found.ts\n */\nconst LEGACY_NOT_FOUND_ERROR_CODE = 'NEXT_NOT_FOUND';\n\ntype LegacyNotFoundError = Error & {\n digest: typeof LEGACY_NOT_FOUND_ERROR_CODE;\n};\n\n/**\n * Checks for the error thrown from `notFound()` for versions <= next@15.0.4\n */\nfunction isLegacyNextjsNotFoundError(error: unknown): error is LegacyNotFoundError {\n if (typeof error !== 'object' || error === null || !('digest' in error)) {\n return false;\n }\n\n return error.digest === LEGACY_NOT_FOUND_ERROR_CODE;\n}\n\nconst HTTPAccessErrorStatusCodes = {\n NOT_FOUND: 404,\n FORBIDDEN: 403,\n UNAUTHORIZED: 401,\n};\n\nconst ALLOWED_CODES = new Set(Object.values(HTTPAccessErrorStatusCodes));\n\nexport const HTTP_ERROR_FALLBACK_ERROR_CODE = 'NEXT_HTTP_ERROR_FALLBACK';\n\nexport type HTTPAccessFallbackError = Error & {\n digest: `${typeof HTTP_ERROR_FALLBACK_ERROR_CODE};${string}`;\n};\n\nexport function isHTTPAccessFallbackError(error: unknown): error is HTTPAccessFallbackError {\n if (typeof error !== 'object' || error === null || !('digest' in error) || typeof error.digest !== 'string') {\n return false;\n }\n const [prefix, httpStatus] = error.digest.split(';');\n\n return prefix === HTTP_ERROR_FALLBACK_ERROR_CODE && ALLOWED_CODES.has(Number(httpStatus));\n}\n\nexport function whichHTTPAccessFallbackError(error: unknown): number | undefined {\n if (!isHTTPAccessFallbackError(error)) {\n return undefined;\n }\n\n const [, httpStatus] = error.digest.split(';');\n return Number(httpStatus);\n}\n\nfunction isNextjsNotFoundError(error: unknown): error is LegacyNotFoundError | HTTPAccessFallbackError {\n return (\n isLegacyNextjsNotFoundError(error) ||\n // Checks for the error thrown from `notFound()` for canary versions of next@15\n whichHTTPAccessFallbackError(error) === HTTPAccessErrorStatusCodes.NOT_FOUND\n );\n}\n\n/**\n * In-house implementation of `redirect()` extended with a `tern_digest` property\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/components/redirect.ts\n */\n\nconst REDIRECT_ERROR_CODE = 'NEXT_REDIRECT';\n\ntype RedirectError<T = unknown> = Error & {\n digest: `${typeof REDIRECT_ERROR_CODE};${'replace'};${string};${307};`;\n tern_digest: typeof CONTROL_FLOW_ERROR.REDIRECT_TO_URL | typeof CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN;\n} & T;\n\nfunction nextjsRedirectError(\n url: string,\n extra: Record<string, unknown>,\n type: 'replace' = 'replace',\n statusCode: 307 = 307,\n): never {\n const error = new Error(REDIRECT_ERROR_CODE) as RedirectError;\n error.digest = `${REDIRECT_ERROR_CODE};${type};${url};${statusCode};`;\n error.tern_digest = CONTROL_FLOW_ERROR.REDIRECT_TO_URL;\n Object.assign(error, extra);\n throw error;\n}\n\nfunction buildReturnBackUrl(url: string, returnBackUrl?: string | URL | null): string | URL {\n return returnBackUrl === null ? '' : returnBackUrl || url;\n}\n\nfunction redirectToSignInError(url: string, returnBackUrl?: string | URL | null): never {\n nextjsRedirectError(url, {\n tern_digest: CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN,\n returnBackUrl: buildReturnBackUrl(url, returnBackUrl),\n });\n}\n\nfunction redirectToSignUpError(url: string, returnBackUrl?: string | URL | null): never {\n nextjsRedirectError(url, {\n tern_digest: CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_UP,\n returnBackUrl: buildReturnBackUrl(url, returnBackUrl),\n });\n}\n\n/**\n * Checks an error to determine if it's an error generated by the\n * `redirect(url)` helper.\n *\n * @param error the error that may reference a redirect error\n * @returns true if the error is a redirect error\n */\nfunction isNextjsRedirectError(error: unknown): error is RedirectError<{ redirectUrl: string | URL }> {\n if (typeof error !== 'object' || error === null || !('digest' in error) || typeof error.digest !== 'string') {\n return false;\n }\n\n const digest = error.digest.split(';');\n const [errorCode, type] = digest;\n const destination = digest.slice(2, -2).join(';');\n const status = digest.at(-2);\n\n const statusCode = Number(status);\n\n return (\n errorCode === REDIRECT_ERROR_CODE &&\n (type === 'replace' || type === 'push') &&\n typeof destination === 'string' &&\n !isNaN(statusCode) &&\n statusCode === 307\n );\n}\n\nfunction isRedirectToSignInError(error: unknown): error is RedirectError<{ returnBackUrl: string | URL }> {\n if (isNextjsRedirectError(error) && 'tern_digest' in error) {\n return error.tern_digest === CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_IN;\n }\n\n return false;\n}\n\nfunction isRedirectToSignUpError(error: unknown): error is RedirectError<{ returnBackUrl: string | URL }> {\n if (isNextjsRedirectError(error) && 'tern_digest' in error) {\n return error.tern_digest === CONTROL_FLOW_ERROR.REDIRECT_TO_SIGN_UP;\n }\n\n return false;\n}\n\nexport {\n isNextjsNotFoundError,\n isLegacyNextjsNotFoundError,\n redirectToSignInError,\n redirectToSignUpError,\n nextjsRedirectError,\n isNextjsRedirectError,\n isRedirectToSignInError,\n isRedirectToSignUpError,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,MAAM,qBAAqB;AAAA,EACzB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,qBAAqB;AACvB;AAMA,MAAM,8BAA8B;AASpC,SAAS,4BAA4B,OAA8C;AACjF,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,YAAY,QAAQ;AACvE,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,WAAW;AAC1B;AAEA,MAAM,6BAA6B;AAAA,EACjC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAChB;AAEA,MAAM,gBAAgB,IAAI,IAAI,OAAO,OAAO,0BAA0B,CAAC;AAEhE,MAAM,iCAAiC;AAMvC,SAAS,0BAA0B,OAAkD;AAC1F,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,YAAY,UAAU,OAAO,MAAM,WAAW,UAAU;AAC3G,WAAO;AAAA,EACT;AACA,QAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,OAAO,MAAM,GAAG;AAEnD,SAAO,WAAW,kCAAkC,cAAc,IAAI,OAAO,UAAU,CAAC;AAC1F;AAEO,SAAS,6BAA6B,OAAoC;AAC/E,MAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,UAAU,IAAI,MAAM,OAAO,MAAM,GAAG;AAC7C,SAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,sBAAsB,OAAwE;AACrG,SACE,4BAA4B,KAAK;AAAA,EAEjC,6BAA6B,KAAK,MAAM,2BAA2B;AAEvE;AAOA,MAAM,sBAAsB;AAO5B,SAAS,oBACP,KACA,OACA,OAAkB,WAClB,aAAkB,KACX;AACP,QAAM,QAAQ,IAAI,MAAM,mBAAmB;AAC3C,QAAM,SAAS,GAAG,mBAAmB,IAAI,IAAI,IAAI,GAAG,IAAI,UAAU;AAClE,QAAM,cAAc,mBAAmB;AACvC,SAAO,OAAO,OAAO,KAAK;AAC1B,QAAM;AACR;AAEA,SAAS,mBAAmB,KAAa,eAAmD;AAC1F,SAAO,kBAAkB,OAAO,KAAK,iBAAiB;AACxD;AAEA,SAAS,sBAAsB,KAAa,eAA4C;AACtF,sBAAoB,KAAK;AAAA,IACvB,aAAa,mBAAmB;AAAA,IAChC,eAAe,mBAAmB,KAAK,aAAa;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,sBAAsB,KAAa,eAA4C;AACtF,sBAAoB,KAAK;AAAA,IACvB,aAAa,mBAAmB;AAAA,IAChC,eAAe,mBAAmB,KAAK,aAAa;AAAA,EACtD,CAAC;AACH;AASA,SAAS,sBAAsB,OAAuE;AACpG,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,YAAY,UAAU,OAAO,MAAM,WAAW,UAAU;AAC3G,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,OAAO,MAAM,GAAG;AACrC,QAAM,CAAC,WAAW,IAAI,IAAI;AAC1B,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAChD,QAAM,SAAS,OAAO,GAAG,EAAE;AAE3B,QAAM,aAAa,OAAO,MAAM;AAEhC,SACE,cAAc,wBACb,SAAS,aAAa,SAAS,WAChC,OAAO,gBAAgB,YACvB,CAAC,MAAM,UAAU,KACjB,eAAe;AAEnB;AAEA,SAAS,wBAAwB,OAAyE;AACxG,MAAI,sBAAsB,KAAK,KAAK,iBAAiB,OAAO;AAC1D,WAAO,MAAM,gBAAgB,mBAAmB;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAyE;AACxG,MAAI,sBAAsB,KAAK,KAAK,iBAAiB,OAAO;AAC1D,WAAO,MAAM,gBAAgB,mBAAmB;AAAA,EAClD;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var nextFetcher_exports = {};
|
|
20
|
+
__export(nextFetcher_exports, {
|
|
21
|
+
isNextFetcher: () => isNextFetcher
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(nextFetcher_exports);
|
|
24
|
+
function isNextFetcher(fetch) {
|
|
25
|
+
return "__nextPatched" in fetch && fetch.__nextPatched === true;
|
|
26
|
+
}
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
isNextFetcher
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=nextFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/nextFetcher.ts"],"sourcesContent":["type Fetcher = typeof globalThis.fetch;\n\n/**\n * Based on nextjs internal implementation https://github.com/vercel/next.js/blob/6185444e0a944a82e7719ac37dad8becfed86acd/packages/next/src/server/lib/patch-fetch.ts#L23\n */\ntype NextFetcher = Fetcher & {\n readonly __nextPatched: true;\n readonly __nextGetStaticStore: () => { getStore: () => StaticGenerationAsyncStorage | undefined };\n};\n\n/**\n * Full type can be found https://github.com/vercel/next.js/blob/6185444e0a944a82e7719ac37dad8becfed86acd/packages/next/src/client/components/static-generation-async-storage.external.ts#L4\n */\ninterface StaticGenerationAsyncStorage {\n /**\n * Available for Next 14\n */\n readonly pagePath?: string;\n /**\n * Available for Next 15\n */\n readonly page?: string;\n}\n\nfunction isNextFetcher(fetch: Fetcher | NextFetcher): fetch is NextFetcher {\n return '__nextPatched' in fetch && fetch.__nextPatched === true;\n}\n\nexport { isNextFetcher };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBA,SAAS,cAAc,OAAoD;AACzE,SAAO,mBAAmB,SAAS,MAAM,kBAAkB;AAC7D;","names":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use server";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var SessionTernSecure_exports = {};
|
|
21
|
+
__export(SessionTernSecure_exports, {
|
|
22
|
+
verifyFirebaseToken: () => verifyFirebaseToken
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(SessionTernSecure_exports);
|
|
25
|
+
var import_admin = require("@tern-secure/backend/admin");
|
|
26
|
+
async function verifyFirebaseToken(token) {
|
|
27
|
+
if (!token) {
|
|
28
|
+
return {
|
|
29
|
+
valid: false,
|
|
30
|
+
error: {
|
|
31
|
+
success: false,
|
|
32
|
+
code: "INVALID_TOKEN",
|
|
33
|
+
message: "Token is required for verification"
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
return await (0, import_admin.VerifyNextTernSessionCookie)(token);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error("Error verifying token:", error);
|
|
41
|
+
return {
|
|
42
|
+
valid: false,
|
|
43
|
+
error: {
|
|
44
|
+
success: false,
|
|
45
|
+
code: "INVALID_TOKEN",
|
|
46
|
+
message: error instanceof Error ? error.message : "Token verification failed"
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
52
|
+
0 && (module.exports = {
|
|
53
|
+
verifyFirebaseToken
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=SessionTernSecure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/node/SessionTernSecure.ts"],"sourcesContent":["\"use server\";\n\nimport { VerifyNextTernSessionCookie } from \"@tern-secure/backend/admin\";\nimport type { TernVerificationResult } from \"@tern-secure/types\";\n\nexport async function verifyFirebaseToken(\n token: string\n): Promise<TernVerificationResult> {\n if (!token) {\n return {\n valid: false,\n error: {\n success: false,\n code: \"INVALID_TOKEN\",\n message: \"Token is required for verification\",\n },\n };\n }\n\n try {\n return await VerifyNextTernSessionCookie(token);\n } catch (error) {\n console.error(\"Error verifying token:\", error);\n return {\n valid: false,\n error: {\n success: false,\n code: \"INVALID_TOKEN\",\n message:\n error instanceof Error ? error.message : \"Token verification failed\",\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA4C;AAG5C,eAAsB,oBACpB,OACiC;AACjC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,WAAO,UAAM,0CAA4B,KAAK;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,KAAK;AAC7C,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -24,34 +24,22 @@ __export(auth_exports, {
|
|
|
24
24
|
requireAuth: () => requireAuth
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(auth_exports);
|
|
27
|
-
var import_react = require("react");
|
|
28
27
|
var import_headers = require("next/headers");
|
|
29
|
-
var
|
|
30
|
-
var import_errors = require("
|
|
28
|
+
var import_react = require("react");
|
|
29
|
+
var import_errors = require("../../errors");
|
|
30
|
+
var import_SessionTernSecure = require("./SessionTernSecure");
|
|
31
31
|
const auth = (0, import_react.cache)(async () => {
|
|
32
32
|
try {
|
|
33
|
-
console.log("auth: Starting auth check...");
|
|
34
33
|
const cookieStore = await (0, import_headers.cookies)();
|
|
35
34
|
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
36
35
|
if (sessionCookie) {
|
|
37
|
-
const result = await (0,
|
|
38
|
-
if (result.valid) {
|
|
39
|
-
const user = {
|
|
40
|
-
uid: result.uid ?? "",
|
|
41
|
-
email: result.email || null,
|
|
42
|
-
authTime: result.authTime
|
|
43
|
-
};
|
|
44
|
-
return { user, error: null };
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
const idToken = cookieStore.get("_session_token")?.value;
|
|
48
|
-
if (idToken) {
|
|
49
|
-
const result = await (0, import_jwt_edge.verifyFirebaseToken)(idToken, false);
|
|
36
|
+
const result = await (0, import_SessionTernSecure.verifyFirebaseToken)(sessionCookie);
|
|
50
37
|
if (result.valid) {
|
|
51
38
|
const user = {
|
|
52
39
|
uid: result.uid ?? "",
|
|
53
|
-
email: result.email
|
|
54
|
-
|
|
40
|
+
email: result.email && typeof result.email === "string" ? result.email : null,
|
|
41
|
+
tenantId: result.tenant || "default",
|
|
42
|
+
authTime: result.authTime && typeof result.authTime === "number" ? result.authTime : void 0
|
|
55
43
|
};
|
|
56
44
|
return { user, error: null };
|
|
57
45
|
}
|
|
@@ -70,7 +58,10 @@ const auth = (0, import_react.cache)(async () => {
|
|
|
70
58
|
}
|
|
71
59
|
return {
|
|
72
60
|
user: null,
|
|
73
|
-
error: new import_errors.TernSecureError(
|
|
61
|
+
error: new import_errors.TernSecureError(
|
|
62
|
+
"INTERNAL_ERROR",
|
|
63
|
+
"An unexpected error occurred"
|
|
64
|
+
)
|
|
74
65
|
};
|
|
75
66
|
}
|
|
76
67
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/node/auth.ts"],"sourcesContent":["import { cookies } from \"next/headers\";\nimport { cache } from \"react\";\n\nimport { TernSecureError } from \"../../errors\";\nimport type { BaseUser } from \"../../types\";\nimport { verifyFirebaseToken } from \"./SessionTernSecure\";\n\nexport interface AuthResult {\n user: BaseUser | null;\n error: Error | null;\n}\n\n/**\n * Get the current authenticated user from the session cookies\n */\nexport const auth = cache(async (): Promise<AuthResult> => {\n try {\n const cookieStore = await cookies();\n\n const sessionCookie = cookieStore.get(\"_session_cookie\")?.value;\n if (sessionCookie) {\n const result = await verifyFirebaseToken(sessionCookie);\n if (result.valid) {\n const user: BaseUser = {\n uid: result.uid ?? \"\",\n email:\n result.email && typeof result.email === \"string\"\n ? result.email\n : null,\n tenantId: result.tenant || \"default\",\n authTime:\n result.authTime && typeof result.authTime === \"number\"\n ? result.authTime\n : undefined,\n };\n return { user, error: null };\n }\n }\n\n return {\n user: null,\n error: new TernSecureError(\"UNAUTHENTICATED\", \"No valid session found\"),\n };\n } catch (error) {\n console.error(\"Error in Auth:\", error);\n if (error instanceof TernSecureError) {\n return {\n user: null,\n error,\n };\n }\n return {\n user: null,\n error: new TernSecureError(\n \"INTERNAL_ERROR\",\n \"An unexpected error occurred\"\n ),\n };\n }\n});\n\n/**\n * Type guard to check if user is authenticated\n */\nexport const isAuthenticated = cache(async (): Promise<boolean> => {\n const { user } = await auth();\n return user !== null;\n});\n\n/**\n * Get user info from auth result\n */\nexport const getUser = cache(async (): Promise<BaseUser | null> => {\n const { user } = await auth();\n return user;\n});\n\n/**\n * Require authentication\n * Throws error if not authenticated\n */\nexport const requireAuth = cache(async (): Promise<BaseUser> => {\n const { user, error } = await auth();\n\n if (!user) {\n throw error || new Error(\"Authentication required\");\n }\n\n return user;\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AACxB,mBAAsB;AAEtB,oBAAgC;AAEhC,+BAAoC;AAU7B,MAAM,WAAO,oBAAM,YAAiC;AACzD,MAAI;AACF,UAAM,cAAc,UAAM,wBAAQ;AAElC,UAAM,gBAAgB,YAAY,IAAI,iBAAiB,GAAG;AAC1D,QAAI,eAAe;AACjB,YAAM,SAAS,UAAM,8CAAoB,aAAa;AACtD,UAAI,OAAO,OAAO;AAChB,cAAM,OAAiB;AAAA,UACrB,KAAK,OAAO,OAAO;AAAA,UACnB,OACE,OAAO,SAAS,OAAO,OAAO,UAAU,WACpC,OAAO,QACP;AAAA,UACN,UAAU,OAAO,UAAU;AAAA,UAC3B,UACE,OAAO,YAAY,OAAO,OAAO,aAAa,WAC1C,OAAO,WACP;AAAA,QACR;AACA,eAAO,EAAE,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,IAAI,8BAAgB,mBAAmB,wBAAwB;AAAA,IACxE;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,kBAAkB,KAAK;AACrC,QAAI,iBAAiB,+BAAiB;AACpC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAKM,MAAM,sBAAkB,oBAAM,YAA8B;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO,SAAS;AAClB,CAAC;AAKM,MAAM,cAAU,oBAAM,YAAsC;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO;AACT,CAAC;AAMM,MAAM,kBAAc,oBAAM,YAA+B;AAC9D,QAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK;AAEnC,MAAI,CAAC,MAAM;AACT,UAAM,SAAS,IAAI,MAAM,yBAAyB;AAAA,EACpD;AAEA,SAAO;AACT,CAAC;","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var node_exports = {};
|
|
20
|
+
__export(node_exports, {
|
|
21
|
+
auth: () => import_auth.auth,
|
|
22
|
+
createRouteMatcher: () => import_ternSecureNodeMiddleware.createRouteMatcher,
|
|
23
|
+
getUser: () => import_auth.getUser,
|
|
24
|
+
isAuthenticated: () => import_auth.isAuthenticated,
|
|
25
|
+
requireAuth: () => import_auth.requireAuth,
|
|
26
|
+
ternSecureMiddleware: () => import_ternSecureNodeMiddleware.ternSecureMiddleware
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(node_exports);
|
|
29
|
+
var import_ternSecureNodeMiddleware = require("./ternSecureNodeMiddleware");
|
|
30
|
+
var import_auth = require("./auth");
|
|
31
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
32
|
+
0 && (module.exports = {
|
|
33
|
+
auth,
|
|
34
|
+
createRouteMatcher,
|
|
35
|
+
getUser,
|
|
36
|
+
isAuthenticated,
|
|
37
|
+
requireAuth,
|
|
38
|
+
ternSecureMiddleware
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/node/index.ts"],"sourcesContent":["export {\n ternSecureMiddleware,\n createRouteMatcher,\n} from \"./ternSecureNodeMiddleware\";\nexport {\n auth,\n getUser,\n isAuthenticated,\n requireAuth,\n type AuthResult,\n} from \"./auth\";"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAGO;AACP,kBAMO;","names":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var node_session_exports = {};
|
|
20
|
+
__export(node_session_exports, {
|
|
21
|
+
verifySession: () => verifySession
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(node_session_exports);
|
|
24
|
+
var import_SessionTernSecure = require("./SessionTernSecure");
|
|
25
|
+
async function verifySession(request) {
|
|
26
|
+
try {
|
|
27
|
+
const sessionCookie = request.cookies.get("_session_cookie")?.value;
|
|
28
|
+
if (sessionCookie) {
|
|
29
|
+
const result = await (0, import_SessionTernSecure.verifyFirebaseToken)(sessionCookie);
|
|
30
|
+
if (result.valid) {
|
|
31
|
+
return {
|
|
32
|
+
isAuthenticated: true,
|
|
33
|
+
user: {
|
|
34
|
+
uid: result.uid ?? "",
|
|
35
|
+
email: result.email || null,
|
|
36
|
+
tenantId: result.tenant || "default",
|
|
37
|
+
disabled: false
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
isAuthenticated: false,
|
|
44
|
+
user: null,
|
|
45
|
+
error: "No valid session found"
|
|
46
|
+
};
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error("Session verification error:", error);
|
|
49
|
+
return {
|
|
50
|
+
isAuthenticated: false,
|
|
51
|
+
user: null,
|
|
52
|
+
error: error instanceof Error ? error.message : "Session verification failed"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
57
|
+
0 && (module.exports = {
|
|
58
|
+
verifySession
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=node-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/server/node/node-session.ts"],"sourcesContent":["import type { NextRequest } from \"next/server\";\n\nimport type { SessionResult } from \"../types\";\nimport { verifyFirebaseToken } from \"./SessionTernSecure\";\n\nexport async function verifySession(\n request: NextRequest\n): Promise<SessionResult> {\n try {\n const sessionCookie = request.cookies.get(\"_session_cookie\")?.value;\n if (sessionCookie) {\n const result = await verifyFirebaseToken(sessionCookie);\n if (result.valid) {\n //const disabledKey = `disabled_user:${result.uid}`;\n //const disabledUser: DisabledUserRecord | null =\n // await redis.get(disabledKey);\n //const isDisabled = !!disabledUser;\n return {\n isAuthenticated: true,\n user: {\n uid: result.uid ?? \"\",\n email: result.email || null,\n tenantId: result.tenant || \"default\",\n disabled: false,\n },\n };\n }\n }\n return {\n isAuthenticated: false,\n user: null,\n error: \"No valid session found\",\n };\n } catch (error) {\n console.error(\"Session verification error:\", error);\n return {\n isAuthenticated: false,\n user: null,\n error:\n error instanceof Error ? error.message : \"Session verification failed\",\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,+BAAoC;AAEpC,eAAsB,cACpB,SACwB;AACxB,MAAI;AACF,UAAM,gBAAgB,QAAQ,QAAQ,IAAI,iBAAiB,GAAG;AAC9D,QAAI,eAAe;AACjB,YAAM,SAAS,UAAM,8CAAoB,aAAa;AACtD,UAAI,OAAO,OAAO;AAKhB,eAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,MAAM;AAAA,YACJ,KAAK,OAAO,OAAO;AAAA,YACnB,OAAO,OAAO,SAAS;AAAA,YACvB,UAAU,OAAO,UAAU;AAAA,YAC3B,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,OACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC7C;AAAA,EACF;AACF;","names":[]}
|