@tern-secure/nextjs 5.2.0-canary.v20251024005655 → 5.2.0-canary.v20251028151628
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/app-router/admin/actions.js +7 -2
- package/dist/cjs/app-router/admin/actions.js.map +1 -1
- package/dist/cjs/app-router/admin/request.js +2 -2
- package/dist/cjs/app-router/admin/request.js.map +1 -1
- package/dist/cjs/boundary/components.js +6 -0
- package/dist/cjs/boundary/components.js.map +1 -1
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/ternSecureEdgeMiddleware.js.map +1 -1
- package/dist/esm/app-router/admin/actions.js +7 -2
- package/dist/esm/app-router/admin/actions.js.map +1 -1
- package/dist/esm/app-router/admin/request.js +2 -2
- package/dist/esm/app-router/admin/request.js.map +1 -1
- package/dist/esm/boundary/components.js +6 -0
- package/dist/esm/boundary/components.js.map +1 -1
- package/dist/esm/index.js +7 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/ternSecureEdgeMiddleware.js.map +1 -1
- package/dist/types/app-router/admin/actions.d.ts +1 -0
- package/dist/types/app-router/admin/actions.d.ts.map +1 -1
- package/dist/types/boundary/components.d.ts +1 -1
- package/dist/types/boundary/components.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/cjs/server/node/SessionTernSecure.js +0 -55
- package/dist/cjs/server/node/SessionTernSecure.js.map +0 -1
- package/dist/cjs/server/node/auth.js +0 -90
- package/dist/cjs/server/node/auth.js.map +0 -1
- package/dist/cjs/server/node/index.js +0 -40
- package/dist/cjs/server/node/index.js.map +0 -1
- package/dist/cjs/server/node/node-session.js +0 -60
- package/dist/cjs/server/node/node-session.js.map +0 -1
- package/dist/cjs/server/node/ternSecureNodeMiddleware.js +0 -181
- package/dist/cjs/server/node/ternSecureNodeMiddleware.js.map +0 -1
- package/dist/esm/server/node/SessionTernSecure.js +0 -31
- package/dist/esm/server/node/SessionTernSecure.js.map +0 -1
- package/dist/esm/server/node/auth.js +0 -63
- package/dist/esm/server/node/auth.js.map +0 -1
- package/dist/esm/server/node/index.js +0 -19
- package/dist/esm/server/node/index.js.map +0 -1
- package/dist/esm/server/node/node-session.js +0 -36
- package/dist/esm/server/node/node-session.js.map +0 -1
- package/dist/esm/server/node/ternSecureNodeMiddleware.js +0 -164
- package/dist/esm/server/node/ternSecureNodeMiddleware.js.map +0 -1
- package/dist/types/server/node/SessionTernSecure.d.ts +0 -3
- package/dist/types/server/node/SessionTernSecure.d.ts.map +0 -1
- package/dist/types/server/node/auth.d.ts +0 -23
- package/dist/types/server/node/auth.d.ts.map +0 -1
- package/dist/types/server/node/index.d.ts +0 -3
- package/dist/types/server/node/index.d.ts.map +0 -1
- package/dist/types/server/node/node-session.d.ts +0 -4
- package/dist/types/server/node/node-session.d.ts.map +0 -1
- package/dist/types/server/node/ternSecureNodeMiddleware.d.ts +0 -54
- package/dist/types/server/node/ternSecureNodeMiddleware.d.ts.map +0 -1
|
@@ -1,90 +0,0 @@
|
|
|
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 auth_exports = {};
|
|
20
|
-
__export(auth_exports, {
|
|
21
|
-
auth: () => auth,
|
|
22
|
-
getUser: () => getUser,
|
|
23
|
-
isAuthenticated: () => isAuthenticated,
|
|
24
|
-
requireAuth: () => requireAuth
|
|
25
|
-
});
|
|
26
|
-
module.exports = __toCommonJS(auth_exports);
|
|
27
|
-
var import_headers = require("next/headers");
|
|
28
|
-
var import_react = require("react");
|
|
29
|
-
var import_errors = require("../../errors");
|
|
30
|
-
var import_SessionTernSecure = require("./SessionTernSecure");
|
|
31
|
-
const auth = (0, import_react.cache)(async () => {
|
|
32
|
-
try {
|
|
33
|
-
const cookieStore = await (0, import_headers.cookies)();
|
|
34
|
-
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
35
|
-
if (sessionCookie) {
|
|
36
|
-
const result = await (0, import_SessionTernSecure.verifyFirebaseToken)(sessionCookie);
|
|
37
|
-
if (result.valid) {
|
|
38
|
-
const user = {
|
|
39
|
-
uid: result.uid ?? "",
|
|
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
|
|
43
|
-
};
|
|
44
|
-
return { user, error: null };
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
user: null,
|
|
49
|
-
error: new import_errors.TernSecureError("UNAUTHENTICATED", "No valid session found")
|
|
50
|
-
};
|
|
51
|
-
} catch (error) {
|
|
52
|
-
console.error("Error in Auth:", error);
|
|
53
|
-
if (error instanceof import_errors.TernSecureError) {
|
|
54
|
-
return {
|
|
55
|
-
user: null,
|
|
56
|
-
error
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
user: null,
|
|
61
|
-
error: new import_errors.TernSecureError(
|
|
62
|
-
"INTERNAL_ERROR",
|
|
63
|
-
"An unexpected error occurred"
|
|
64
|
-
)
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
const isAuthenticated = (0, import_react.cache)(async () => {
|
|
69
|
-
const { user } = await auth();
|
|
70
|
-
return user !== null;
|
|
71
|
-
});
|
|
72
|
-
const getUser = (0, import_react.cache)(async () => {
|
|
73
|
-
const { user } = await auth();
|
|
74
|
-
return user;
|
|
75
|
-
});
|
|
76
|
-
const requireAuth = (0, import_react.cache)(async () => {
|
|
77
|
-
const { user, error } = await auth();
|
|
78
|
-
if (!user) {
|
|
79
|
-
throw error || new Error("Authentication required");
|
|
80
|
-
}
|
|
81
|
-
return user;
|
|
82
|
-
});
|
|
83
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
84
|
-
0 && (module.exports = {
|
|
85
|
-
auth,
|
|
86
|
-
getUser,
|
|
87
|
-
isAuthenticated,
|
|
88
|
-
requireAuth
|
|
89
|
-
});
|
|
90
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1,40 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1,60 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1,181 +0,0 @@
|
|
|
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 ternSecureNodeMiddleware_exports = {};
|
|
20
|
-
__export(ternSecureNodeMiddleware_exports, {
|
|
21
|
-
createRouteMatcher: () => createRouteMatcher,
|
|
22
|
-
ternSecureMiddleware: () => ternSecureMiddleware
|
|
23
|
-
});
|
|
24
|
-
module.exports = __toCommonJS(ternSecureNodeMiddleware_exports);
|
|
25
|
-
var import_backend = require("@tern-secure/backend");
|
|
26
|
-
var import_admin = require("@tern-secure/backend/admin");
|
|
27
|
-
var import_server = require("next/server");
|
|
28
|
-
var import_constant = require("../constant");
|
|
29
|
-
var import_nextErrors = require("../nextErrors");
|
|
30
|
-
const createRouteMatcher = (patterns) => {
|
|
31
|
-
return (request) => {
|
|
32
|
-
const { pathname } = request.nextUrl;
|
|
33
|
-
return patterns.some((pattern) => {
|
|
34
|
-
const regexPattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\*/g, ".*");
|
|
35
|
-
return new RegExp(`^${regexPattern}$`).test(pathname);
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
const authenticateMiddlewareRequest = async (request) => {
|
|
40
|
-
try {
|
|
41
|
-
const requestState = await (0, import_admin.createBackendInstance)(request);
|
|
42
|
-
const authResult = requestState.requestState.auth();
|
|
43
|
-
return {
|
|
44
|
-
user: {
|
|
45
|
-
uid: authResult.session.uid,
|
|
46
|
-
email: authResult.session.email || null,
|
|
47
|
-
tenantId: authResult.session.firebase?.tenant || "default",
|
|
48
|
-
authTime: authResult.session.auth_time
|
|
49
|
-
},
|
|
50
|
-
session: requestState.requestState.token
|
|
51
|
-
};
|
|
52
|
-
} catch (error) {
|
|
53
|
-
console.error(
|
|
54
|
-
"Auth check error:",
|
|
55
|
-
error instanceof Error ? error.message : "Unknown error"
|
|
56
|
-
);
|
|
57
|
-
return {
|
|
58
|
-
user: null,
|
|
59
|
-
session: null
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
const ternSecureMiddleware = (...args) => {
|
|
64
|
-
const [request, event] = parseRequestAndEvent(args);
|
|
65
|
-
const [handler, params] = parseHandlerAndOptions(args);
|
|
66
|
-
const middleware = () => {
|
|
67
|
-
const withAuthNextMiddleware = async (request2, event2) => {
|
|
68
|
-
const resolvedParams = typeof params === "function" ? await params(request2) : params;
|
|
69
|
-
const signInUrl = resolvedParams.signInUrl || import_constant.SIGN_IN_URL;
|
|
70
|
-
const signUpUrl = resolvedParams.signUpUrl || import_constant.SIGN_UP_URL;
|
|
71
|
-
let handlerResult = import_server.NextResponse.next();
|
|
72
|
-
if (handler) {
|
|
73
|
-
const createAuthHandler = async () => {
|
|
74
|
-
const authObject = await authenticateMiddlewareRequest(request2);
|
|
75
|
-
const getAuth = async () => {
|
|
76
|
-
const ternSecureRequest = (0, import_backend.createTernSecureRequest)(request2);
|
|
77
|
-
const { redirectToSignIn, redirectToSignUp } = createMiddlewareRedirects(
|
|
78
|
-
ternSecureRequest,
|
|
79
|
-
signInUrl,
|
|
80
|
-
signUpUrl
|
|
81
|
-
);
|
|
82
|
-
return {
|
|
83
|
-
...authObject,
|
|
84
|
-
redirectToSignIn,
|
|
85
|
-
redirectToSignUp
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
const protect = async () => {
|
|
89
|
-
if (!authObject.user || !authObject.session) {
|
|
90
|
-
const redirectUrl = new URL(signInUrl || "/sign-in", request2.url);
|
|
91
|
-
redirectUrl.searchParams.set(
|
|
92
|
-
"redirect",
|
|
93
|
-
request2.nextUrl.pathname
|
|
94
|
-
);
|
|
95
|
-
(0, import_nextErrors.redirectToSignInError)(redirectUrl.toString());
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
const authHandler = Object.assign(getAuth, {
|
|
99
|
-
protect,
|
|
100
|
-
user: authObject.user,
|
|
101
|
-
session: authObject.session
|
|
102
|
-
});
|
|
103
|
-
return authHandler;
|
|
104
|
-
};
|
|
105
|
-
try {
|
|
106
|
-
const auth = await createAuthHandler();
|
|
107
|
-
const userHandlerResult = await handler(auth, request2, event2);
|
|
108
|
-
handlerResult = userHandlerResult || handlerResult;
|
|
109
|
-
} catch (error) {
|
|
110
|
-
const ternSecureRequest = (0, import_backend.createTernSecureRequest)(request2);
|
|
111
|
-
handlerResult = handleControlError(error, ternSecureRequest, request2);
|
|
112
|
-
}
|
|
113
|
-
return handlerResult;
|
|
114
|
-
}
|
|
115
|
-
return handlerResult;
|
|
116
|
-
};
|
|
117
|
-
const nextMiddleware = async (request2, event2) => {
|
|
118
|
-
return withAuthNextMiddleware(request2, event2);
|
|
119
|
-
};
|
|
120
|
-
if (request && event) {
|
|
121
|
-
return nextMiddleware(request, event);
|
|
122
|
-
}
|
|
123
|
-
return nextMiddleware;
|
|
124
|
-
};
|
|
125
|
-
return middleware();
|
|
126
|
-
};
|
|
127
|
-
const parseRequestAndEvent = (args) => {
|
|
128
|
-
return [
|
|
129
|
-
args[0] instanceof Request ? args[0] : void 0,
|
|
130
|
-
args[0] instanceof Request ? args[1] : void 0
|
|
131
|
-
];
|
|
132
|
-
};
|
|
133
|
-
const parseHandlerAndOptions = (args) => {
|
|
134
|
-
return [
|
|
135
|
-
typeof args[0] === "function" ? args[0] : void 0,
|
|
136
|
-
(args.length === 2 ? args[1] : typeof args[0] === "function" ? {} : args[0]) || {}
|
|
137
|
-
];
|
|
138
|
-
};
|
|
139
|
-
const createMiddlewareRedirects = (ternSecureRequest, signInUrl, signUpUrl) => {
|
|
140
|
-
const redirectToSignIn = (opts = {}) => {
|
|
141
|
-
const url = signInUrl || ternSecureRequest.ternUrl.toString();
|
|
142
|
-
(0, import_nextErrors.redirectToSignInError)(url, opts.returnBackUrl);
|
|
143
|
-
};
|
|
144
|
-
const redirectToSignUp = (opts = {}) => {
|
|
145
|
-
const url = signUpUrl || ternSecureRequest.ternUrl.toString();
|
|
146
|
-
(0, import_nextErrors.redirectToSignUpError)(url, opts.returnBackUrl);
|
|
147
|
-
};
|
|
148
|
-
return { redirectToSignIn, redirectToSignUp };
|
|
149
|
-
};
|
|
150
|
-
const handleControlError = (error, ternSecureRequest, nextrequest) => {
|
|
151
|
-
if ((0, import_nextErrors.isNextjsNotFoundError)(error)) {
|
|
152
|
-
return import_server.NextResponse.rewrite(new URL("/404", nextrequest.url));
|
|
153
|
-
}
|
|
154
|
-
if ((0, import_nextErrors.isRedirectToSignInError)(error)) {
|
|
155
|
-
const redirectAdapter = (url) => import_server.NextResponse.redirect(new URL(url, nextrequest.url));
|
|
156
|
-
const { redirectToSignIn } = (0, import_backend.createRedirect)({
|
|
157
|
-
redirectAdapter,
|
|
158
|
-
baseUrl: ternSecureRequest.ternUrl.origin,
|
|
159
|
-
signInUrl: import_constant.SIGN_IN_URL,
|
|
160
|
-
signUpUrl: import_constant.SIGN_UP_URL
|
|
161
|
-
});
|
|
162
|
-
return redirectToSignIn({ returnBackUrl: error.returnBackUrl });
|
|
163
|
-
}
|
|
164
|
-
if ((0, import_nextErrors.isRedirectToSignUpError)(error)) {
|
|
165
|
-
const redirectAdapter = (url) => import_server.NextResponse.redirect(new URL(url, nextrequest.url));
|
|
166
|
-
const { redirectToSignUp } = (0, import_backend.createRedirect)({
|
|
167
|
-
redirectAdapter,
|
|
168
|
-
baseUrl: ternSecureRequest.ternUrl.origin,
|
|
169
|
-
signInUrl: import_constant.SIGN_IN_URL,
|
|
170
|
-
signUpUrl: import_constant.SIGN_UP_URL
|
|
171
|
-
});
|
|
172
|
-
return redirectToSignUp({ returnBackUrl: error.returnBackUrl });
|
|
173
|
-
}
|
|
174
|
-
throw error;
|
|
175
|
-
};
|
|
176
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
177
|
-
0 && (module.exports = {
|
|
178
|
-
createRouteMatcher,
|
|
179
|
-
ternSecureMiddleware
|
|
180
|
-
});
|
|
181
|
-
//# sourceMappingURL=ternSecureNodeMiddleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/server/node/ternSecureNodeMiddleware.ts"],"sourcesContent":["import {createRedirect, createTernSecureRequest, type TernSecureRequest } from \"@tern-secure/backend\";\nimport {\n createBackendInstance,\n} from \"@tern-secure/backend/admin\";\nimport type { NextMiddleware,NextRequest } from \"next/server\";\nimport {NextResponse } from \"next/server\";\n\nimport { SIGN_IN_URL, SIGN_UP_URL } from \"../constant\";\nimport {\n isNextjsNotFoundError,\n isRedirectToSignInError,\n isRedirectToSignUpError,\n redirectToSignInError,\n redirectToSignUpError,\n} from \"../nextErrors\";\nimport type { BaseUser ,\n NextMiddlewareEvtParam,\n NextMiddlewareRequestParam,\n NextMiddlewareReturn,\n} from \"../types\";\n\ntype RedirectToParams = { returnBackUrl?: string | URL | null };\nexport type RedirectFun<ReturnType> = (params?: RedirectToParams) => ReturnType;\n\nexport type AuthObject = {\n user: BaseUser | null;\n session: string | null;\n};\n\nexport interface MiddlewareAuth extends AuthObject {\n (): Promise<MiddlewareAuthObject>;\n protect: () => Promise<void>;\n}\n\ntype MiddlewareHandler = (\n auth: MiddlewareAuth,\n request: NextMiddlewareRequestParam,\n event: NextMiddlewareEvtParam\n) => NextMiddlewareReturn;\n\nexport type MiddlewareAuthObject = AuthObject & {\n redirectToSignIn: RedirectFun<Response>;\n redirectToSignUp: RedirectFun<Response>;\n};\n\n/**\n * Create a route matcher function for public paths\n */\nexport const createRouteMatcher = (patterns: string[]) => {\n return (request: NextRequest): boolean => {\n const { pathname } = request.nextUrl;\n return patterns.some((pattern) => {\n const regexPattern = pattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\\\\\*/g, \".*\");\n\n return new RegExp(`^${regexPattern}$`).test(pathname);\n });\n };\n};\n\nconst authenticateMiddlewareRequest = async (\n request: NextRequest\n): Promise<AuthObject> => {\n try {\n const requestState = await createBackendInstance(request);\n const authResult = requestState.requestState.auth();\n\n return {\n user: {\n uid: authResult.session.uid,\n email: authResult.session.email || null,\n tenantId: authResult.session.firebase?.tenant || \"default\",\n authTime: authResult.session.auth_time,\n },\n session: requestState.requestState.token,\n };\n } catch (error) {\n console.error(\n \"Auth check error:\",\n error instanceof Error ? error.message : \"Unknown error\"\n );\n return {\n user: null,\n session: null,\n };\n }\n};\n\nexport interface MiddlewareOptions {\n signInUrl?: string;\n signUpUrl?: string;\n debug?: boolean;\n}\ntype MiddlewareOptionsCallback = (\n req: NextRequest\n) => MiddlewareOptions | Promise<MiddlewareOptions>;\n\ninterface TernSecureMiddleware {\n /**\n * @example\n * export default ternSecureMiddleware((auth, request, event) => { ... }, options);\n */\n (handler: MiddlewareHandler, options?: MiddlewareOptions): NextMiddleware;\n\n /**\n * @example\n * export default ternSecureMiddleware((auth, request, event) => { ... }, (req) => options);\n */\n (\n handler: MiddlewareHandler,\n options?: MiddlewareOptionsCallback\n ): NextMiddleware;\n\n /**\n * @example\n * export default ternSecureMiddleware(options);\n */\n (options?: MiddlewareOptions): NextMiddleware;\n /**\n * @example\n * export default ternSecureMiddleware;\n */\n (\n request: NextMiddlewareRequestParam,\n event: NextMiddlewareEvtParam\n ): NextMiddlewareReturn;\n}\n\nexport const ternSecureMiddleware = ((\n ...args: unknown[]\n): NextMiddleware | NextMiddlewareReturn => {\n const [request, event] = parseRequestAndEvent(args);\n const [handler, params] = parseHandlerAndOptions(args);\n\n const middleware = () => {\n const withAuthNextMiddleware: NextMiddleware = async (request, event) => {\n const resolvedParams =\n typeof params === \"function\" ? await params(request) : params;\n\n const signInUrl = resolvedParams.signInUrl || SIGN_IN_URL;\n const signUpUrl = resolvedParams.signUpUrl || SIGN_UP_URL;\n\n let handlerResult: Response = NextResponse.next();\n\n if (handler) {\n const createAuthHandler = async (): Promise<MiddlewareAuth> => {\n const authObject = await authenticateMiddlewareRequest(request);\n\n const getAuth = async (): Promise<MiddlewareAuthObject> => {\n const ternSecureRequest = createTernSecureRequest(request);\n const { redirectToSignIn, redirectToSignUp } =\n createMiddlewareRedirects(\n ternSecureRequest,\n signInUrl,\n signUpUrl\n );\n\n return {\n ...authObject,\n redirectToSignIn,\n redirectToSignUp,\n };\n };\n\n const protect = async (): Promise<void> => {\n if (!authObject.user || !authObject.session) {\n const redirectUrl = new URL(signInUrl || \"/sign-in\", request.url);\n redirectUrl.searchParams.set(\n \"redirect\",\n request.nextUrl.pathname\n );\n redirectToSignInError(redirectUrl.toString());\n }\n };\n\n // Return the MiddlewareAuth object with direct property access\n const authHandler = Object.assign(getAuth, {\n protect,\n user: authObject.user,\n session: authObject.session,\n });\n\n return authHandler as MiddlewareAuth;\n };\n\n try {\n const auth = await createAuthHandler();\n const userHandlerResult = await handler(auth, request, event);\n handlerResult = userHandlerResult || handlerResult;\n } catch (error) {\n const ternSecureRequest = createTernSecureRequest(request);\n handlerResult = handleControlError(error, ternSecureRequest, request);\n }\n\n return handlerResult;\n }\n\n return handlerResult;\n };\n\n const nextMiddleware: NextMiddleware = async (request, event) => {\n return withAuthNextMiddleware(request, event);\n };\n\n if (request && event) {\n return nextMiddleware(request, event);\n }\n\n return nextMiddleware;\n };\n return middleware();\n}) as TernSecureMiddleware;\n\nconst parseRequestAndEvent = (args: unknown[]) => {\n return [\n args[0] instanceof Request ? args[0] : undefined,\n args[0] instanceof Request ? args[1] : undefined,\n ] as [\n NextMiddlewareRequestParam | undefined,\n NextMiddlewareEvtParam | undefined,\n ];\n};\n\nconst parseHandlerAndOptions = (args: unknown[]) => {\n return [\n typeof args[0] === \"function\" ? args[0] : undefined,\n (args.length === 2\n ? args[1]\n : typeof args[0] === \"function\"\n ? {}\n : args[0]) || {},\n ] as [\n MiddlewareHandler | undefined,\n MiddlewareOptions | MiddlewareOptionsCallback,\n ];\n};\n\n/**\n * Create middleware redirect functions\n */\nconst createMiddlewareRedirects = (\n ternSecureRequest: TernSecureRequest,\n signInUrl: string,\n signUpUrl: string\n) => {\n const redirectToSignIn: MiddlewareAuthObject[\"redirectToSignIn\"] = (\n opts = {}\n ) => {\n const url = signInUrl || ternSecureRequest.ternUrl.toString();\n redirectToSignInError(url, opts.returnBackUrl);\n };\n\n const redirectToSignUp: MiddlewareAuthObject[\"redirectToSignUp\"] = (\n opts = {}\n ) => {\n const url = signUpUrl || ternSecureRequest.ternUrl.toString();\n redirectToSignUpError(url, opts.returnBackUrl);\n };\n\n return { redirectToSignIn, redirectToSignUp };\n};\n\n/**\n * Handle control flow errors in middleware\n */\nconst handleControlError = (\n error: any,\n ternSecureRequest: TernSecureRequest,\n nextrequest: NextRequest\n): Response => {\n if (isNextjsNotFoundError(error)) {\n return NextResponse.rewrite(new URL(\"/404\", nextrequest.url));\n }\n\n // Handle redirect to sign in errors\n if (isRedirectToSignInError(error)) {\n const redirectAdapter = (url: string) =>\n NextResponse.redirect(new URL(url, nextrequest.url));\n const { redirectToSignIn } = createRedirect({\n redirectAdapter,\n baseUrl: ternSecureRequest.ternUrl.origin,\n signInUrl: SIGN_IN_URL,\n signUpUrl: SIGN_UP_URL,\n });\n\n return redirectToSignIn({ returnBackUrl: error.returnBackUrl });\n }\n\n // Handle redirect to sign up errors\n if (isRedirectToSignUpError(error)) {\n const redirectAdapter = (url: string) =>\n NextResponse.redirect(new URL(url, nextrequest.url));\n const { redirectToSignUp } = createRedirect({\n redirectAdapter,\n baseUrl: ternSecureRequest.ternUrl.origin,\n signInUrl: SIGN_IN_URL,\n signUpUrl: SIGN_UP_URL,\n });\n\n return redirectToSignUp({ returnBackUrl: error.returnBackUrl });\n }\n\n throw error;\n};\n"],"mappings":"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","names":["request","event"]}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { VerifyNextTernSessionCookie } from "@tern-secure/backend/admin";
|
|
3
|
-
async function verifyFirebaseToken(token) {
|
|
4
|
-
if (!token) {
|
|
5
|
-
return {
|
|
6
|
-
valid: false,
|
|
7
|
-
error: {
|
|
8
|
-
success: false,
|
|
9
|
-
code: "INVALID_TOKEN",
|
|
10
|
-
message: "Token is required for verification"
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
try {
|
|
15
|
-
return await VerifyNextTernSessionCookie(token);
|
|
16
|
-
} catch (error) {
|
|
17
|
-
console.error("Error verifying token:", error);
|
|
18
|
-
return {
|
|
19
|
-
valid: false,
|
|
20
|
-
error: {
|
|
21
|
-
success: false,
|
|
22
|
-
code: "INVALID_TOKEN",
|
|
23
|
-
message: error instanceof Error ? error.message : "Token verification failed"
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
export {
|
|
29
|
-
verifyFirebaseToken
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=SessionTernSecure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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":";AAEA,SAAS,mCAAmC;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,MAAM,4BAA4B,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":[]}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { cookies } from "next/headers";
|
|
2
|
-
import { cache } from "react";
|
|
3
|
-
import { TernSecureError } from "../../errors";
|
|
4
|
-
import { verifyFirebaseToken } from "./SessionTernSecure";
|
|
5
|
-
const auth = cache(async () => {
|
|
6
|
-
try {
|
|
7
|
-
const cookieStore = await cookies();
|
|
8
|
-
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
9
|
-
if (sessionCookie) {
|
|
10
|
-
const result = await verifyFirebaseToken(sessionCookie);
|
|
11
|
-
if (result.valid) {
|
|
12
|
-
const user = {
|
|
13
|
-
uid: result.uid ?? "",
|
|
14
|
-
email: result.email && typeof result.email === "string" ? result.email : null,
|
|
15
|
-
tenantId: result.tenant || "default",
|
|
16
|
-
authTime: result.authTime && typeof result.authTime === "number" ? result.authTime : void 0
|
|
17
|
-
};
|
|
18
|
-
return { user, error: null };
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return {
|
|
22
|
-
user: null,
|
|
23
|
-
error: new TernSecureError("UNAUTHENTICATED", "No valid session found")
|
|
24
|
-
};
|
|
25
|
-
} catch (error) {
|
|
26
|
-
console.error("Error in Auth:", error);
|
|
27
|
-
if (error instanceof TernSecureError) {
|
|
28
|
-
return {
|
|
29
|
-
user: null,
|
|
30
|
-
error
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
user: null,
|
|
35
|
-
error: new TernSecureError(
|
|
36
|
-
"INTERNAL_ERROR",
|
|
37
|
-
"An unexpected error occurred"
|
|
38
|
-
)
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
const isAuthenticated = cache(async () => {
|
|
43
|
-
const { user } = await auth();
|
|
44
|
-
return user !== null;
|
|
45
|
-
});
|
|
46
|
-
const getUser = cache(async () => {
|
|
47
|
-
const { user } = await auth();
|
|
48
|
-
return user;
|
|
49
|
-
});
|
|
50
|
-
const requireAuth = cache(async () => {
|
|
51
|
-
const { user, error } = await auth();
|
|
52
|
-
if (!user) {
|
|
53
|
-
throw error || new Error("Authentication required");
|
|
54
|
-
}
|
|
55
|
-
return user;
|
|
56
|
-
});
|
|
57
|
-
export {
|
|
58
|
-
auth,
|
|
59
|
-
getUser,
|
|
60
|
-
isAuthenticated,
|
|
61
|
-
requireAuth
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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,SAAS,eAAe;AACxB,SAAS,aAAa;AAEtB,SAAS,uBAAuB;AAEhC,SAAS,2BAA2B;AAU7B,MAAM,OAAO,MAAM,YAAiC;AACzD,MAAI;AACF,UAAM,cAAc,MAAM,QAAQ;AAElC,UAAM,gBAAgB,YAAY,IAAI,iBAAiB,GAAG;AAC1D,QAAI,eAAe;AACjB,YAAM,SAAS,MAAM,oBAAoB,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,gBAAgB,mBAAmB,wBAAwB;AAAA,IACxE;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,kBAAkB,KAAK;AACrC,QAAI,iBAAiB,iBAAiB;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,kBAAkB,MAAM,YAA8B;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO,SAAS;AAClB,CAAC;AAKM,MAAM,UAAU,MAAM,YAAsC;AACjE,QAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAC5B,SAAO;AACT,CAAC;AAMM,MAAM,cAAc,MAAM,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":[]}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ternSecureMiddleware,
|
|
3
|
-
createRouteMatcher
|
|
4
|
-
} from "./ternSecureNodeMiddleware";
|
|
5
|
-
import {
|
|
6
|
-
auth,
|
|
7
|
-
getUser,
|
|
8
|
-
isAuthenticated,
|
|
9
|
-
requireAuth
|
|
10
|
-
} from "./auth";
|
|
11
|
-
export {
|
|
12
|
-
auth,
|
|
13
|
-
createRouteMatcher,
|
|
14
|
-
getUser,
|
|
15
|
-
isAuthenticated,
|
|
16
|
-
requireAuth,
|
|
17
|
-
ternSecureMiddleware
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;","names":[]}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { verifyFirebaseToken } from "./SessionTernSecure";
|
|
2
|
-
async function verifySession(request) {
|
|
3
|
-
try {
|
|
4
|
-
const sessionCookie = request.cookies.get("_session_cookie")?.value;
|
|
5
|
-
if (sessionCookie) {
|
|
6
|
-
const result = await verifyFirebaseToken(sessionCookie);
|
|
7
|
-
if (result.valid) {
|
|
8
|
-
return {
|
|
9
|
-
isAuthenticated: true,
|
|
10
|
-
user: {
|
|
11
|
-
uid: result.uid ?? "",
|
|
12
|
-
email: result.email || null,
|
|
13
|
-
tenantId: result.tenant || "default",
|
|
14
|
-
disabled: false
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return {
|
|
20
|
-
isAuthenticated: false,
|
|
21
|
-
user: null,
|
|
22
|
-
error: "No valid session found"
|
|
23
|
-
};
|
|
24
|
-
} catch (error) {
|
|
25
|
-
console.error("Session verification error:", error);
|
|
26
|
-
return {
|
|
27
|
-
isAuthenticated: false,
|
|
28
|
-
user: null,
|
|
29
|
-
error: error instanceof Error ? error.message : "Session verification failed"
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export {
|
|
34
|
-
verifySession
|
|
35
|
-
};
|
|
36
|
-
//# sourceMappingURL=node-session.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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":"AAGA,SAAS,2BAA2B;AAEpC,eAAsB,cACpB,SACwB;AACxB,MAAI;AACF,UAAM,gBAAgB,QAAQ,QAAQ,IAAI,iBAAiB,GAAG;AAC9D,QAAI,eAAe;AACjB,YAAM,SAAS,MAAM,oBAAoB,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":[]}
|