@culturefy/shared 1.0.33 → 1.0.34

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.
@@ -1,483 +1,34 @@
1
1
  import { AzureSecretKeysEnum } from "../enums";
2
- import { UserService } from "../service/user.service";
3
- import { KeycloakAdminService } from "../service/keycloak.service";
4
- import { getAzureVaultSecretByKey, parseCookies, verifyJsonWebToken } from "../utils";
5
- export async function tokenValidation(request, domain, context) {
2
+ import { getAzureVaultSecretByKey } from "../utils";
3
+ export async function tokenValidation(request, context) {
6
4
  try {
7
- let cookies = parseCookies(request, context);
8
- let accessToken = cookies["culturefy-auth-token"];
9
- let refreshToken = cookies["culturefy-refresh-token"];
10
- let expiresIn, refreshExpiresIn;
11
- if (!accessToken) return {
12
- status: false,
13
- message: "Access token is required"
14
- };
15
- const keycloakService = await initializeKeycloakService(context);
16
- const tokenValidation = await validateToken(accessToken, context);
17
- if (!tokenValidation.success) {
18
- if (tokenValidation.expired) {
19
- const {
20
- data: _data
21
- } = tokenValidation;
22
- if (!_data) return {
23
- status: false,
24
- message: "Invalid access token."
25
- };
26
- let {
27
- userId: _userId,
28
- clientId: _clientId,
29
- realm: _realm,
30
- email: _email
31
- } = _data;
32
- if (!_clientId) return {
33
- status: false,
34
- message: "Invalid access token provided"
35
- };
36
- if (!_userId) return {
37
- status: false,
38
- message: "Invalid access token provided"
39
- };
40
- if (!_realm) return {
41
- status: false,
42
- message: "Invalid access token provided"
43
- };
44
- context.log("Refreshing token for user:", JSON.stringify({
45
- userId: _userId,
46
- clientId: _clientId,
47
- realm: _realm,
48
- email: _email
49
- }));
50
- const refreshTokenResponse = await handleTokenRefresh(keycloakService, refreshToken, _userId, _clientId, _realm, _email, domain, context);
51
- if (!refreshTokenResponse.success) return {
52
- status: false,
53
- message: refreshTokenResponse.message
54
- };
55
- const {
56
- data: refreshTokenData
57
- } = refreshTokenResponse;
58
- if (!refreshTokenData) return {
59
- status: false,
60
- message: "Invalid refresh token."
61
- };
62
- context.log("Refreshed token for user:", JSON.stringify({
63
- userId: _userId,
64
- clientId: _clientId,
65
- realm: _realm,
66
- email: _email
67
- }));
68
- accessToken = refreshTokenData.access_token;
69
- refreshToken = refreshTokenData.refresh_token;
70
- expiresIn = refreshTokenData.expires_in;
71
- refreshExpiresIn = refreshTokenData.refresh_expires_in;
72
- } else {
73
- return {
74
- status: false,
75
- message: tokenValidation.message
76
- };
77
- }
78
- }
79
- const {
80
- data
81
- } = tokenValidation;
82
- if (!data) return {
83
- status: false,
84
- message: "Invalid access token."
85
- };
86
- let {
87
- userId,
88
- clientId,
89
- realm,
90
- email
91
- } = data;
92
- if (!clientId) return {
93
- status: false,
94
- message: "Invalid access token provided"
95
- };
96
- if (!userId) return {
97
- status: false,
98
- message: "Invalid access token provided"
99
- };
100
- if (!realm) return {
101
- status: false,
102
- message: "Invalid access token provided"
103
- };
104
- if (!email) return {
105
- status: false,
106
- message: "Invalid access token provided"
107
- };
108
- context.log("Validating user:", JSON.stringify({
109
- userId,
110
- clientId,
111
- realm,
112
- email
113
- }));
114
- let verifyFromDb;
115
- let userInfo;
116
- if (domain === "accounts.culturefy.app") {
117
- const _introspectionValid = await validateTokenIntrospection(keycloakService, accessToken, realm, clientId, domain, context);
118
- if (!_introspectionValid) return {
119
- status: false,
120
- message: "Token introspection failed"
121
- };
122
- context.log("Token introspection successful");
123
- realm = "superadmin";
124
- clientId = "cfy-superadmin-web";
125
- userInfo = await keycloakService.getUserByToken(realm, accessToken);
126
- context.log("User info-1:", JSON.stringify(userInfo));
127
- if (!userInfo.email) return {
128
- status: false,
129
- message: "User email not found"
130
- };
131
- if (userInfo.email !== email) return {
132
- status: false,
133
- message: "User email does not match"
134
- };
135
- email = userInfo.email;
136
- verifyFromDb = await validateUserByEmail(email, context);
137
- if (!verifyFromDb.success) return {
138
- status: false,
139
- message: verifyFromDb.message
140
- };
141
- } else {
142
- clientId = "cfy-web";
143
- verifyFromDb = await validateUserByRealm(realm, email, context);
144
- }
145
- if (!verifyFromDb.success) return {
146
- status: false,
147
- message: verifyFromDb.message
148
- };
149
- const user = verifyFromDb.user;
150
- if (!user) return {
151
- status: false,
152
- message: "User not found."
153
- };
154
- context.log("User:", JSON.stringify(user));
155
- const introspectionValid = await validateTokenIntrospection(keycloakService, accessToken, realm, clientId, domain, context);
156
- if (!introspectionValid) return {
157
- status: false,
158
- message: "Token introspection failed"
159
- };
160
- context.log("Token introspection successful");
161
- if (domain === "accounts.culturefy.app") {
162
- realm = "superadmin";
163
- clientId = "cfy-superadmin-web";
164
- } else {
165
- if (!user.businessId) return {
5
+ const url = await getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || "", AzureSecretKeysEnum.AUTH_SERVICE_AUTHENTICATION_URL);
6
+ if (!url) {
7
+ return {
166
8
  status: false,
167
- message: "User not found"
9
+ message: "Auth service authenticaion API url not found"
168
10
  };
169
- realm = user.businessId.toString();
170
- clientId = "cfy-web";
171
11
  }
172
- if (!userInfo) {
173
- userInfo = await keycloakService.getUserByToken(realm, accessToken);
174
- context.log("User info-2:", JSON.stringify(userInfo));
175
- }
176
- if (!userInfo) return {
177
- status: false,
178
- message: "User info not found"
179
- };
180
- let updatedCookies = {
181
- access_token: accessToken,
182
- refresh_token: refreshToken
183
- };
184
- if (expiresIn) updatedCookies.expires_in = expiresIn;
185
- if (refreshExpiresIn) updatedCookies.refresh_expires_in = refreshExpiresIn;
12
+ context.log(`Auth service authentication API url: ${url}`);
13
+ const response = await fetch(url, {
14
+ method: "GET",
15
+ headers: request.headers
16
+ });
17
+ const data = await response.json();
186
18
  return {
187
19
  status: true,
188
- message: "Token is valid",
20
+ message: "Token validation successful",
189
21
  data: {
190
- cookies: updatedCookies,
191
- user: user
22
+ cookies: data.cookies,
23
+ user: data.user
192
24
  }
193
25
  };
194
26
  } catch (error) {
195
27
  context.error("Culturefy token validation error:", error);
196
28
  return {
197
29
  status: false,
198
- message: "Internal server error during culturefy token validation"
199
- };
200
- }
201
- }
202
- async function initializeKeycloakService(context) {
203
- const [keycloakBaseUrl, keycloakAdminClientId, keycloakAdminClientSecret] = await Promise.all([getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || "", AzureSecretKeysEnum.KEYCLOAK_BASE_URL), getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || "", AzureSecretKeysEnum.KEYCLOAK_ADMIN_CLIENT_ID), getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || "", AzureSecretKeysEnum.KEYCLOAK_ADMIN_CLIENT_SECRET)]);
204
- return new KeycloakAdminService(context, {
205
- baseUrl: keycloakBaseUrl,
206
- adminClientId: keycloakAdminClientId,
207
- adminClientSecret: keycloakAdminClientSecret
208
- });
209
- }
210
- async function validateToken(accessToken, context) {
211
- const currentTime = Math.floor(Date.now() / 1000);
212
- const decoded = verifyJsonWebToken(accessToken);
213
- if (!decoded) return {
214
- success: false,
215
- message: "Invalid access token format"
216
- };
217
- let {
218
- iat,
219
- exp,
220
- sub: userId,
221
- azp: clientId,
222
- iss,
223
- email
224
- } = decoded;
225
- if (!userId || !clientId || !iss) return {
226
- success: false,
227
- message: "Access token missing required claims (sub or azp or iss)"
228
- };
229
- context.log("Access token claims:", JSON.stringify(decoded));
230
- let realm = iss.split("/")[iss.split("/").length - 1];
231
- if (!realm) return {
232
- success: false,
233
- message: "Access token missing required claims (iss)"
234
- };
235
- if (exp && exp < currentTime) return {
236
- success: false,
237
- message: "Access token expired and refresh token not provided",
238
- expired: true,
239
- data: {
240
- userId,
241
- clientId,
242
- realm,
243
- email
244
- }
245
- };
246
- if (iat && iat > currentTime) return {
247
- success: false,
248
- message: "Invalid token issuance time"
249
- };
250
- return {
251
- success: true,
252
- message: "Token is valid",
253
- data: {
254
- userId,
255
- clientId,
256
- realm,
257
- email
258
- }
259
- };
260
- }
261
- async function handleTokenRefresh(keycloakService, refreshToken, userId, clientId, realm, email, domain, context) {
262
- const currentTime = Math.floor(Date.now() / 1000);
263
- if (!clientId) return {
264
- success: false,
265
- message: "Client ID is missing"
266
- };
267
- if (!userId) return {
268
- success: false,
269
- message: "User ID is missing"
270
- };
271
- if (!realm) return {
272
- success: false,
273
- message: "Realm is missing"
274
- };
275
- if (!refreshToken) return {
276
- success: false,
277
- message: "Refresh token is missing"
278
- };
279
- if (!email) return {
280
- success: false,
281
- message: "Email is missing"
282
- };
283
- if (!domain) return {
284
- success: false,
285
- message: "Domain is missing"
286
- };
287
- context.info("values:", {
288
- clientId,
289
- userId,
290
- realm,
291
- email,
292
- domain
293
- });
294
- const refreshTokenDecoded = verifyJsonWebToken(refreshToken);
295
- if (!refreshTokenDecoded) return {
296
- success: false,
297
- message: "Invalid refresh token format"
298
- };
299
- let {
300
- iss: refreshIss
301
- } = refreshTokenDecoded;
302
- refreshIss = refreshIss.split("/")[refreshIss.split("/").length - 1];
303
- const {
304
- iat: refreshIat,
305
- exp: refreshExp,
306
- sub: refreshUserId,
307
- azp: refreshClientId,
308
- email: refreshEmail
309
- } = refreshTokenDecoded;
310
- context.info("refreshTokenDecoded:", JSON.stringify({
311
- refreshUserId,
312
- refreshClientId,
313
- refreshIss,
314
- refreshEmail
315
- }));
316
- if (!refreshUserId || !refreshClientId || !refreshIss) return {
317
- success: false,
318
- message: "Refresh token missing required claims (sub or azp or iss)"
319
- };
320
- if (refreshExp && refreshExp < currentTime) return {
321
- success: false,
322
- message: "Refresh token has expired"
323
- };
324
- if (refreshIat && refreshIat > currentTime) return {
325
- success: false,
326
- message: "Invalid refresh token issuance time"
327
- };
328
- if (refreshUserId !== userId || refreshClientId !== clientId || refreshIss !== realm || refreshEmail !== email) return {
329
- success: false,
330
- message: "Refresh token does not match access token user"
331
- };
332
- if (domain === "accounts.culturefy.app") {
333
- realm = "superadmin";
334
- clientId = "cfy-superadmin-web";
335
- } else {
336
- realm = realm;
337
- clientId = "cfy-web";
338
- }
339
- const newToken = await keycloakService.refreshToken(realm, clientId, refreshToken);
340
- if (!newToken) return {
341
- success: false,
342
- message: "Failed to refresh access token"
343
- };
344
- const newTokenDecoded = verifyJsonWebToken(newToken.access_token);
345
- if (!newTokenDecoded) return {
346
- success: false,
347
- message: "Invalid new token format"
348
- };
349
- const {
350
- iat: newIat,
351
- exp: newExp,
352
- sub: newUserId,
353
- azp: newClientId,
354
- iss: newIss,
355
- email: newEmail
356
- } = newTokenDecoded;
357
- if (!newUserId || !newClientId || !newIss || !newEmail) return {
358
- success: false,
359
- message: "New token missing required claims (sub or azp or iss or email)"
360
- };
361
- if (newExp && newExp < currentTime) return {
362
- success: false,
363
- message: "New token has expired"
364
- };
365
- if (newIat && newIat > currentTime) return {
366
- success: false,
367
- message: "Invalid new token issuance time"
368
- };
369
- context.info("Token refreshed successfully for user:", userId);
370
- return {
371
- success: true,
372
- message: "Token refreshed successfully",
373
- data: {
374
- access_token: newToken.access_token,
375
- expires_in: newToken.expires_in,
376
- refresh_token: newToken.refresh_token,
377
- refresh_expires_in: newToken.refresh_expires_in
378
- }
379
- };
380
- }
381
- async function validateUserByRealm(realm, email, context) {
382
- try {
383
- const authDbUrl = await getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || "", AzureSecretKeysEnum.DB_CONNECTING_STRING_USER);
384
- const userService = new UserService(context, authDbUrl);
385
- let user = null;
386
- context.log("Getting user by realm:", realm);
387
- try {
388
- // user = await userService.getUserByBusinessId(realm, email);
389
- user = '';
390
- } catch (err) {
391
- context.error(`Failed to get user by realm:`, err);
392
- return {
393
- success: false,
394
- message: "User not found.."
395
- };
396
- }
397
- context.log("User:", JSON.stringify(user));
398
- if (!user) return {
399
- success: false,
400
- message: "User not found..."
401
- };
402
- await userService.disconnect();
403
- return {
404
- success: true,
405
- message: "User validation successful",
406
- user
407
- };
408
- } catch (error) {
409
- context.error("User validation error:", error);
410
- return {
411
- success: false,
412
- message: "Error validating user information"
413
- };
414
- }
415
- }
416
- async function validateUserByEmail(email, context) {
417
- try {
418
- const authDbUrl = await getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || "", AzureSecretKeysEnum.DB_CONNECTING_STRING_USER);
419
- const userService = new UserService(context, authDbUrl);
420
- let user = null;
421
- context.log("Getting user by email:", email);
422
- try {
423
- // user = await userService.getUserByEmail(email);
424
- user = '';
425
- } catch (err) {
426
- context.error(`Failed to get user by email:`, err);
427
- return {
428
- success: false,
429
- message: "User not found.."
430
- };
431
- }
432
- context.log("User:", JSON.stringify(user));
433
- if (!user) return {
434
- success: false,
435
- message: "User not found..."
436
- };
437
- await userService.disconnect();
438
- return {
439
- success: true,
440
- message: "User validation successful",
441
- user
442
- };
443
- } catch (error) {
444
- context.error("User validation error:", error);
445
- return {
446
- success: false,
447
- message: "Error validating user information"
30
+ message: error.message || "Internal server error during culturefy token validation"
448
31
  };
449
32
  }
450
33
  }
451
- async function validateTokenIntrospection(keycloakService, token, realm, clientId, domain, context) {
452
- try {
453
- if (!realm) return false;
454
- if (!clientId) return false;
455
- if (!token) return false;
456
- if (domain === "accounts.culturefy.app") {
457
- realm = "superadmin";
458
- clientId = "cfy-superadmin-web";
459
- } else {
460
- realm = realm;
461
- clientId = "cfy-web";
462
- }
463
- context.info("Validating token with Keycloak introspection");
464
- const introspection = await keycloakService.introspectToken(realm, clientId, token);
465
- if (!introspection.active) {
466
- context.warn("Token introspection returned inactive token");
467
- return false;
468
- }
469
- context.info("Token introspection successful - token is active");
470
- return true;
471
- } catch (error) {
472
- var _error$message, _error$message2, _error$message3;
473
- context.error("Token introspection error:", error);
474
- if ((_error$message = error.message) != null && _error$message.includes('Client not allowed')) {
475
- context.warn("Admin-cli client does not have introspection permissions - this is expected");
476
- return true;
477
- }
478
- if ((_error$message2 = error.message) != null && _error$message2.includes('Invalid token')) return false;
479
- if ((_error$message3 = error.message) != null && _error$message3.includes('Token is not active')) return false;
480
- return false;
481
- }
482
- }
483
34
  //# sourceMappingURL=token-validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-validation.js","names":["AzureSecretKeysEnum","UserService","KeycloakAdminService","getAzureVaultSecretByKey","parseCookies","verifyJsonWebToken","tokenValidation","request","domain","context","cookies","accessToken","refreshToken","expiresIn","refreshExpiresIn","status","message","keycloakService","initializeKeycloakService","validateToken","success","expired","data","userId","clientId","realm","email","log","JSON","stringify","refreshTokenResponse","handleTokenRefresh","refreshTokenData","access_token","refresh_token","expires_in","refresh_expires_in","verifyFromDb","userInfo","introspectionValid","validateTokenIntrospection","getUserByToken","validateUserByEmail","validateUserByRealm","user","businessId","toString","updatedCookies","error","keycloakBaseUrl","keycloakAdminClientId","keycloakAdminClientSecret","Promise","all","process","env","AZURE_KEY_VAULT_NAME","KEYCLOAK_BASE_URL","KEYCLOAK_ADMIN_CLIENT_ID","KEYCLOAK_ADMIN_CLIENT_SECRET","baseUrl","adminClientId","adminClientSecret","currentTime","Math","floor","Date","now","decoded","iat","exp","sub","azp","iss","split","length","info","refreshTokenDecoded","refreshIss","refreshIat","refreshExp","refreshUserId","refreshClientId","refreshEmail","newToken","newTokenDecoded","newIat","newExp","newUserId","newClientId","newIss","newEmail","authDbUrl","DB_CONNECTING_STRING_USER","userService","err","disconnect","token","introspection","introspectToken","active","warn","_error$message","_error$message2","_error$message3","includes"],"sources":["../../../src/middlewares/token-validation.ts"],"sourcesContent":["\nimport IUser from \"../models/user.model\";\nimport { AzureSecretKeysEnum } from \"../enums\";\nimport { UserService } from \"../service/user.service\";\nimport { HttpRequest, InvocationContext } from \"@azure/functions\";\nimport { KeycloakAdminService } from \"../service/keycloak.service\";\nimport { getAzureVaultSecretByKey, parseCookies, verifyJsonWebToken } from \"../utils\";\n\ninterface TokenValidationResult {\n status: boolean;\n message: string;\n data?: {\n cookies: {\n access_token: string;\n refresh_token: string;\n expires_in?: number;\n refresh_expires_in?: number;\n };\n user: IUser;\n };\n}\n\ninterface TokenClaims {\n iat?: number;\n exp?: number;\n sub: string;\n azp: string;\n iss: string;\n email: string;\n}\n\nexport async function tokenValidation(request: HttpRequest, domain: string, context: InvocationContext): Promise<TokenValidationResult> {\n try {\n let cookies = parseCookies(request, context);\n let accessToken = cookies[\"culturefy-auth-token\"];\n let refreshToken = cookies[\"culturefy-refresh-token\"];\n\n let expiresIn, refreshExpiresIn;\n\n if (!accessToken) return { status: false, message: \"Access token is required\" };\n\n const keycloakService = await initializeKeycloakService(context);\n\n const tokenValidation = await validateToken(accessToken, context);\n\n if (!tokenValidation.success) {\n if (tokenValidation.expired) {\n const { data } = tokenValidation;\n if (!data) return { status: false, message: \"Invalid access token.\" };\n\n let { userId, clientId, realm, email } = data;\n\n if (!clientId) return { status: false, message: \"Invalid access token provided\" };\n if (!userId) return { status: false, message: \"Invalid access token provided\" };\n if (!realm) return { status: false, message: \"Invalid access token provided\" };\n\n context.log(\"Refreshing token for user:\", JSON.stringify({ userId, clientId, realm, email }));\n\n const refreshTokenResponse = await handleTokenRefresh(keycloakService, refreshToken, userId, clientId, realm, email, domain, context);\n if (!refreshTokenResponse.success) return { status: false, message: refreshTokenResponse.message };\n\n const { data: refreshTokenData } = refreshTokenResponse;\n if (!refreshTokenData) return { status: false, message: \"Invalid refresh token.\" };\n \n context.log(\"Refreshed token for user:\", JSON.stringify({ userId, clientId, realm, email }));\n\n accessToken = refreshTokenData.access_token;\n refreshToken = refreshTokenData.refresh_token;\n expiresIn = refreshTokenData.expires_in;\n refreshExpiresIn = refreshTokenData.refresh_expires_in;\n\n } else {\n return { status: false, message: tokenValidation.message };\n }\n }\n\n const { data } = tokenValidation;\n\n if (!data) return { status: false, message: \"Invalid access token.\" };\n\n let { userId, clientId, realm, email } = data;\n\n if (!clientId) return { status: false, message: \"Invalid access token provided\" };\n if (!userId) return { status: false, message: \"Invalid access token provided\" };\n if (!realm) return { status: false, message: \"Invalid access token provided\" };\n if (!email) return { status: false, message: \"Invalid access token provided\" };\n\n context.log(\"Validating user:\", JSON.stringify({ userId, clientId, realm, email }));\n\n let verifyFromDb;\n let userInfo;\n\n if(domain === \"accounts.culturefy.app\") {\n const introspectionValid = await validateTokenIntrospection(\n keycloakService,\n accessToken,\n realm,\n clientId,\n domain,\n context\n );\n \n if (!introspectionValid) return { status: false, message: \"Token introspection failed\" };\n context.log(\"Token introspection successful\");\n \n realm = \"superadmin\";\n clientId = \"cfy-superadmin-web\";\n \n userInfo = await keycloakService.getUserByToken(realm, accessToken);\n context.log(\"User info-1:\", JSON.stringify(userInfo));\n\n if(!userInfo.email) return { status: false, message: \"User email not found\" };\n if(userInfo.email !== email) return { status: false, message: \"User email does not match\" };\n email = userInfo.email;\n verifyFromDb = await validateUserByEmail(email, context);\n if (!verifyFromDb.success) return { status: false, message: verifyFromDb.message };\n } else {\n clientId = \"cfy-web\";\n verifyFromDb = await validateUserByRealm(realm, email, context);\n }\n\n if (!verifyFromDb.success) return { status: false, message: verifyFromDb.message };\n\n const user = verifyFromDb.user;\n\n if (!user) return { status: false, message: \"User not found.\" };\n context.log(\"User:\", JSON.stringify(user));\n\n const introspectionValid = await validateTokenIntrospection(\n keycloakService,\n accessToken,\n realm,\n clientId,\n domain,\n context\n );\n\n if (!introspectionValid) return { status: false, message: \"Token introspection failed\" };\n context.log(\"Token introspection successful\");\n\n if (domain === \"accounts.culturefy.app\") {\n realm = \"superadmin\";\n clientId = \"cfy-superadmin-web\";\n } else {\n if(!user.businessId) return { status: false, message: \"User not found\" };\n realm = user.businessId.toString();\n clientId = \"cfy-web\";\n }\n\n if(!userInfo) {\n userInfo = await keycloakService.getUserByToken(realm, accessToken);\n context.log(\"User info-2:\", JSON.stringify(userInfo));\n }\n\n if(!userInfo) return { status: false, message: \"User info not found\" };\n\n let updatedCookies: {\n access_token: string;\n refresh_token: string;\n expires_in?: number;\n refresh_expires_in?: number;\n } = {\n access_token: accessToken,\n refresh_token: refreshToken,\n };\n\n if(expiresIn) updatedCookies.expires_in = expiresIn;\n if(refreshExpiresIn) updatedCookies.refresh_expires_in = refreshExpiresIn;\n\n return {\n status: true,\n message: \"Token is valid\",\n data: {\n cookies: updatedCookies,\n user: user\n }\n };\n\n } catch (error) {\n context.error(\"Culturefy token validation error:\", error);\n return { status: false, message: \"Internal server error during culturefy token validation\" };\n }\n}\n\nasync function initializeKeycloakService(context: InvocationContext): Promise<KeycloakAdminService> {\n const [keycloakBaseUrl, keycloakAdminClientId, keycloakAdminClientSecret] = await Promise.all([\n getAzureVaultSecretByKey(\n context,\n process.env.AZURE_KEY_VAULT_NAME || \"\",\n AzureSecretKeysEnum.KEYCLOAK_BASE_URL\n ),\n getAzureVaultSecretByKey(\n context,\n process.env.AZURE_KEY_VAULT_NAME || \"\",\n AzureSecretKeysEnum.KEYCLOAK_ADMIN_CLIENT_ID\n ),\n getAzureVaultSecretByKey(\n context,\n process.env.AZURE_KEY_VAULT_NAME || \"\",\n AzureSecretKeysEnum.KEYCLOAK_ADMIN_CLIENT_SECRET\n )\n ]);\n\n return new KeycloakAdminService(context, {\n baseUrl: keycloakBaseUrl as string,\n adminClientId: keycloakAdminClientId as string,\n adminClientSecret: keycloakAdminClientSecret as string\n });\n}\n\nasync function validateToken(\n accessToken: string,\n context: InvocationContext\n): Promise<{\n success: boolean;\n message: string;\n expired?: boolean;\n data?: {\n userId: string;\n clientId: string;\n realm: string;\n email: string;\n };\n}> {\n const currentTime = Math.floor(Date.now() / 1000);\n\n const decoded = verifyJsonWebToken(accessToken);\n\n if (!decoded) return { success: false, message: \"Invalid access token format\" };\n\n let { iat, exp, sub: userId, azp: clientId, iss, email } = decoded as TokenClaims;\n \n if (!userId || !clientId || !iss) return { success: false, message: \"Access token missing required claims (sub or azp or iss)\" };\n context.log(\"Access token claims:\", JSON.stringify(decoded));\n \n let realm = iss.split(\"/\")[iss.split(\"/\").length - 1];\n if(!realm) return { success: false, message: \"Access token missing required claims (iss)\" };\n\n if (exp && exp < currentTime) return { success: false, message: \"Access token expired and refresh token not provided\", expired: true, data: { userId, clientId, realm, email } };\n \n if (iat && iat > currentTime) return { success: false, message: \"Invalid token issuance time\" };\n\n return {\n success: true,\n message: \"Token is valid\",\n data: { userId, clientId, realm, email }\n };\n}\n\nasync function handleTokenRefresh(\n keycloakService: KeycloakAdminService,\n refreshToken: string,\n userId: string,\n clientId: string,\n realm: string,\n email: string,\n domain: string,\n context: InvocationContext\n): Promise<{\n success: boolean;\n message: string;\n data?: {\n access_token: string;\n expires_in: number;\n refresh_token: string;\n refresh_expires_in: number;\n };\n}> {\n const currentTime = Math.floor(Date.now() / 1000);\n\n if(!clientId) return { success: false, message: \"Client ID is missing\" };\n if(!userId) return { success: false, message: \"User ID is missing\" };\n if(!realm) return { success: false, message: \"Realm is missing\" };\n if(!refreshToken) return { success: false, message: \"Refresh token is missing\" };\n if(!email) return { success: false, message: \"Email is missing\" };\n if(!domain) return { success: false, message: \"Domain is missing\" };\n\n context.info(\"values:\", {clientId, userId, realm, email, domain});\n\n const refreshTokenDecoded = verifyJsonWebToken(refreshToken);\n if (!refreshTokenDecoded) return { success: false, message: \"Invalid refresh token format\" };\n\n let { iss: refreshIss } = refreshTokenDecoded as TokenClaims;\n refreshIss = refreshIss.split(\"/\")[refreshIss.split(\"/\").length - 1];\n\n const { iat: refreshIat, exp: refreshExp, sub: refreshUserId, azp: refreshClientId, email: refreshEmail } = refreshTokenDecoded as TokenClaims;\n\n context.info(\"refreshTokenDecoded:\", JSON.stringify({refreshUserId, refreshClientId, refreshIss, refreshEmail}));\n\n if (!refreshUserId || !refreshClientId || !refreshIss) return { success: false, message: \"Refresh token missing required claims (sub or azp or iss)\" };\n\n if (refreshExp && refreshExp < currentTime) return { success: false, message: \"Refresh token has expired\" };\n\n if (refreshIat && refreshIat > currentTime) return { success: false, message: \"Invalid refresh token issuance time\" };\n\n if (refreshUserId !== userId || refreshClientId !== clientId || refreshIss !== realm || refreshEmail !== email) return { success: false, message: \"Refresh token does not match access token user\" };\n\n if(domain === \"accounts.culturefy.app\") {\n realm = \"superadmin\";\n clientId = \"cfy-superadmin-web\";\n } else {\n realm = realm;\n clientId = \"cfy-web\";\n }\n\n const newToken = await keycloakService.refreshToken(realm, clientId, refreshToken);\n if (!newToken) return { success: false, message: \"Failed to refresh access token\" };\n\n const newTokenDecoded = verifyJsonWebToken(newToken.access_token);\n if (!newTokenDecoded) return { success: false, message: \"Invalid new token format\" };\n\n const { iat: newIat, exp: newExp, sub: newUserId, azp: newClientId, iss: newIss, email: newEmail } = newTokenDecoded as TokenClaims;\n\n if (!newUserId || !newClientId || !newIss || !newEmail) return { success: false, message: \"New token missing required claims (sub or azp or iss or email)\" };\n\n if (newExp && newExp < currentTime) return { success: false, message: \"New token has expired\" };\n\n if (newIat && newIat > currentTime) return { success: false, message: \"Invalid new token issuance time\" };\n\n context.info(\"Token refreshed successfully for user:\", userId);\n\n return {\n success: true,\n message: \"Token refreshed successfully\",\n data: {\n access_token: newToken.access_token, expires_in: newToken.expires_in,\n refresh_token: newToken.refresh_token, refresh_expires_in: newToken.refresh_expires_in\n }\n };\n}\n\nasync function validateUserByRealm(\n realm: string,\n email: string,\n context: InvocationContext\n): Promise<{\n success: boolean;\n message: string;\n user?: any;\n}> {\n try {\n const authDbUrl = await getAzureVaultSecretByKey(\n context,\n process.env.AZURE_KEY_VAULT_NAME || \"\",\n AzureSecretKeysEnum.DB_CONNECTING_STRING_USER\n );\n\n const userService = new UserService(context, authDbUrl);\n\n let user = null;\n context.log(\"Getting user by realm:\", realm);\n try {\n // user = await userService.getUserByBusinessId(realm, email);\n user = '';\n } catch (err: any) {\n context.error(`Failed to get user by realm:`, err);\n return { success: false, message: \"User not found..\" };\n }\n context.log(\"User:\", JSON.stringify(user));\n\n if (!user) return { success: false, message: \"User not found...\" };\n\n await userService.disconnect();\n\n return { success: true, message: \"User validation successful\", user };\n\n } catch (error) {\n context.error(\"User validation error:\", error);\n return { success: false, message: \"Error validating user information\" };\n }\n}\n\nasync function validateUserByEmail(\n email: string,\n context: InvocationContext\n): Promise<{\n success: boolean;\n message: string;\n user?: any;\n}> {\n try {\n const authDbUrl = await getAzureVaultSecretByKey(\n context,\n process.env.AZURE_KEY_VAULT_NAME || \"\",\n AzureSecretKeysEnum.DB_CONNECTING_STRING_USER\n );\n\n const userService = new UserService(context, authDbUrl);\n\n let user = null;\n context.log(\"Getting user by email:\", email);\n try {\n // user = await userService.getUserByEmail(email);\n user = '';\n } catch (err: any) {\n context.error(`Failed to get user by email:`, err);\n return { success: false, message: \"User not found..\" };\n }\n context.log(\"User:\", JSON.stringify(user));\n\n if (!user) return { success: false, message: \"User not found...\" };\n\n await userService.disconnect();\n\n return { success: true, message: \"User validation successful\", user };\n\n } catch (error) {\n context.error(\"User validation error:\", error);\n return { success: false, message: \"Error validating user information\" };\n }\n}\n\nasync function validateTokenIntrospection(\n keycloakService: KeycloakAdminService,\n token: string,\n realm: string,\n clientId: string,\n domain: string,\n context: InvocationContext\n): Promise<boolean> {\n try {\n if(!realm) return false;\n if(!clientId) return false;\n if(!token) return false;\n \n if (domain === \"accounts.culturefy.app\") {\n realm = \"superadmin\";\n clientId = \"cfy-superadmin-web\";\n } else {\n realm = realm;\n clientId = \"cfy-web\";\n }\n\n context.info(\"Validating token with Keycloak introspection\");\n const introspection = await keycloakService.introspectToken(realm, clientId, token);\n\n if (!introspection.active) {\n context.warn(\"Token introspection returned inactive token\");\n return false;\n }\n\n context.info(\"Token introspection successful - token is active\");\n return true;\n } catch (error: any) {\n context.error(\"Token introspection error:\", error);\n\n if (error.message?.includes('Client not allowed')) {\n context.warn(\"Admin-cli client does not have introspection permissions - this is expected\");\n return true;\n }\n\n if (error.message?.includes('Invalid token')) return false;\n\n if (error.message?.includes('Token is not active')) return false;\n\n return false;\n }\n}"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"token-validation.js","names":["AzureSecretKeysEnum","getAzureVaultSecretByKey","tokenValidation","request","context","url","process","env","AZURE_KEY_VAULT_NAME","AUTH_SERVICE_AUTHENTICATION_URL","status","message","log","response","fetch","method","headers","data","json","cookies","user","error"],"sources":["../../../src/middlewares/token-validation.ts"],"sourcesContent":["\nimport IUser from \"../models/user.model\";\nimport { AzureSecretKeysEnum } from \"../enums\";\nimport { getAzureVaultSecretByKey } from \"../utils\";\nimport { HttpRequest, InvocationContext } from \"@azure/functions\";\n\ninterface TokenValidationResult {\n status: boolean;\n message: string;\n data?: {\n cookies: {\n access_token: string;\n refresh_token: string;\n expires_in?: number;\n refresh_expires_in?: number;\n };\n user: IUser;\n };\n}\n\nexport async function tokenValidation(request: HttpRequest, context: InvocationContext): Promise<TokenValidationResult> {\n try {\n const url = await getAzureVaultSecretByKey(context, process.env.AZURE_KEY_VAULT_NAME || \"\", AzureSecretKeysEnum.AUTH_SERVICE_AUTHENTICATION_URL);\n if(!url) {\n return { status: false, message: \"Auth service authenticaion API url not found\" };\n }\n context.log(`Auth service authentication API url: ${url}`);\n \n const response = await fetch(url, {\n method: \"GET\",\n headers: request.headers\n });\n const data = await response.json();\n return { status: true, message: \"Token validation successful\", data: {\n cookies: data.cookies,\n user: data.user\n } };\n\n } catch (error:any) {\n context.error(\"Culturefy token validation error:\", error);\n return { status: false, message: error.message || \"Internal server error during culturefy token validation\" };\n }\n}"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,UAAU;AAC9C,SAASC,wBAAwB,QAAQ,UAAU;AAiBnD,OAAO,eAAeC,eAAeA,CAACC,OAAoB,EAAEC,OAA0B,EAAkC;EACpH,IAAI;IACA,MAAMC,GAAG,GAAG,MAAMJ,wBAAwB,CAACG,OAAO,EAAEE,OAAO,CAACC,GAAG,CAACC,oBAAoB,IAAI,EAAE,EAAER,mBAAmB,CAACS,+BAA+B,CAAC;IAChJ,IAAG,CAACJ,GAAG,EAAE;MACL,OAAO;QAAEK,MAAM,EAAE,KAAK;QAAEC,OAAO,EAAE;MAA+C,CAAC;IACrF;IACAP,OAAO,CAACQ,GAAG,CAAC,wCAAwCP,GAAG,EAAE,CAAC;IAE1D,MAAMQ,QAAQ,GAAG,MAAMC,KAAK,CAACT,GAAG,EAAE;MAC9BU,MAAM,EAAE,KAAK;MACbC,OAAO,EAAEb,OAAO,CAACa;IACrB,CAAC,CAAC;IACF,MAAMC,IAAI,GAAG,MAAMJ,QAAQ,CAACK,IAAI,CAAC,CAAC;IAClC,OAAO;MAAER,MAAM,EAAE,IAAI;MAAEC,OAAO,EAAE,6BAA6B;MAAEM,IAAI,EAAE;QACjEE,OAAO,EAAEF,IAAI,CAACE,OAAO;QACrBC,IAAI,EAAEH,IAAI,CAACG;MACf;IAAE,CAAC;EAEP,CAAC,CAAC,OAAOC,KAAS,EAAE;IAChBjB,OAAO,CAACiB,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC;IACzD,OAAO;MAAEX,MAAM,EAAE,KAAK;MAAEC,OAAO,EAAEU,KAAK,CAACV,OAAO,IAAI;IAA0D,CAAC;EACjH;AACJ","ignoreList":[]}
@@ -24,5 +24,6 @@ export declare enum AzureSecretKeysEnum {
24
24
  FIREBASE_SERVICE_ACCOUNTS_VARIABLE = "firebase_service_accounts_variable",
25
25
  HMS_ACCESS_KEY = "MEETING-HMS-ACCESS-KEY-APP-SECRET",
26
26
  MEETING_ROOM_APP_SECRET = "MEETING-ROOM-APP-SECRET",
27
- BASE_DB_CLUSTER_CONNECTING_STRING_CHAT = "BASE-DB-CLUSTER-CONNECTING-STRING-CHAT"
27
+ BASE_DB_CLUSTER_CONNECTING_STRING_CHAT = "BASE-DB-CLUSTER-CONNECTING-STRING-CHAT",
28
+ AUTH_SERVICE_AUTHENTICATION_URL = "AUTH-SERVICE-AUTHENTICATION-URL"
28
29
  }
@@ -30,5 +30,6 @@ var AzureSecretKeysEnum;
30
30
  AzureSecretKeysEnum["HMS_ACCESS_KEY"] = "MEETING-HMS-ACCESS-KEY-APP-SECRET";
31
31
  AzureSecretKeysEnum["MEETING_ROOM_APP_SECRET"] = "MEETING-ROOM-APP-SECRET";
32
32
  AzureSecretKeysEnum["BASE_DB_CLUSTER_CONNECTING_STRING_CHAT"] = "BASE-DB-CLUSTER-CONNECTING-STRING-CHAT";
33
+ AzureSecretKeysEnum["AUTH_SERVICE_AUTHENTICATION_URL"] = "AUTH-SERVICE-AUTHENTICATION-URL";
33
34
  })(AzureSecretKeysEnum || (exports.AzureSecretKeysEnum = AzureSecretKeysEnum = {}));
34
35
  //# sourceMappingURL=secretKeys.enum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"secretKeys.enum.js","sourceRoot":"","sources":["../../../src/enums/secretKeys.enum.ts"],"names":[],"mappings":";;;AAAA,uBAAuB;AACvB,IAAY,mBA2BX;AA3BD,WAAY,mBAAmB;IAC7B,oFAA6D,CAAA;IAC7D,4EAAqD,CAAA;IACrD,8DAAuC,CAAA;IACvC,8FAAuE,CAAA;IACvE,0FAAmE,CAAA;IACnE,sFAA+D,CAAA;IAC/D,8DAAuC,CAAA;IACvC,8EAAuD,CAAA;IACvD,8EAAuD,CAAA;IACvD,gGAAyE,CAAA;IACzE,oFAA6D,CAAA;IAC7D,8EAAuD,CAAA;IACvD,oFAA6D,CAAA;IAC7D,oFAA8D,CAAA;IAC9D,oFAA6D,CAAA;IAC7D,qFAA8D,CAAA;IAC9D,sGAA+E,CAAA;IAC/E,oGAA6E,CAAA;IAC7E,oGAA6E,CAAA;IAC7E,8DAAuC,CAAA;IACvC,gHAAyF,CAAA;IACzF,8GAAuF,CAAA;IACvF,gGAAyE,CAAA;IACzE,2EAAkD,CAAA;IAClD,0EAAiD,CAAA;IACjD,wGAAiF,CAAA;AACnF,CAAC,EA3BW,mBAAmB,mCAAnB,mBAAmB,QA2B9B"}
1
+ {"version":3,"file":"secretKeys.enum.js","sourceRoot":"","sources":["../../../src/enums/secretKeys.enum.ts"],"names":[],"mappings":";;;AAAA,uBAAuB;AACvB,IAAY,mBA4BX;AA5BD,WAAY,mBAAmB;IAC7B,oFAA6D,CAAA;IAC7D,4EAAqD,CAAA;IACrD,8DAAuC,CAAA;IACvC,8FAAuE,CAAA;IACvE,0FAAmE,CAAA;IACnE,sFAA+D,CAAA;IAC/D,8DAAuC,CAAA;IACvC,8EAAuD,CAAA;IACvD,8EAAuD,CAAA;IACvD,gGAAyE,CAAA;IACzE,oFAA6D,CAAA;IAC7D,8EAAuD,CAAA;IACvD,oFAA6D,CAAA;IAC7D,oFAA8D,CAAA;IAC9D,oFAA6D,CAAA;IAC7D,qFAA8D,CAAA;IAC9D,sGAA+E,CAAA;IAC/E,oGAA6E,CAAA;IAC7E,oGAA6E,CAAA;IAC7E,8DAAuC,CAAA;IACvC,gHAAyF,CAAA;IACzF,8GAAuF,CAAA;IACvF,gGAAyE,CAAA;IACzE,2EAAkD,CAAA;IAClD,0EAAiD,CAAA;IACjD,wGAAiF,CAAA;IACjF,0FAAmE,CAAA;AACrE,CAAC,EA5BW,mBAAmB,mCAAnB,mBAAmB,QA4B9B"}
@@ -13,5 +13,5 @@ interface TokenValidationResult {
13
13
  user: IUser;
14
14
  };
15
15
  }
16
- export declare function tokenValidation(request: HttpRequest, domain: string, context: InvocationContext): Promise<TokenValidationResult>;
16
+ export declare function tokenValidation(request: HttpRequest, context: InvocationContext): Promise<TokenValidationResult>;
17
17
  export {};