@culturefy/shared 1.0.28 → 1.0.29
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/build/cjs/dto/index.js +8 -0
- package/build/cjs/dto/index.js.map +1 -1
- package/build/cjs/index.js +6 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/interfaces/index.js +16 -0
- package/build/cjs/interfaces/index.js.map +1 -0
- package/build/cjs/interfaces/keycloak.js +2 -0
- package/build/cjs/interfaces/keycloak.js.map +1 -0
- package/build/cjs/interfaces/user.js +2 -0
- package/build/cjs/interfaces/user.js.map +1 -0
- package/build/cjs/middlewares/index.js +10 -0
- package/build/cjs/middlewares/index.js.map +1 -0
- package/build/cjs/middlewares/token-validation.js +485 -0
- package/build/cjs/middlewares/token-validation.js.map +1 -0
- package/build/cjs/models/user.model.js +507 -0
- package/build/cjs/models/user.model.js.map +1 -0
- package/build/cjs/service/keycloak.service.js +1003 -0
- package/build/cjs/service/keycloak.service.js.map +1 -0
- package/build/cjs/service/user.service.js +95 -0
- package/build/cjs/service/user.service.js.map +1 -0
- package/build/cjs/utils/index.js +6 -0
- package/build/cjs/utils/index.js.map +1 -1
- package/build/cjs/utils/jwt.js +14 -0
- package/build/cjs/utils/jwt.js.map +1 -0
- package/build/cjs/utils/response.js +19 -0
- package/build/cjs/utils/response.js.map +1 -1
- package/build/esm/dto/index.js +1 -1
- package/build/esm/dto/index.js.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/interfaces/index.js +3 -0
- package/build/esm/interfaces/index.js.map +1 -0
- package/build/esm/interfaces/keycloak.js +2 -0
- package/build/esm/interfaces/keycloak.js.map +1 -0
- package/build/esm/interfaces/user.js +2 -0
- package/build/esm/interfaces/user.js.map +1 -0
- package/build/esm/middlewares/index.js +2 -0
- package/build/esm/middlewares/index.js.map +1 -0
- package/build/esm/middlewares/token-validation.js +481 -0
- package/build/esm/middlewares/token-validation.js.map +1 -0
- package/build/esm/models/user.model.js +497 -0
- package/build/esm/models/user.model.js.map +1 -0
- package/build/esm/service/keycloak.service.js +996 -0
- package/build/esm/service/keycloak.service.js.map +1 -0
- package/build/esm/service/user.service.js +91 -0
- package/build/esm/service/user.service.js.map +1 -0
- package/build/esm/utils/index.js +1 -0
- package/build/esm/utils/index.js.map +1 -1
- package/build/esm/utils/jwt.js +10 -0
- package/build/esm/utils/jwt.js.map +1 -0
- package/build/esm/utils/response.js +18 -0
- package/build/esm/utils/response.js.map +1 -1
- package/build/package.json +13 -2
- package/build/src/dto/index.d.ts +1 -0
- package/build/src/dto/index.js +3 -0
- package/build/src/dto/index.js.map +1 -1
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +1 -0
- package/build/src/index.js.map +1 -1
- package/build/src/interfaces/index.d.ts +2 -0
- package/build/src/interfaces/index.js +6 -0
- package/build/src/interfaces/index.js.map +1 -0
- package/build/src/interfaces/keycloak.d.ts +151 -0
- package/build/src/interfaces/keycloak.js +3 -0
- package/build/src/interfaces/keycloak.js.map +1 -0
- package/build/src/interfaces/user.d.ts +5 -0
- package/build/src/interfaces/user.js +3 -0
- package/build/src/interfaces/user.js.map +1 -0
- package/build/src/middlewares/index.d.ts +1 -0
- package/build/src/middlewares/index.js +5 -0
- package/build/src/middlewares/index.js.map +1 -0
- package/build/src/middlewares/token-validation.d.ts +17 -0
- package/build/src/middlewares/token-validation.js +329 -0
- package/build/src/middlewares/token-validation.js.map +1 -0
- package/build/src/models/user.model.d.ts +193 -0
- package/build/src/models/user.model.js +401 -0
- package/build/src/models/user.model.js.map +1 -0
- package/build/src/service/keycloak.service.d.ts +88 -0
- package/build/src/service/keycloak.service.js +1059 -0
- package/build/src/service/keycloak.service.js.map +1 -0
- package/build/src/service/user.service.d.ts +11 -0
- package/build/src/service/user.service.js +118 -0
- package/build/src/service/user.service.js.map +1 -0
- package/build/src/utils/index.d.ts +1 -0
- package/build/src/utils/index.js +1 -0
- package/build/src/utils/index.js.map +1 -1
- package/build/src/utils/jwt.d.ts +1 -0
- package/build/src/utils/jwt.js +14 -0
- package/build/src/utils/jwt.js.map +1 -0
- package/build/src/utils/response.d.ts +1 -0
- package/build/src/utils/response.js +19 -0
- package/build/src/utils/response.js.map +1 -1
- package/package.json +13 -2
- package/src/dto/index.ts +1 -0
- package/src/index.ts +2 -1
- package/src/interfaces/index.ts +2 -0
- package/src/interfaces/keycloak.ts +161 -0
- package/src/interfaces/user.ts +5 -0
- package/src/middlewares/index.ts +1 -0
- package/src/middlewares/token-validation.ts +456 -0
- package/src/models/user.model.ts +488 -0
- package/src/service/keycloak.service.ts +1104 -0
- package/src/service/user.service.ts +99 -0
- package/src/utils/index.ts +2 -1
- package/src/utils/jwt.ts +10 -0
- package/src/utils/response.ts +19 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
export interface CreateRealmDto {
|
|
2
|
+
realm: string;
|
|
3
|
+
displayName?: string;
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface CreateClientDto {
|
|
7
|
+
clientId: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
protocol: string;
|
|
12
|
+
publicClient?: boolean;
|
|
13
|
+
secret?: string;
|
|
14
|
+
directAccessGrantsEnabled?: boolean;
|
|
15
|
+
standardFlowEnabled?: boolean;
|
|
16
|
+
implicitFlowEnabled?: boolean;
|
|
17
|
+
serviceAccountsEnabled?: boolean;
|
|
18
|
+
authorizationServicesEnabled?: boolean;
|
|
19
|
+
redirectUris?: string[];
|
|
20
|
+
webOrigins?: string[];
|
|
21
|
+
bearerOnly?: boolean;
|
|
22
|
+
consentRequired?: boolean;
|
|
23
|
+
fullScopeAllowed?: boolean;
|
|
24
|
+
attributes?: {
|
|
25
|
+
tls_client_certificate_bound_access_tokens?: string;
|
|
26
|
+
client_credentials_use_refresh_token?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface CreateUserDto {
|
|
30
|
+
username: string;
|
|
31
|
+
firstName: string;
|
|
32
|
+
lastName: string;
|
|
33
|
+
email: string;
|
|
34
|
+
password: string;
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
emailVerified?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface KeycloakUserLoginResponse {
|
|
39
|
+
access_token: string;
|
|
40
|
+
expires_in: number;
|
|
41
|
+
refresh_expires_in: number;
|
|
42
|
+
refresh_token: string;
|
|
43
|
+
token_type: string;
|
|
44
|
+
not_before_policy: number;
|
|
45
|
+
session_state: string;
|
|
46
|
+
scope: string;
|
|
47
|
+
}
|
|
48
|
+
export interface KeycloakClientLoginResponse {
|
|
49
|
+
access_token: string;
|
|
50
|
+
expires_in: number;
|
|
51
|
+
refresh_expires_in: number;
|
|
52
|
+
token_type: string;
|
|
53
|
+
not_before_policy: number;
|
|
54
|
+
scope: string;
|
|
55
|
+
}
|
|
56
|
+
export interface KeycloakUserResponse {
|
|
57
|
+
id: string;
|
|
58
|
+
username: string;
|
|
59
|
+
firstName: string;
|
|
60
|
+
lastName: string;
|
|
61
|
+
email: string;
|
|
62
|
+
emailVerified: boolean;
|
|
63
|
+
createdTimestamp: number;
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
totp: boolean;
|
|
66
|
+
disableableCredentialTypes: string[];
|
|
67
|
+
requiredActions: string[];
|
|
68
|
+
notBefore: number;
|
|
69
|
+
access: {
|
|
70
|
+
manage: boolean;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export interface KeycloakClientResponse {
|
|
74
|
+
id: string;
|
|
75
|
+
clientId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
description: string;
|
|
78
|
+
rootUrl: string;
|
|
79
|
+
adminUrl: string;
|
|
80
|
+
baseUrl: string;
|
|
81
|
+
surrogateAuthRequired: boolean;
|
|
82
|
+
enabled: boolean;
|
|
83
|
+
alwaysDisplayInConsole: boolean;
|
|
84
|
+
clientAuthenticatorType: string;
|
|
85
|
+
secret: string;
|
|
86
|
+
redirectUris: string[];
|
|
87
|
+
webOrigins: string[];
|
|
88
|
+
notBefore: number;
|
|
89
|
+
bearerOnly: boolean;
|
|
90
|
+
consentRequired: boolean;
|
|
91
|
+
standardFlowEnabled: boolean;
|
|
92
|
+
implicitFlowEnabled: boolean;
|
|
93
|
+
directAccessGrantsEnabled: boolean;
|
|
94
|
+
serviceAccountsEnabled: boolean;
|
|
95
|
+
publicClient: boolean;
|
|
96
|
+
frontchannelLogout: boolean;
|
|
97
|
+
protocol: string;
|
|
98
|
+
attributes: Record<string, string>;
|
|
99
|
+
authenticationFlowBindingOverrides: Record<string, string>;
|
|
100
|
+
fullScopeAllowed: boolean;
|
|
101
|
+
nodeReRegistrationTimeout: number;
|
|
102
|
+
defaultClientScopes: string[];
|
|
103
|
+
optionalClientScopes: string[];
|
|
104
|
+
access: {
|
|
105
|
+
view: boolean;
|
|
106
|
+
configure: boolean;
|
|
107
|
+
manage: boolean;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export interface KeycloakClientSecretResponse {
|
|
111
|
+
key: string;
|
|
112
|
+
value: string;
|
|
113
|
+
}
|
|
114
|
+
export interface KeycloakUserLoginDto {
|
|
115
|
+
email: string;
|
|
116
|
+
password: string;
|
|
117
|
+
username?: string;
|
|
118
|
+
}
|
|
119
|
+
export interface KeycloakRoleResponse {
|
|
120
|
+
id: string;
|
|
121
|
+
name: string;
|
|
122
|
+
description: string;
|
|
123
|
+
composite: boolean;
|
|
124
|
+
clientRole: boolean;
|
|
125
|
+
containerId: string;
|
|
126
|
+
}
|
|
127
|
+
export interface KeycloakIntrospectTokenResponse {
|
|
128
|
+
exp: number;
|
|
129
|
+
iat: number;
|
|
130
|
+
jti: string;
|
|
131
|
+
iss: string;
|
|
132
|
+
aud: string;
|
|
133
|
+
sub: string;
|
|
134
|
+
typ: string;
|
|
135
|
+
azp: string;
|
|
136
|
+
sid: string;
|
|
137
|
+
acr: string;
|
|
138
|
+
realm_access: Record<string, any>;
|
|
139
|
+
resource_access: Record<string, any>;
|
|
140
|
+
scope: string;
|
|
141
|
+
email_verified: boolean;
|
|
142
|
+
name: string;
|
|
143
|
+
preferred_username: string;
|
|
144
|
+
given_name: string;
|
|
145
|
+
family_name: string;
|
|
146
|
+
email: string;
|
|
147
|
+
client_id: string;
|
|
148
|
+
username: string;
|
|
149
|
+
token_type: string;
|
|
150
|
+
active: boolean;
|
|
151
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.js","sourceRoot":"","sources":["../../../src/interfaces/keycloak.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/interfaces/user.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './token-validation';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middlewares/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import IUser from "../models/user.model";
|
|
2
|
+
import { HttpRequest, InvocationContext } from "@azure/functions";
|
|
3
|
+
interface TokenValidationResult {
|
|
4
|
+
status: boolean;
|
|
5
|
+
message: string;
|
|
6
|
+
data?: {
|
|
7
|
+
cookies: {
|
|
8
|
+
access_token: string;
|
|
9
|
+
refresh_token: string;
|
|
10
|
+
expires_in?: number;
|
|
11
|
+
refresh_expires_in?: number;
|
|
12
|
+
};
|
|
13
|
+
user: IUser;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function tokenValidation(request: HttpRequest, domain: string, context: InvocationContext): Promise<TokenValidationResult>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tokenValidation = tokenValidation;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const enums_1 = require("../enums");
|
|
6
|
+
const user_service_1 = require("../service/user.service");
|
|
7
|
+
const keycloak_service_1 = require("../service/keycloak.service");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
function tokenValidation(request, domain, context) {
|
|
10
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
11
|
+
try {
|
|
12
|
+
let cookies = (0, utils_1.parseCookies)(request, context);
|
|
13
|
+
let accessToken = cookies["culturefy-auth-token"];
|
|
14
|
+
let refreshToken = cookies["culturefy-refresh-token"];
|
|
15
|
+
let expiresIn, refreshExpiresIn;
|
|
16
|
+
if (!accessToken)
|
|
17
|
+
return { status: false, message: "Access token is required" };
|
|
18
|
+
const keycloakService = yield initializeKeycloakService(context);
|
|
19
|
+
const tokenValidation = yield validateToken(accessToken, context);
|
|
20
|
+
if (!tokenValidation.success) {
|
|
21
|
+
if (tokenValidation.expired) {
|
|
22
|
+
const { data } = tokenValidation;
|
|
23
|
+
if (!data)
|
|
24
|
+
return { status: false, message: "Invalid access token." };
|
|
25
|
+
let { userId, clientId, realm, email } = data;
|
|
26
|
+
if (!clientId)
|
|
27
|
+
return { status: false, message: "Invalid access token provided" };
|
|
28
|
+
if (!userId)
|
|
29
|
+
return { status: false, message: "Invalid access token provided" };
|
|
30
|
+
if (!realm)
|
|
31
|
+
return { status: false, message: "Invalid access token provided" };
|
|
32
|
+
context.log("Refreshing token for user:", JSON.stringify({ userId, clientId, realm, email }));
|
|
33
|
+
const refreshTokenResponse = yield handleTokenRefresh(keycloakService, refreshToken, userId, clientId, realm, email, domain, context);
|
|
34
|
+
if (!refreshTokenResponse.success)
|
|
35
|
+
return { status: false, message: refreshTokenResponse.message };
|
|
36
|
+
const { data: refreshTokenData } = refreshTokenResponse;
|
|
37
|
+
if (!refreshTokenData)
|
|
38
|
+
return { status: false, message: "Invalid refresh token." };
|
|
39
|
+
context.log("Refreshed token for user:", JSON.stringify({ userId, clientId, realm, email }));
|
|
40
|
+
accessToken = refreshTokenData.access_token;
|
|
41
|
+
refreshToken = refreshTokenData.refresh_token;
|
|
42
|
+
expiresIn = refreshTokenData.expires_in;
|
|
43
|
+
refreshExpiresIn = refreshTokenData.refresh_expires_in;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return { status: false, message: tokenValidation.message };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const { data } = tokenValidation;
|
|
50
|
+
if (!data)
|
|
51
|
+
return { status: false, message: "Invalid access token." };
|
|
52
|
+
let { userId, clientId, realm, email } = data;
|
|
53
|
+
if (!clientId)
|
|
54
|
+
return { status: false, message: "Invalid access token provided" };
|
|
55
|
+
if (!userId)
|
|
56
|
+
return { status: false, message: "Invalid access token provided" };
|
|
57
|
+
if (!realm)
|
|
58
|
+
return { status: false, message: "Invalid access token provided" };
|
|
59
|
+
if (!email)
|
|
60
|
+
return { status: false, message: "Invalid access token provided" };
|
|
61
|
+
context.log("Validating user:", JSON.stringify({ userId, clientId, realm, email }));
|
|
62
|
+
let verifyFromDb;
|
|
63
|
+
let userInfo;
|
|
64
|
+
if (domain === "accounts.culturefy.app") {
|
|
65
|
+
const introspectionValid = yield validateTokenIntrospection(keycloakService, accessToken, realm, clientId, domain, context);
|
|
66
|
+
if (!introspectionValid)
|
|
67
|
+
return { status: false, message: "Token introspection failed" };
|
|
68
|
+
context.log("Token introspection successful");
|
|
69
|
+
realm = "superadmin";
|
|
70
|
+
clientId = "cfy-superadmin-web";
|
|
71
|
+
userInfo = yield keycloakService.getUserByToken(realm, accessToken);
|
|
72
|
+
context.log("User info-1:", JSON.stringify(userInfo));
|
|
73
|
+
if (!userInfo.email)
|
|
74
|
+
return { status: false, message: "User email not found" };
|
|
75
|
+
if (userInfo.email !== email)
|
|
76
|
+
return { status: false, message: "User email does not match" };
|
|
77
|
+
email = userInfo.email;
|
|
78
|
+
verifyFromDb = yield validateUserByEmail(email, context);
|
|
79
|
+
if (!verifyFromDb.success)
|
|
80
|
+
return { status: false, message: verifyFromDb.message };
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
clientId = "cfy-web";
|
|
84
|
+
verifyFromDb = yield validateUserByRealm(realm, email, context);
|
|
85
|
+
}
|
|
86
|
+
if (!verifyFromDb.success)
|
|
87
|
+
return { status: false, message: verifyFromDb.message };
|
|
88
|
+
const user = verifyFromDb.user;
|
|
89
|
+
if (!user)
|
|
90
|
+
return { status: false, message: "User not found." };
|
|
91
|
+
context.log("User:", JSON.stringify(user));
|
|
92
|
+
const introspectionValid = yield validateTokenIntrospection(keycloakService, accessToken, realm, clientId, domain, context);
|
|
93
|
+
if (!introspectionValid)
|
|
94
|
+
return { status: false, message: "Token introspection failed" };
|
|
95
|
+
context.log("Token introspection successful");
|
|
96
|
+
if (domain === "accounts.culturefy.app") {
|
|
97
|
+
realm = "superadmin";
|
|
98
|
+
clientId = "cfy-superadmin-web";
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
if (!user.businessId)
|
|
102
|
+
return { status: false, message: "User not found" };
|
|
103
|
+
realm = user.businessId.toString();
|
|
104
|
+
clientId = "cfy-web";
|
|
105
|
+
}
|
|
106
|
+
if (!userInfo) {
|
|
107
|
+
userInfo = yield keycloakService.getUserByToken(realm, accessToken);
|
|
108
|
+
context.log("User info-2:", JSON.stringify(userInfo));
|
|
109
|
+
}
|
|
110
|
+
if (!userInfo)
|
|
111
|
+
return { status: false, message: "User info not found" };
|
|
112
|
+
let updatedCookies = {
|
|
113
|
+
access_token: accessToken,
|
|
114
|
+
refresh_token: refreshToken,
|
|
115
|
+
};
|
|
116
|
+
if (expiresIn)
|
|
117
|
+
updatedCookies.expires_in = expiresIn;
|
|
118
|
+
if (refreshExpiresIn)
|
|
119
|
+
updatedCookies.refresh_expires_in = refreshExpiresIn;
|
|
120
|
+
return {
|
|
121
|
+
status: true,
|
|
122
|
+
message: "Token is valid",
|
|
123
|
+
data: {
|
|
124
|
+
cookies: updatedCookies,
|
|
125
|
+
user: user
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
context.error("Culturefy token validation error:", error);
|
|
131
|
+
return { status: false, message: "Internal server error during culturefy token validation" };
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function initializeKeycloakService(context) {
|
|
136
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
const [keycloakBaseUrl, keycloakAdminClientId, keycloakAdminClientSecret] = yield Promise.all([
|
|
138
|
+
(0, utils_1.getAzureVaultSecretByKey)(context, process.env.AZURE_KEY_VAULT_NAME || "", enums_1.AzureSecretKeysEnum.KEYCLOAK_BASE_URL),
|
|
139
|
+
(0, utils_1.getAzureVaultSecretByKey)(context, process.env.AZURE_KEY_VAULT_NAME || "", enums_1.AzureSecretKeysEnum.KEYCLOAK_ADMIN_CLIENT_ID),
|
|
140
|
+
(0, utils_1.getAzureVaultSecretByKey)(context, process.env.AZURE_KEY_VAULT_NAME || "", enums_1.AzureSecretKeysEnum.KEYCLOAK_ADMIN_CLIENT_SECRET)
|
|
141
|
+
]);
|
|
142
|
+
return new keycloak_service_1.KeycloakAdminService(context, {
|
|
143
|
+
baseUrl: keycloakBaseUrl,
|
|
144
|
+
adminClientId: keycloakAdminClientId,
|
|
145
|
+
adminClientSecret: keycloakAdminClientSecret
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function validateToken(accessToken, context) {
|
|
150
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
151
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
152
|
+
const decoded = (0, utils_1.verifyJsonWebToken)(accessToken);
|
|
153
|
+
if (!decoded)
|
|
154
|
+
return { success: false, message: "Invalid access token format" };
|
|
155
|
+
let { iat, exp, sub: userId, azp: clientId, iss, email } = decoded;
|
|
156
|
+
if (!userId || !clientId || !iss)
|
|
157
|
+
return { success: false, message: "Access token missing required claims (sub or azp or iss)" };
|
|
158
|
+
context.log("Access token claims:", JSON.stringify(decoded));
|
|
159
|
+
let realm = iss.split("/")[iss.split("/").length - 1];
|
|
160
|
+
if (!realm)
|
|
161
|
+
return { success: false, message: "Access token missing required claims (iss)" };
|
|
162
|
+
if (exp && exp < currentTime)
|
|
163
|
+
return { success: false, message: "Access token expired and refresh token not provided", expired: true, data: { userId, clientId, realm, email } };
|
|
164
|
+
if (iat && iat > currentTime)
|
|
165
|
+
return { success: false, message: "Invalid token issuance time" };
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
message: "Token is valid",
|
|
169
|
+
data: { userId, clientId, realm, email }
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function handleTokenRefresh(keycloakService, refreshToken, userId, clientId, realm, email, domain, context) {
|
|
174
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
175
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
176
|
+
if (!clientId)
|
|
177
|
+
return { success: false, message: "Client ID is missing" };
|
|
178
|
+
if (!userId)
|
|
179
|
+
return { success: false, message: "User ID is missing" };
|
|
180
|
+
if (!realm)
|
|
181
|
+
return { success: false, message: "Realm is missing" };
|
|
182
|
+
if (!refreshToken)
|
|
183
|
+
return { success: false, message: "Refresh token is missing" };
|
|
184
|
+
if (!email)
|
|
185
|
+
return { success: false, message: "Email is missing" };
|
|
186
|
+
if (!domain)
|
|
187
|
+
return { success: false, message: "Domain is missing" };
|
|
188
|
+
context.info("values:", { clientId, userId, realm, email, domain });
|
|
189
|
+
const refreshTokenDecoded = (0, utils_1.verifyJsonWebToken)(refreshToken);
|
|
190
|
+
if (!refreshTokenDecoded)
|
|
191
|
+
return { success: false, message: "Invalid refresh token format" };
|
|
192
|
+
let { iss: refreshIss } = refreshTokenDecoded;
|
|
193
|
+
refreshIss = refreshIss.split("/")[refreshIss.split("/").length - 1];
|
|
194
|
+
const { iat: refreshIat, exp: refreshExp, sub: refreshUserId, azp: refreshClientId, email: refreshEmail } = refreshTokenDecoded;
|
|
195
|
+
context.info("refreshTokenDecoded:", JSON.stringify({ refreshUserId, refreshClientId, refreshIss, refreshEmail }));
|
|
196
|
+
if (!refreshUserId || !refreshClientId || !refreshIss)
|
|
197
|
+
return { success: false, message: "Refresh token missing required claims (sub or azp or iss)" };
|
|
198
|
+
if (refreshExp && refreshExp < currentTime)
|
|
199
|
+
return { success: false, message: "Refresh token has expired" };
|
|
200
|
+
if (refreshIat && refreshIat > currentTime)
|
|
201
|
+
return { success: false, message: "Invalid refresh token issuance time" };
|
|
202
|
+
if (refreshUserId !== userId || refreshClientId !== clientId || refreshIss !== realm || refreshEmail !== email)
|
|
203
|
+
return { success: false, message: "Refresh token does not match access token user" };
|
|
204
|
+
if (domain === "accounts.culturefy.app") {
|
|
205
|
+
realm = "superadmin";
|
|
206
|
+
clientId = "cfy-superadmin-web";
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
realm = realm;
|
|
210
|
+
clientId = "cfy-web";
|
|
211
|
+
}
|
|
212
|
+
const newToken = yield keycloakService.refreshToken(realm, clientId, refreshToken);
|
|
213
|
+
if (!newToken)
|
|
214
|
+
return { success: false, message: "Failed to refresh access token" };
|
|
215
|
+
const newTokenDecoded = (0, utils_1.verifyJsonWebToken)(newToken.access_token);
|
|
216
|
+
if (!newTokenDecoded)
|
|
217
|
+
return { success: false, message: "Invalid new token format" };
|
|
218
|
+
const { iat: newIat, exp: newExp, sub: newUserId, azp: newClientId, iss: newIss, email: newEmail } = newTokenDecoded;
|
|
219
|
+
if (!newUserId || !newClientId || !newIss || !newEmail)
|
|
220
|
+
return { success: false, message: "New token missing required claims (sub or azp or iss or email)" };
|
|
221
|
+
if (newExp && newExp < currentTime)
|
|
222
|
+
return { success: false, message: "New token has expired" };
|
|
223
|
+
if (newIat && newIat > currentTime)
|
|
224
|
+
return { success: false, message: "Invalid new token issuance time" };
|
|
225
|
+
context.info("Token refreshed successfully for user:", userId);
|
|
226
|
+
return {
|
|
227
|
+
success: true,
|
|
228
|
+
message: "Token refreshed successfully",
|
|
229
|
+
data: {
|
|
230
|
+
access_token: newToken.access_token, expires_in: newToken.expires_in,
|
|
231
|
+
refresh_token: newToken.refresh_token, refresh_expires_in: newToken.refresh_expires_in
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
function validateUserByRealm(realm, email, context) {
|
|
237
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
238
|
+
try {
|
|
239
|
+
const authDbUrl = yield (0, utils_1.getAzureVaultSecretByKey)(context, process.env.AZURE_KEY_VAULT_NAME || "", enums_1.AzureSecretKeysEnum.DB_CONNECTING_STRING_USER);
|
|
240
|
+
const userService = new user_service_1.UserService(context, authDbUrl);
|
|
241
|
+
let user = null;
|
|
242
|
+
context.log("Getting user by realm:", realm);
|
|
243
|
+
try {
|
|
244
|
+
user = yield userService.getUserByBusinessId(realm, email);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
context.error(`Failed to get user by realm:`, err);
|
|
248
|
+
return { success: false, message: "User not found.." };
|
|
249
|
+
}
|
|
250
|
+
context.log("User:", JSON.stringify(user));
|
|
251
|
+
if (!user)
|
|
252
|
+
return { success: false, message: "User not found..." };
|
|
253
|
+
yield userService.disconnect();
|
|
254
|
+
return { success: true, message: "User validation successful", user };
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
context.error("User validation error:", error);
|
|
258
|
+
return { success: false, message: "Error validating user information" };
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function validateUserByEmail(email, context) {
|
|
263
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
264
|
+
try {
|
|
265
|
+
const authDbUrl = yield (0, utils_1.getAzureVaultSecretByKey)(context, process.env.AZURE_KEY_VAULT_NAME || "", enums_1.AzureSecretKeysEnum.DB_CONNECTING_STRING_USER);
|
|
266
|
+
const userService = new user_service_1.UserService(context, authDbUrl);
|
|
267
|
+
let user = null;
|
|
268
|
+
context.log("Getting user by email:", email);
|
|
269
|
+
try {
|
|
270
|
+
user = yield userService.getUserByEmail(email);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
context.error(`Failed to get user by email:`, err);
|
|
274
|
+
return { success: false, message: "User not found.." };
|
|
275
|
+
}
|
|
276
|
+
context.log("User:", JSON.stringify(user));
|
|
277
|
+
if (!user)
|
|
278
|
+
return { success: false, message: "User not found..." };
|
|
279
|
+
yield userService.disconnect();
|
|
280
|
+
return { success: true, message: "User validation successful", user };
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
context.error("User validation error:", error);
|
|
284
|
+
return { success: false, message: "Error validating user information" };
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
function validateTokenIntrospection(keycloakService, token, realm, clientId, domain, context) {
|
|
289
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
290
|
+
var _a, _b, _c;
|
|
291
|
+
try {
|
|
292
|
+
if (!realm)
|
|
293
|
+
return false;
|
|
294
|
+
if (!clientId)
|
|
295
|
+
return false;
|
|
296
|
+
if (!token)
|
|
297
|
+
return false;
|
|
298
|
+
if (domain === "accounts.culturefy.app") {
|
|
299
|
+
realm = "superadmin";
|
|
300
|
+
clientId = "cfy-superadmin-web";
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
realm = realm;
|
|
304
|
+
clientId = "cfy-web";
|
|
305
|
+
}
|
|
306
|
+
context.info("Validating token with Keycloak introspection");
|
|
307
|
+
const introspection = yield keycloakService.introspectToken(realm, clientId, token);
|
|
308
|
+
if (!introspection.active) {
|
|
309
|
+
context.warn("Token introspection returned inactive token");
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
context.info("Token introspection successful - token is active");
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
context.error("Token introspection error:", error);
|
|
317
|
+
if ((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('Client not allowed')) {
|
|
318
|
+
context.warn("Admin-cli client does not have introspection permissions - this is expected");
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
if ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('Invalid token'))
|
|
322
|
+
return false;
|
|
323
|
+
if ((_c = error.message) === null || _c === void 0 ? void 0 : _c.includes('Token is not active'))
|
|
324
|
+
return false;
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=token-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-validation.js","sourceRoot":"","sources":["../../../src/middlewares/token-validation.ts"],"names":[],"mappings":"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"}
|