@culturefy/shared 1.0.39 → 1.0.40

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.
Files changed (49) hide show
  1. package/build/cjs/constants/app.js +45 -0
  2. package/build/cjs/constants/app.js.map +1 -0
  3. package/build/cjs/constants/index.js +10 -0
  4. package/build/cjs/constants/index.js.map +1 -0
  5. package/build/cjs/index.js +6 -0
  6. package/build/cjs/index.js.map +1 -1
  7. package/build/cjs/middlewares/verify-middleware.js +202 -0
  8. package/build/cjs/middlewares/verify-middleware.js.map +1 -0
  9. package/build/cjs/types/app.js +2 -0
  10. package/build/cjs/types/app.js.map +1 -0
  11. package/build/cjs/utils/cookies.js +28 -0
  12. package/build/cjs/utils/cookies.js.map +1 -0
  13. package/build/esm/constants/app.js +41 -0
  14. package/build/esm/constants/app.js.map +1 -0
  15. package/build/esm/constants/index.js +2 -0
  16. package/build/esm/constants/index.js.map +1 -0
  17. package/build/esm/index.js +1 -0
  18. package/build/esm/index.js.map +1 -1
  19. package/build/esm/middlewares/verify-middleware.js +197 -0
  20. package/build/esm/middlewares/verify-middleware.js.map +1 -0
  21. package/build/esm/types/app.js +2 -0
  22. package/build/esm/types/app.js.map +1 -0
  23. package/build/esm/utils/cookies.js +24 -0
  24. package/build/esm/utils/cookies.js.map +1 -0
  25. package/build/src/constants/app.d.ts +2 -0
  26. package/build/src/constants/app.js +38 -0
  27. package/build/src/constants/app.js.map +1 -0
  28. package/build/src/constants/index.d.ts +1 -0
  29. package/build/src/constants/index.js +5 -0
  30. package/build/src/constants/index.js.map +1 -0
  31. package/build/src/index.d.ts +1 -0
  32. package/build/src/index.js +1 -0
  33. package/build/src/index.js.map +1 -1
  34. package/build/src/middlewares/verify-middleware.d.ts +2 -0
  35. package/build/src/middlewares/verify-middleware.js +167 -0
  36. package/build/src/middlewares/verify-middleware.js.map +1 -0
  37. package/build/src/types/app.d.ts +29 -0
  38. package/build/src/types/app.js +3 -0
  39. package/build/src/types/app.js.map +1 -0
  40. package/build/src/utils/cookies.d.ts +2 -0
  41. package/build/src/utils/cookies.js +25 -0
  42. package/build/src/utils/cookies.js.map +1 -0
  43. package/package.json +1 -1
  44. package/src/constants/app.ts +40 -0
  45. package/src/constants/index.ts +1 -0
  46. package/src/index.ts +2 -1
  47. package/src/middlewares/verify-middleware.ts +197 -0
  48. package/src/types/app.ts +27 -0
  49. package/src/utils/cookies.ts +24 -0
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.APP_MAP = void 0;
5
+ const APP_MAP = exports.APP_MAP = {
6
+ '3238hxa2': {
7
+ appId: "3238hxa2",
8
+ name: "superadmin",
9
+ clientId: "cfy-superadmin-web",
10
+ domains: {
11
+ local: ["localhost:5173", "127.0.0.1:5173"],
12
+ dev: ["accounts.dev.culturefy.app"],
13
+ staging: ["accounts.staging.culturefy.app"],
14
+ prod: ["accounts.culturefy.app"]
15
+ },
16
+ auth: {
17
+ realm: "superadmin",
18
+ clientId: "cfy-superadmin-web"
19
+ },
20
+ exclude: {
21
+ prod: [] // e.g. add "app.culturefy.app" to prevent misrouting
22
+ },
23
+ cookie: {
24
+ prefix: "__Secure-auth",
25
+ domain: {
26
+ local: null,
27
+ // host-bound in local
28
+ dev: ".culturefy.dev",
29
+ // adjust to your dev root
30
+ staging: ".culturefy.staging",
31
+ // adjust to your staging root
32
+ prod: ".culturefy.app"
33
+ },
34
+ path: "/",
35
+ sameSite: "None",
36
+ secure: true,
37
+ httpOnly: true,
38
+ maxAgeSec: {
39
+ sid: 15 * 60,
40
+ rt: 30 * 24 * 60 * 60
41
+ } // 15m / 30d
42
+ }
43
+ }
44
+ };
45
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","names":["APP_MAP","exports","appId","name","clientId","domains","local","dev","staging","prod","auth","realm","exclude","cookie","prefix","domain","path","sameSite","secure","httpOnly","maxAgeSec","sid","rt"],"sources":["../../../src/constants/app.ts"],"sourcesContent":["import { IAppId, IDomainMappings } from \"../types/app\";\n\nexport const APP_MAP: Record<IAppId, IDomainMappings> = {\n '3238hxa2': {\n appId: \"3238hxa2\",\n name: \"superadmin\",\n clientId: \"cfy-superadmin-web\",\n domains: {\n local: [\"localhost:5173\", \"127.0.0.1:5173\"],\n dev: [\"accounts.dev.culturefy.app\"],\n staging: [\"accounts.staging.culturefy.app\"],\n prod: [\"accounts.culturefy.app\"]\n },\n\n auth: {\n realm: \"superadmin\",\n clientId: \"cfy-superadmin-web\",\n },\n\n exclude: {\n prod: [] // e.g. add \"app.culturefy.app\" to prevent misrouting\n },\n cookie: {\n prefix: \"__Secure-auth\",\n domain: {\n local: null, // host-bound in local\n dev: \".culturefy.dev\", // adjust to your dev root\n staging: \".culturefy.staging\", // adjust to your staging root\n prod: \".culturefy.app\"\n },\n path: \"/\",\n sameSite: \"None\",\n secure: true,\n httpOnly: true,\n maxAgeSec: { sid: 15 * 60, rt: 30 * 24 * 60 * 60 } // 15m / 30d\n }\n\n },\n\n};\n"],"mappings":";;;;AAEO,MAAMA,OAAwC,GAAAC,OAAA,CAAAD,OAAA,GAAG;EACtD,UAAU,EAAE;IACRE,KAAK,EAAE,UAAU;IACjBC,IAAI,EAAE,YAAY;IAClBC,QAAQ,EAAE,oBAAoB;IAC9BC,OAAO,EAAE;MACLC,KAAK,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;MAC3CC,GAAG,EAAE,CAAC,4BAA4B,CAAC;MACnCC,OAAO,EAAE,CAAC,gCAAgC,CAAC;MAC3CC,IAAI,EAAE,CAAC,wBAAwB;IACnC,CAAC;IAEDC,IAAI,EAAE;MACFC,KAAK,EAAE,YAAY;MACnBP,QAAQ,EAAE;IACd,CAAC;IAEDQ,OAAO,EAAE;MACLH,IAAI,EAAE,EAAE,CAAC;IACb,CAAC;IACDI,MAAM,EAAE;MACJC,MAAM,EAAE,eAAe;MACvBC,MAAM,EAAE;QACJT,KAAK,EAAE,IAAI;QAAE;QACbC,GAAG,EAAE,gBAAgB;QAAE;QACvBC,OAAO,EAAE,oBAAoB;QAAE;QAC/BC,IAAI,EAAE;MACV,CAAC;MACDO,IAAI,EAAE,GAAG;MACTC,QAAQ,EAAE,MAAM;MAChBC,MAAM,EAAE,IAAI;MACZC,QAAQ,EAAE,IAAI;MACdC,SAAS,EAAE;QAAEC,GAAG,EAAE,EAAE,GAAG,EAAE;QAAEC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;MAAG,CAAC,CAAC;IACvD;EAEJ;AAEF,CAAC","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ var _app = require("./app");
5
+ Object.keys(_app).forEach(function (key) {
6
+ if (key === "default" || key === "__esModule") return;
7
+ if (key in exports && exports[key] === _app[key]) return;
8
+ exports[key] = _app[key];
9
+ });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_app","require","Object","keys","forEach","key","exports"],"sources":["../../../src/constants/index.ts"],"sourcesContent":["export * from './app';"],"mappings":";;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,IAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,IAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,IAAA,CAAAK,GAAA;AAAA","ignoreList":[]}
@@ -25,4 +25,10 @@ Object.keys(_middlewares).forEach(function (key) {
25
25
  if (key in exports && exports[key] === _middlewares[key]) return;
26
26
  exports[key] = _middlewares[key];
27
27
  });
28
+ var _constants = require("./constants");
29
+ Object.keys(_constants).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _constants[key]) return;
32
+ exports[key] = _constants[key];
33
+ });
28
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_types","require","Object","keys","forEach","key","exports","_enums","_utils","_middlewares"],"sources":["../../src/index.ts"],"sourcesContent":["export * from './types';\nexport * from './enums';\nexport * from './utils';\nexport * from './middlewares';"],"mappings":";;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,MAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,MAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,MAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,MAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,MAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,MAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,MAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,MAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,MAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,MAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,MAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,YAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,YAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,YAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,YAAA,CAAAJ,GAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_types","require","Object","keys","forEach","key","exports","_enums","_utils","_middlewares","_constants"],"sources":["../../src/index.ts"],"sourcesContent":["export * from './types';\nexport * from './enums';\nexport * from './utils';\nexport * from './middlewares';\nexport * from './constants';\n"],"mappings":";;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,MAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,MAAA,CAAAK,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAL,MAAA,CAAAK,GAAA;AAAA;AACA,IAAAE,MAAA,GAAAN,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAI,MAAA,EAAAH,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAE,MAAA,CAAAF,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAE,MAAA,CAAAF,GAAA;AAAA;AACA,IAAAG,MAAA,GAAAP,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAK,MAAA,EAAAJ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAG,MAAA,CAAAH,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAG,MAAA,CAAAH,GAAA;AAAA;AACA,IAAAI,YAAA,GAAAR,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAM,YAAA,EAAAL,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAI,YAAA,CAAAJ,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAI,YAAA,CAAAJ,GAAA;AAAA;AACA,IAAAK,UAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,UAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,UAAA,CAAAL,GAAA;EAAAC,OAAA,CAAAD,GAAA,IAAAK,UAAA,CAAAL,GAAA;AAAA","ignoreList":[]}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.verifyMw = void 0;
5
+ var _utils = require("../utils");
6
+ var _constants = require("../constants");
7
+ var _jwtDecode = require("jwt-decode");
8
+ var _cookies = require("../utils/cookies");
9
+ const apiURL = process.env.REFRESH_SESSION_URL || '';
10
+ const parseCookieHeader = header => {
11
+ const out = {};
12
+ if (!header) return out;
13
+ for (const part of header.split(";")) {
14
+ const [k, ...rest] = part.trim().split("=");
15
+ if (!k) continue;
16
+ out[k] = decodeURIComponent(rest.join("=") || "");
17
+ }
18
+ return out;
19
+ };
20
+ const verifyMw = async (req, ctx, next) => {
21
+ var _APP_MAP$appId, _p, _ref, _ref$state, _p$cfy_tid, _p$sub, _ref2, _p$cfy_bid, _ref3, _p$email, _p$name, _ref4, _p$resource_access$ex, _p$resource_access, _p$realm_access;
22
+ const appId = req.headers.get("app-id");
23
+ if (!appId || !(_constants.APP_MAP != null && (_APP_MAP$appId = _constants.APP_MAP[appId]) != null && _APP_MAP$appId.clientId)) {
24
+ return (0, _utils.sendResponse)(400, {
25
+ status: "bad_request",
26
+ reason: "invalid_app"
27
+ });
28
+ }
29
+ const expectedClientId = _constants.APP_MAP[appId].clientId;
30
+
31
+ // cookies
32
+ const cookies = parseCookieHeader(req.headers.get("cookie"));
33
+ const at = cookies[`__Secure-session-v1.${appId}.at`];
34
+ const rt = cookies[`__Secure-session-v1.${appId}.rt`];
35
+ if (!at && !rt) {
36
+ return (0, _utils.sendResponse)(401, {
37
+ status: "unauthenticated",
38
+ reason: "no_tokens"
39
+ });
40
+ }
41
+
42
+ // decode/verify (lightweight; replace with your verifyJsonWebToken if you have it)
43
+ let p;
44
+ try {
45
+ p = (0, _jwtDecode.jwtDecode)(at);
46
+ } catch {
47
+ return (0, _utils.sendResponse)(401, {
48
+ status: "unauthenticated",
49
+ reason: "invalid_token"
50
+ });
51
+ }
52
+ if (!((_p = p) != null && _p.sid)) {
53
+ return (0, _utils.sendResponse)(401, {
54
+ status: "unauthenticated",
55
+ reason: "user_not_found"
56
+ });
57
+ }
58
+ const now = Math.floor(Date.now() / 1000);
59
+ // if (typeof p.exp === "number" && p.exp <= now) {
60
+ if (typeof p.exp === "number" && p.exp >= now) {
61
+ // Delegate to refresh helper; it will handle setting cookies/state or returning an error
62
+ return await getNewRefreshToken(req, ctx, appId, expectedClientId, rt, p, next);
63
+ }
64
+
65
+ // audience checks
66
+ const audOk = Array.isArray(p.aud) && p.aud.includes(expectedClientId) || typeof p.aud === "string" && (p.aud === expectedClientId || p.aud === "account") || p.azp === expectedClientId;
67
+ if (!audOk) {
68
+ return (0, _utils.sendResponse)(403, {
69
+ status: "forbidden",
70
+ reason: "audience_mismatch"
71
+ });
72
+ }
73
+ (0, _cookies.setCookieKV)(ctx, 'ew', 'rre');
74
+
75
+ // pass data downstream
76
+ (_ref$state = (_ref = ctx).state) != null ? _ref$state : _ref.state = {};
77
+ const tenantId = (_p$cfy_tid = p.cfy_tid) != null ? _p$cfy_tid : p.iss ? new URL(p.iss).pathname.split("/").pop() : null;
78
+ ctx.state.auth = {
79
+ appId,
80
+ userId: (_p$sub = p.sub) != null ? _p$sub : null,
81
+ businessId: (_ref2 = (_p$cfy_bid = p.cfy_bid) != null ? _p$cfy_bid : tenantId) != null ? _ref2 : null,
82
+ tenantId,
83
+ email: (_ref3 = (_p$email = p.email) != null ? _p$email : p.preferred_username) != null ? _ref3 : null,
84
+ name: (_p$name = p.name) != null ? _p$name : undefined,
85
+ roles: (_ref4 = (_p$resource_access$ex = (_p$resource_access = p.resource_access) == null || (_p$resource_access = _p$resource_access[expectedClientId]) == null ? void 0 : _p$resource_access.roles) != null ? _p$resource_access$ex : (_p$realm_access = p.realm_access) == null ? void 0 : _p$realm_access.roles) != null ? _ref4 : [],
86
+ exp: p.exp
87
+ };
88
+ return next();
89
+ };
90
+ exports.verifyMw = verifyMw;
91
+ async function getNewRefreshToken(req, ctx, appId, expectedClientId, rt, p, next) {
92
+ var _APP_MAP$appId$auth;
93
+ // Attempt server-side refresh using RT
94
+ if (!rt) {
95
+ return (0, _utils.sendResponse)(401, {
96
+ status: "unauthenticated",
97
+ reason: "expired_no_rt"
98
+ });
99
+ }
100
+
101
+ // Resolve realm for refresh
102
+ let realmId = (_APP_MAP$appId$auth = _constants.APP_MAP[appId].auth) == null ? void 0 : _APP_MAP$appId$auth.realm;
103
+ if (!realmId) {
104
+ try {
105
+ const issRealm = p != null && p.iss ? new URL(p.iss).pathname.split("/").pop() : undefined;
106
+ realmId = (p == null ? void 0 : p.cfy_tid) || issRealm || undefined;
107
+ } catch {
108
+ realmId = undefined;
109
+ }
110
+ }
111
+ if (!realmId) {
112
+ return (0, _utils.sendResponse)(401, {
113
+ status: "unauthenticated",
114
+ reason: "cannot_resolve_realm"
115
+ });
116
+ }
117
+ ctx.info("refreshing token payload ----------------------", {
118
+ realmId,
119
+ expectedClientId,
120
+ rt
121
+ });
122
+
123
+ // Call auth service to refresh
124
+ try {
125
+ var _ref5, _ref5$state, _p2$cfy_tid, _p2$sub, _ref6, _p2$cfy_bid, _ref7, _p2$email, _p2$name, _ref8, _p2$resource_access$e, _p2$resource_access, _p2$realm_access;
126
+ const resp = await fetch(apiURL, {
127
+ method: "POST",
128
+ headers: {
129
+ "Content-Type": "application/json"
130
+ },
131
+ body: JSON.stringify({
132
+ realmId,
133
+ clientId: expectedClientId,
134
+ refresh_token: rt
135
+ })
136
+ });
137
+ if (!resp.ok) {
138
+ const text = await resp.text();
139
+ ctx.warn == null || ctx.warn(`refresh call failed: ${resp.status} ${text}`);
140
+ return (0, _utils.sendResponse)(401, {
141
+ status: "unauthenticated",
142
+ reason: "refresh_failed"
143
+ });
144
+ }
145
+ const payload = await resp.json();
146
+ const data = (payload == null ? void 0 : payload.data) || {};
147
+ const newAT = data.access_token;
148
+ const newRT = data.refresh_token;
149
+ if (!newAT || !newRT) {
150
+ return (0, _utils.sendResponse)(401, {
151
+ status: "unauthenticated",
152
+ reason: "invalid_refresh_response"
153
+ });
154
+ }
155
+
156
+ // Set refreshed cookies for client session
157
+ (0, _cookies.setCookieKV)(ctx, `__Secure-session-v1.${appId}.at`, newAT);
158
+ (0, _cookies.setCookieKV)(ctx, `__Secure-session-v1.${appId}.rt`, newRT);
159
+
160
+ // Decode new AT and proceed
161
+ let p2;
162
+ try {
163
+ p2 = (0, _jwtDecode.jwtDecode)(newAT);
164
+ } catch {
165
+ return (0, _utils.sendResponse)(401, {
166
+ status: "unauthenticated",
167
+ reason: "invalid_new_token"
168
+ });
169
+ }
170
+ const audOk2 = Array.isArray(p2.aud) && p2.aud.includes(expectedClientId) || typeof p2.aud === "string" && (p2.aud === expectedClientId || p2.aud === "account") || p2.azp === expectedClientId;
171
+ if (!audOk2) {
172
+ return (0, _utils.sendResponse)(403, {
173
+ status: "forbidden",
174
+ reason: "audience_mismatch"
175
+ });
176
+ }
177
+
178
+ // Update downstream auth state with refreshed token
179
+ (_ref5$state = (_ref5 = ctx).state) != null ? _ref5$state : _ref5.state = {};
180
+ const tenantId2 = (_p2$cfy_tid = p2.cfy_tid) != null ? _p2$cfy_tid : p2.iss ? new URL(p2.iss).pathname.split("/").pop() : null;
181
+ ctx.state.auth = {
182
+ appId,
183
+ userId: (_p2$sub = p2.sub) != null ? _p2$sub : null,
184
+ businessId: (_ref6 = (_p2$cfy_bid = p2.cfy_bid) != null ? _p2$cfy_bid : tenantId2) != null ? _ref6 : null,
185
+ tenantId: tenantId2,
186
+ email: (_ref7 = (_p2$email = p2.email) != null ? _p2$email : p2.preferred_username) != null ? _ref7 : null,
187
+ name: (_p2$name = p2.name) != null ? _p2$name : undefined,
188
+ roles: (_ref8 = (_p2$resource_access$e = (_p2$resource_access = p2.resource_access) == null || (_p2$resource_access = _p2$resource_access[expectedClientId]) == null ? void 0 : _p2$resource_access.roles) != null ? _p2$resource_access$e : (_p2$realm_access = p2.realm_access) == null ? void 0 : _p2$realm_access.roles) != null ? _ref8 : [],
189
+ exp: p2.exp
190
+ };
191
+
192
+ // Continue pipeline after refresh
193
+ return next();
194
+ } catch (e) {
195
+ ctx.error == null || ctx.error("refresh exception", e);
196
+ return (0, _utils.sendResponse)(401, {
197
+ status: "unauthenticated",
198
+ reason: "refresh_exception"
199
+ });
200
+ }
201
+ }
202
+ //# sourceMappingURL=verify-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-middleware.js","names":["_utils","require","_constants","_jwtDecode","_cookies","apiURL","process","env","REFRESH_SESSION_URL","parseCookieHeader","header","out","part","split","k","rest","trim","decodeURIComponent","join","verifyMw","req","ctx","next","_APP_MAP$appId","_p","_ref","_ref$state","_p$cfy_tid","_p$sub","_ref2","_p$cfy_bid","_ref3","_p$email","_p$name","_ref4","_p$resource_access$ex","_p$resource_access","_p$realm_access","appId","headers","get","APP_MAP","clientId","sendResponse","status","reason","expectedClientId","cookies","at","rt","p","jwtDecode","sid","now","Math","floor","Date","exp","getNewRefreshToken","audOk","Array","isArray","aud","includes","azp","setCookieKV","state","tenantId","cfy_tid","iss","URL","pathname","pop","auth","userId","sub","businessId","cfy_bid","email","preferred_username","name","undefined","roles","resource_access","realm_access","exports","_APP_MAP$appId$auth","realmId","realm","issRealm","info","_ref5","_ref5$state","_p2$cfy_tid","_p2$sub","_ref6","_p2$cfy_bid","_ref7","_p2$email","_p2$name","_ref8","_p2$resource_access$e","_p2$resource_access","_p2$realm_access","resp","fetch","method","body","JSON","stringify","refresh_token","ok","text","warn","payload","json","data","newAT","access_token","newRT","p2","audOk2","tenantId2","e","error"],"sources":["../../../src/middlewares/verify-middleware.ts"],"sourcesContent":["import { HttpResponseInit } from \"@azure/functions\";\nimport { HttpRequest } from \"@azure/functions\";\nimport { InvocationContext } from \"@azure/functions\";\nimport { sendResponse } from \"../utils\";\nimport { IMiddleware } from \"../types/middleware\";\nimport { IAppId } from \"../types/app\";\nimport { APP_MAP } from \"../constants\";\nimport { jwtDecode } from \"jwt-decode\";\nimport { setCookieKV } from \"../utils/cookies\";\n\nconst apiURL = process.env.REFRESH_SESSION_URL || ''\n\nconst parseCookieHeader = (header: string | null | undefined) => {\n const out: Record<string, string> = {};\n if (!header) return out;\n for (const part of header.split(\";\")) {\n const [k, ...rest] = part.trim().split(\"=\");\n if (!k) continue;\n out[k] = decodeURIComponent(rest.join(\"=\") || \"\");\n }\n return out;\n};\n\nexport const verifyMw: IMiddleware = async (\n req: HttpRequest,\n ctx: InvocationContext,\n next: () => Promise<HttpResponseInit>\n): Promise<HttpResponseInit> => {\n const appId = req.headers.get(\"app-id\") as IAppId | undefined;\n\n if (!appId || !APP_MAP?.[appId]?.clientId) {\n return sendResponse(400, { status: \"bad_request\", reason: \"invalid_app\" });\n }\n \n const expectedClientId = APP_MAP[appId].clientId;\n\n // cookies\n const cookies = parseCookieHeader(req.headers.get(\"cookie\"));\n const at = cookies[`__Secure-session-v1.${appId}.at`];\n const rt = cookies[`__Secure-session-v1.${appId}.rt`];\n\n if (!at && !rt) {\n return sendResponse(401, { status: \"unauthenticated\", reason: \"no_tokens\" });\n }\n\n // decode/verify (lightweight; replace with your verifyJsonWebToken if you have it)\n let p: any;\n try {\n p = jwtDecode(at);\n } catch {\n return sendResponse(401, { status: \"unauthenticated\", reason: \"invalid_token\" });\n }\n\n if (!p?.sid) {\n return sendResponse(401, { status: \"unauthenticated\", reason: \"user_not_found\" });\n }\n\n const now = Math.floor(Date.now() / 1000);\n // if (typeof p.exp === \"number\" && p.exp <= now) {\n if (typeof p.exp === \"number\" && p.exp >= now) {\n // Delegate to refresh helper; it will handle setting cookies/state or returning an error\n return await getNewRefreshToken(req, ctx, appId, expectedClientId, rt, p, next);\n }\n\n // audience checks\n const audOk =\n (Array.isArray(p.aud) && p.aud.includes(expectedClientId)) ||\n (typeof p.aud === \"string\" && (p.aud === expectedClientId || p.aud === \"account\")) ||\n p.azp === expectedClientId;\n\n if (!audOk) {\n return sendResponse(403, { status: \"forbidden\", reason: \"audience_mismatch\" });\n }\n\n\n setCookieKV(ctx, 'ew','rre');\n\n // pass data downstream\n (ctx as any).state ??= {};\n const tenantId = p.cfy_tid ?? (p.iss ? new URL(p.iss).pathname.split(\"/\").pop() : null);\n\n (ctx as any).state.auth = {\n appId,\n userId: p.sub ?? null,\n businessId: p.cfy_bid ?? tenantId ?? null,\n tenantId,\n email: p.email ?? p.preferred_username ?? null,\n name: p.name ?? undefined,\n roles: p.resource_access?.[expectedClientId]?.roles ?? p.realm_access?.roles ?? [],\n exp: p.exp,\n };\n\n return next();\n};\n\n\n\nasync function getNewRefreshToken(\n req: HttpRequest,\n ctx: InvocationContext,\n appId: IAppId,\n expectedClientId: string,\n rt: string | undefined,\n p: any,\n next: () => Promise<HttpResponseInit>\n): Promise<HttpResponseInit> {\n // Attempt server-side refresh using RT\n if (!rt) {\n return sendResponse(401, { status: \"unauthenticated\", reason: \"expired_no_rt\" });\n }\n\n // Resolve realm for refresh\n let realmId: string | undefined = APP_MAP[appId].auth?.realm;\n if (!realmId) {\n try {\n const issRealm = p?.iss ? new URL(p.iss).pathname.split(\"/\").pop() : undefined;\n realmId = (p as any)?.cfy_tid || issRealm || undefined;\n } catch {\n realmId = undefined;\n }\n }\n\n if (!realmId) {\n return sendResponse(401, { status: \"unauthenticated\", reason: \"cannot_resolve_realm\" });\n }\n\n ctx.info(\"refreshing token payload ----------------------\", {\n realmId,\n expectedClientId,\n rt\n });\n\n\n // Call auth service to refresh\n try {\n const resp = await fetch(apiURL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ \n realmId, \n clientId: expectedClientId, \n refresh_token: rt\n })\n });\n\n if (!resp.ok) {\n const text = await resp.text();\n ctx.warn?.(`refresh call failed: ${resp.status} ${text}`);\n return sendResponse(401, { status: \"unauthenticated\", reason: \"refresh_failed\" });\n }\n\n\n const payload = await resp.json();\n const data = payload?.data || {};\n const newAT = data.access_token as string | undefined;\n const newRT = data.refresh_token as string | undefined;\n if (!newAT || !newRT) {\n return sendResponse(401, { status: \"unauthenticated\", reason: \"invalid_refresh_response\" });\n }\n\n // Set refreshed cookies for client session\n setCookieKV(ctx, `__Secure-session-v1.${appId}.at`, newAT);\n setCookieKV(ctx, `__Secure-session-v1.${appId}.rt`, newRT);\n\n // Decode new AT and proceed\n let p2: any;\n try { p2 = jwtDecode(newAT); } catch { return sendResponse(401, { status: \"unauthenticated\", reason: \"invalid_new_token\" }); }\n\n const audOk2 =\n (Array.isArray(p2.aud) && p2.aud.includes(expectedClientId)) ||\n (typeof p2.aud === \"string\" && (p2.aud === expectedClientId || p2.aud === \"account\")) ||\n p2.azp === expectedClientId;\n if (!audOk2) {\n return sendResponse(403, { status: \"forbidden\", reason: \"audience_mismatch\" });\n }\n\n // Update downstream auth state with refreshed token\n (ctx as any).state ??= {};\n const tenantId2 = p2.cfy_tid ?? (p2.iss ? new URL(p2.iss).pathname.split(\"/\").pop() : null);\n (ctx as any).state.auth = {\n appId,\n userId: p2.sub ?? null,\n businessId: p2.cfy_bid ?? tenantId2 ?? null,\n tenantId: tenantId2,\n email: p2.email ?? p2.preferred_username ?? null,\n name: p2.name ?? undefined,\n roles: p2.resource_access?.[expectedClientId]?.roles ?? p2.realm_access?.roles ?? [],\n exp: p2.exp,\n };\n\n // Continue pipeline after refresh\n return next();\n } catch (e) {\n ctx.error?.(\"refresh exception\", e as any);\n return sendResponse(401, { status: \"unauthenticated\", reason: \"refresh_exception\" });\n }\n}"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","names":[],"sources":["../../../src/types/app.ts"],"sourcesContent":["export type IAppId = \"3238hxa2\";\n\nexport interface IDomainMappings {\n domains: Record<string, string[]>;\n clientId: string;\n appId: string;\n name: string;\n exclude: Record<string, string[]>;\n cookie: {\n prefix: string;\n domain: {\n local: string | null;\n dev: string;\n staging: string;\n prod: string;\n };\n path: string;\n sameSite: string;\n secure: boolean;\n httpOnly: boolean;\n maxAgeSec: { sid: number; rt: number };\n };\n auth?: {\n realm: string;\n clientId: string;\n };\n}"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.setCookieKV = setCookieKV;
5
+ function setCookieKV(ctx, key, value) {
6
+ var _ref, _ref$CTX_COOKIES_OBJ, _ref2, _ref2$CTX_COOKIES;
7
+ // Object-cookie bag (preferred)
8
+ const CTX_COOKIES_OBJ = Symbol.for("cfy.resCookies.obj");
9
+ // @ts-ignore
10
+ const objBag = (_ref$CTX_COOKIES_OBJ = (_ref = ctx)[CTX_COOKIES_OBJ]) != null ? _ref$CTX_COOKIES_OBJ : _ref[CTX_COOKIES_OBJ] = [];
11
+ objBag.push({
12
+ name: key,
13
+ value,
14
+ path: "/",
15
+ httpOnly: true,
16
+ secure: true,
17
+ // drop to false if testing on http://
18
+ sameSite: "None",
19
+ // use "Lax" for same-site
20
+ maxAge: 300 // seconds
21
+ });
22
+
23
+ // (Optional) Keep your string fallback too:
24
+ const CTX_COOKIES = Symbol.for("cfy.resCookies");
25
+ const strBag = (_ref2$CTX_COOKIES = (_ref2 = ctx)[CTX_COOKIES]) != null ? _ref2$CTX_COOKIES : _ref2[CTX_COOKIES] = [];
26
+ strBag.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=None; Secure; Max-Age=300`);
27
+ }
28
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","names":["setCookieKV","ctx","key","value","_ref","_ref$CTX_COOKIES_OBJ","_ref2","_ref2$CTX_COOKIES","CTX_COOKIES_OBJ","Symbol","for","objBag","push","name","path","httpOnly","secure","sameSite","maxAge","CTX_COOKIES","strBag","encodeURIComponent"],"sources":["../../../src/utils/cookies.ts"],"sourcesContent":["import { InvocationContext } from \"@azure/functions\";\n\nexport function setCookieKV(ctx: InvocationContext, key: string, value: string): void {\n // Object-cookie bag (preferred)\n const CTX_COOKIES_OBJ = Symbol.for(\"cfy.resCookies.obj\");\n // @ts-ignore\n const objBag = ((ctx as any)[CTX_COOKIES_OBJ] ??= [] as HttpCookie[]);\n objBag.push({\n name: key,\n value,\n path: \"/\",\n httpOnly: true,\n secure: true, // drop to false if testing on http://\n sameSite: \"None\", // use \"Lax\" for same-site\n maxAge: 300, // seconds\n });\n\n // (Optional) Keep your string fallback too:\n const CTX_COOKIES = Symbol.for(\"cfy.resCookies\");\n const strBag = ((ctx as any)[CTX_COOKIES] ??= [] as string[]);\n strBag.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=None; Secure; Max-Age=300`\n );\n}"],"mappings":";;;;AAEO,SAASA,WAAWA,CAACC,GAAsB,EAAEC,GAAW,EAAEC,KAAa,EAAQ;EAAA,IAAAC,IAAA,EAAAC,oBAAA,EAAAC,KAAA,EAAAC,iBAAA;EACpF;EACA,MAAMC,eAAe,GAAGC,MAAM,CAACC,GAAG,CAAC,oBAAoB,CAAC;EACxD;EACA,MAAMC,MAAM,IAAAN,oBAAA,GAAI,CAAAD,IAAA,GAACH,GAAG,EAASO,eAAe,CAAC,YAAAH,oBAAA,GAA7BD,IAAA,CAAaI,eAAe,CAAC,GAAK,EAAmB;EACrEG,MAAM,CAACC,IAAI,CAAC;IACRC,IAAI,EAAEX,GAAG;IACTC,KAAK;IACLW,IAAI,EAAE,GAAG;IACTC,QAAQ,EAAE,IAAI;IACdC,MAAM,EAAE,IAAI;IAAQ;IACpBC,QAAQ,EAAE,MAAM;IAAI;IACpBC,MAAM,EAAE,GAAG,CAAS;EACxB,CAAC,CAAC;;EAEF;EACA,MAAMC,WAAW,GAAGV,MAAM,CAACC,GAAG,CAAC,gBAAgB,CAAC;EAChD,MAAMU,MAAM,IAAAb,iBAAA,GAAI,CAAAD,KAAA,GAACL,GAAG,EAASkB,WAAW,CAAC,YAAAZ,iBAAA,GAAzBD,KAAA,CAAaa,WAAW,CAAC,GAAK,EAAe;EAC7DC,MAAM,CAACR,IAAI,CACP,GAAGS,kBAAkB,CAACnB,GAAG,CAAC,IAAImB,kBAAkB,CAAClB,KAAK,CAAC,wDAC3D,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ export const APP_MAP = {
2
+ '3238hxa2': {
3
+ appId: "3238hxa2",
4
+ name: "superadmin",
5
+ clientId: "cfy-superadmin-web",
6
+ domains: {
7
+ local: ["localhost:5173", "127.0.0.1:5173"],
8
+ dev: ["accounts.dev.culturefy.app"],
9
+ staging: ["accounts.staging.culturefy.app"],
10
+ prod: ["accounts.culturefy.app"]
11
+ },
12
+ auth: {
13
+ realm: "superadmin",
14
+ clientId: "cfy-superadmin-web"
15
+ },
16
+ exclude: {
17
+ prod: [] // e.g. add "app.culturefy.app" to prevent misrouting
18
+ },
19
+ cookie: {
20
+ prefix: "__Secure-auth",
21
+ domain: {
22
+ local: null,
23
+ // host-bound in local
24
+ dev: ".culturefy.dev",
25
+ // adjust to your dev root
26
+ staging: ".culturefy.staging",
27
+ // adjust to your staging root
28
+ prod: ".culturefy.app"
29
+ },
30
+ path: "/",
31
+ sameSite: "None",
32
+ secure: true,
33
+ httpOnly: true,
34
+ maxAgeSec: {
35
+ sid: 15 * 60,
36
+ rt: 30 * 24 * 60 * 60
37
+ } // 15m / 30d
38
+ }
39
+ }
40
+ };
41
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","names":["APP_MAP","appId","name","clientId","domains","local","dev","staging","prod","auth","realm","exclude","cookie","prefix","domain","path","sameSite","secure","httpOnly","maxAgeSec","sid","rt"],"sources":["../../../src/constants/app.ts"],"sourcesContent":["import { IAppId, IDomainMappings } from \"../types/app\";\n\nexport const APP_MAP: Record<IAppId, IDomainMappings> = {\n '3238hxa2': {\n appId: \"3238hxa2\",\n name: \"superadmin\",\n clientId: \"cfy-superadmin-web\",\n domains: {\n local: [\"localhost:5173\", \"127.0.0.1:5173\"],\n dev: [\"accounts.dev.culturefy.app\"],\n staging: [\"accounts.staging.culturefy.app\"],\n prod: [\"accounts.culturefy.app\"]\n },\n\n auth: {\n realm: \"superadmin\",\n clientId: \"cfy-superadmin-web\",\n },\n\n exclude: {\n prod: [] // e.g. add \"app.culturefy.app\" to prevent misrouting\n },\n cookie: {\n prefix: \"__Secure-auth\",\n domain: {\n local: null, // host-bound in local\n dev: \".culturefy.dev\", // adjust to your dev root\n staging: \".culturefy.staging\", // adjust to your staging root\n prod: \".culturefy.app\"\n },\n path: \"/\",\n sameSite: \"None\",\n secure: true,\n httpOnly: true,\n maxAgeSec: { sid: 15 * 60, rt: 30 * 24 * 60 * 60 } // 15m / 30d\n }\n\n },\n\n};\n"],"mappings":"AAEA,OAAO,MAAMA,OAAwC,GAAG;EACtD,UAAU,EAAE;IACRC,KAAK,EAAE,UAAU;IACjBC,IAAI,EAAE,YAAY;IAClBC,QAAQ,EAAE,oBAAoB;IAC9BC,OAAO,EAAE;MACLC,KAAK,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;MAC3CC,GAAG,EAAE,CAAC,4BAA4B,CAAC;MACnCC,OAAO,EAAE,CAAC,gCAAgC,CAAC;MAC3CC,IAAI,EAAE,CAAC,wBAAwB;IACnC,CAAC;IAEDC,IAAI,EAAE;MACFC,KAAK,EAAE,YAAY;MACnBP,QAAQ,EAAE;IACd,CAAC;IAEDQ,OAAO,EAAE;MACLH,IAAI,EAAE,EAAE,CAAC;IACb,CAAC;IACDI,MAAM,EAAE;MACJC,MAAM,EAAE,eAAe;MACvBC,MAAM,EAAE;QACJT,KAAK,EAAE,IAAI;QAAE;QACbC,GAAG,EAAE,gBAAgB;QAAE;QACvBC,OAAO,EAAE,oBAAoB;QAAE;QAC/BC,IAAI,EAAE;MACV,CAAC;MACDO,IAAI,EAAE,GAAG;MACTC,QAAQ,EAAE,MAAM;MAChBC,MAAM,EAAE,IAAI;MACZC,QAAQ,EAAE,IAAI;MACdC,SAAS,EAAE;QAAEC,GAAG,EAAE,EAAE,GAAG,EAAE;QAAEC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;MAAG,CAAC,CAAC;IACvD;EAEJ;AAEF,CAAC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export * from './app';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/constants/index.ts"],"sourcesContent":["export * from './app';"],"mappings":"AAAA,cAAc,OAAO","ignoreList":[]}
@@ -2,4 +2,5 @@ export * from './types';
2
2
  export * from './enums';
3
3
  export * from './utils';
4
4
  export * from './middlewares';
5
+ export * from './constants';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './types';\nexport * from './enums';\nexport * from './utils';\nexport * from './middlewares';"],"mappings":"AAAA,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,eAAe","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["export * from './types';\nexport * from './enums';\nexport * from './utils';\nexport * from './middlewares';\nexport * from './constants';\n"],"mappings":"AAAA,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,SAAS;AACvB,cAAc,eAAe;AAC7B,cAAc,aAAa","ignoreList":[]}
@@ -0,0 +1,197 @@
1
+ import { sendResponse } from "../utils";
2
+ import { APP_MAP } from "../constants";
3
+ import { jwtDecode } from "jwt-decode";
4
+ import { setCookieKV } from "../utils/cookies";
5
+ const apiURL = process.env.REFRESH_SESSION_URL || '';
6
+ const parseCookieHeader = header => {
7
+ const out = {};
8
+ if (!header) return out;
9
+ for (const part of header.split(";")) {
10
+ const [k, ...rest] = part.trim().split("=");
11
+ if (!k) continue;
12
+ out[k] = decodeURIComponent(rest.join("=") || "");
13
+ }
14
+ return out;
15
+ };
16
+ export const verifyMw = async (req, ctx, next) => {
17
+ var _APP_MAP$appId, _p, _ref, _ref$state, _p$cfy_tid, _p$sub, _ref2, _p$cfy_bid, _ref3, _p$email, _p$name, _ref4, _p$resource_access$ex, _p$resource_access, _p$realm_access;
18
+ const appId = req.headers.get("app-id");
19
+ if (!appId || !(APP_MAP != null && (_APP_MAP$appId = APP_MAP[appId]) != null && _APP_MAP$appId.clientId)) {
20
+ return sendResponse(400, {
21
+ status: "bad_request",
22
+ reason: "invalid_app"
23
+ });
24
+ }
25
+ const expectedClientId = APP_MAP[appId].clientId;
26
+
27
+ // cookies
28
+ const cookies = parseCookieHeader(req.headers.get("cookie"));
29
+ const at = cookies[`__Secure-session-v1.${appId}.at`];
30
+ const rt = cookies[`__Secure-session-v1.${appId}.rt`];
31
+ if (!at && !rt) {
32
+ return sendResponse(401, {
33
+ status: "unauthenticated",
34
+ reason: "no_tokens"
35
+ });
36
+ }
37
+
38
+ // decode/verify (lightweight; replace with your verifyJsonWebToken if you have it)
39
+ let p;
40
+ try {
41
+ p = jwtDecode(at);
42
+ } catch (_unused) {
43
+ return sendResponse(401, {
44
+ status: "unauthenticated",
45
+ reason: "invalid_token"
46
+ });
47
+ }
48
+ if (!((_p = p) != null && _p.sid)) {
49
+ return sendResponse(401, {
50
+ status: "unauthenticated",
51
+ reason: "user_not_found"
52
+ });
53
+ }
54
+ const now = Math.floor(Date.now() / 1000);
55
+ // if (typeof p.exp === "number" && p.exp <= now) {
56
+ if (typeof p.exp === "number" && p.exp >= now) {
57
+ // Delegate to refresh helper; it will handle setting cookies/state or returning an error
58
+ return await getNewRefreshToken(req, ctx, appId, expectedClientId, rt, p, next);
59
+ }
60
+
61
+ // audience checks
62
+ const audOk = Array.isArray(p.aud) && p.aud.includes(expectedClientId) || typeof p.aud === "string" && (p.aud === expectedClientId || p.aud === "account") || p.azp === expectedClientId;
63
+ if (!audOk) {
64
+ return sendResponse(403, {
65
+ status: "forbidden",
66
+ reason: "audience_mismatch"
67
+ });
68
+ }
69
+ setCookieKV(ctx, 'ew', 'rre');
70
+
71
+ // pass data downstream
72
+ (_ref$state = (_ref = ctx).state) != null ? _ref$state : _ref.state = {};
73
+ const tenantId = (_p$cfy_tid = p.cfy_tid) != null ? _p$cfy_tid : p.iss ? new URL(p.iss).pathname.split("/").pop() : null;
74
+ ctx.state.auth = {
75
+ appId,
76
+ userId: (_p$sub = p.sub) != null ? _p$sub : null,
77
+ businessId: (_ref2 = (_p$cfy_bid = p.cfy_bid) != null ? _p$cfy_bid : tenantId) != null ? _ref2 : null,
78
+ tenantId,
79
+ email: (_ref3 = (_p$email = p.email) != null ? _p$email : p.preferred_username) != null ? _ref3 : null,
80
+ name: (_p$name = p.name) != null ? _p$name : undefined,
81
+ roles: (_ref4 = (_p$resource_access$ex = (_p$resource_access = p.resource_access) == null || (_p$resource_access = _p$resource_access[expectedClientId]) == null ? void 0 : _p$resource_access.roles) != null ? _p$resource_access$ex : (_p$realm_access = p.realm_access) == null ? void 0 : _p$realm_access.roles) != null ? _ref4 : [],
82
+ exp: p.exp
83
+ };
84
+ return next();
85
+ };
86
+ async function getNewRefreshToken(req, ctx, appId, expectedClientId, rt, p, next) {
87
+ var _APP_MAP$appId$auth;
88
+ // Attempt server-side refresh using RT
89
+ if (!rt) {
90
+ return sendResponse(401, {
91
+ status: "unauthenticated",
92
+ reason: "expired_no_rt"
93
+ });
94
+ }
95
+
96
+ // Resolve realm for refresh
97
+ let realmId = (_APP_MAP$appId$auth = APP_MAP[appId].auth) == null ? void 0 : _APP_MAP$appId$auth.realm;
98
+ if (!realmId) {
99
+ try {
100
+ const issRealm = p != null && p.iss ? new URL(p.iss).pathname.split("/").pop() : undefined;
101
+ realmId = (p == null ? void 0 : p.cfy_tid) || issRealm || undefined;
102
+ } catch (_unused2) {
103
+ realmId = undefined;
104
+ }
105
+ }
106
+ if (!realmId) {
107
+ return sendResponse(401, {
108
+ status: "unauthenticated",
109
+ reason: "cannot_resolve_realm"
110
+ });
111
+ }
112
+ ctx.info("refreshing token payload ----------------------", {
113
+ realmId,
114
+ expectedClientId,
115
+ rt
116
+ });
117
+
118
+ // Call auth service to refresh
119
+ try {
120
+ var _ref5, _ref5$state, _p2$cfy_tid, _p2$sub, _ref6, _p2$cfy_bid, _ref7, _p2$email, _p2$name, _ref8, _p2$resource_access$e, _p2$resource_access, _p2$realm_access;
121
+ const resp = await fetch(apiURL, {
122
+ method: "POST",
123
+ headers: {
124
+ "Content-Type": "application/json"
125
+ },
126
+ body: JSON.stringify({
127
+ realmId,
128
+ clientId: expectedClientId,
129
+ refresh_token: rt
130
+ })
131
+ });
132
+ if (!resp.ok) {
133
+ const text = await resp.text();
134
+ ctx.warn == null || ctx.warn(`refresh call failed: ${resp.status} ${text}`);
135
+ return sendResponse(401, {
136
+ status: "unauthenticated",
137
+ reason: "refresh_failed"
138
+ });
139
+ }
140
+ const payload = await resp.json();
141
+ const data = (payload == null ? void 0 : payload.data) || {};
142
+ const newAT = data.access_token;
143
+ const newRT = data.refresh_token;
144
+ if (!newAT || !newRT) {
145
+ return sendResponse(401, {
146
+ status: "unauthenticated",
147
+ reason: "invalid_refresh_response"
148
+ });
149
+ }
150
+
151
+ // Set refreshed cookies for client session
152
+ setCookieKV(ctx, `__Secure-session-v1.${appId}.at`, newAT);
153
+ setCookieKV(ctx, `__Secure-session-v1.${appId}.rt`, newRT);
154
+
155
+ // Decode new AT and proceed
156
+ let p2;
157
+ try {
158
+ p2 = jwtDecode(newAT);
159
+ } catch (_unused3) {
160
+ return sendResponse(401, {
161
+ status: "unauthenticated",
162
+ reason: "invalid_new_token"
163
+ });
164
+ }
165
+ const audOk2 = Array.isArray(p2.aud) && p2.aud.includes(expectedClientId) || typeof p2.aud === "string" && (p2.aud === expectedClientId || p2.aud === "account") || p2.azp === expectedClientId;
166
+ if (!audOk2) {
167
+ return sendResponse(403, {
168
+ status: "forbidden",
169
+ reason: "audience_mismatch"
170
+ });
171
+ }
172
+
173
+ // Update downstream auth state with refreshed token
174
+ (_ref5$state = (_ref5 = ctx).state) != null ? _ref5$state : _ref5.state = {};
175
+ const tenantId2 = (_p2$cfy_tid = p2.cfy_tid) != null ? _p2$cfy_tid : p2.iss ? new URL(p2.iss).pathname.split("/").pop() : null;
176
+ ctx.state.auth = {
177
+ appId,
178
+ userId: (_p2$sub = p2.sub) != null ? _p2$sub : null,
179
+ businessId: (_ref6 = (_p2$cfy_bid = p2.cfy_bid) != null ? _p2$cfy_bid : tenantId2) != null ? _ref6 : null,
180
+ tenantId: tenantId2,
181
+ email: (_ref7 = (_p2$email = p2.email) != null ? _p2$email : p2.preferred_username) != null ? _ref7 : null,
182
+ name: (_p2$name = p2.name) != null ? _p2$name : undefined,
183
+ roles: (_ref8 = (_p2$resource_access$e = (_p2$resource_access = p2.resource_access) == null || (_p2$resource_access = _p2$resource_access[expectedClientId]) == null ? void 0 : _p2$resource_access.roles) != null ? _p2$resource_access$e : (_p2$realm_access = p2.realm_access) == null ? void 0 : _p2$realm_access.roles) != null ? _ref8 : [],
184
+ exp: p2.exp
185
+ };
186
+
187
+ // Continue pipeline after refresh
188
+ return next();
189
+ } catch (e) {
190
+ ctx.error == null || ctx.error("refresh exception", e);
191
+ return sendResponse(401, {
192
+ status: "unauthenticated",
193
+ reason: "refresh_exception"
194
+ });
195
+ }
196
+ }
197
+ //# sourceMappingURL=verify-middleware.js.map