@pawells/nestjs-auth 1.0.0-dev.3052c75
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/LICENSE +21 -0
- package/README.md +602 -0
- package/build/LICENSE +21 -0
- package/build/README.md +602 -0
- package/build/admin/client/client.d.ts +82 -0
- package/build/admin/client/client.d.ts.map +1 -0
- package/build/admin/client/client.js +157 -0
- package/build/admin/client/client.js.map +1 -0
- package/build/admin/client/errors/base-error.d.ts +58 -0
- package/build/admin/client/errors/base-error.d.ts.map +1 -0
- package/build/admin/client/errors/base-error.js +100 -0
- package/build/admin/client/errors/base-error.js.map +1 -0
- package/build/admin/client/errors/index.d.ts +2 -0
- package/build/admin/client/errors/index.d.ts.map +1 -0
- package/build/admin/client/errors/index.js +2 -0
- package/build/admin/client/errors/index.js.map +1 -0
- package/build/admin/client/index.d.ts +6 -0
- package/build/admin/client/index.d.ts.map +1 -0
- package/build/admin/client/index.js +11 -0
- package/build/admin/client/index.js.map +1 -0
- package/build/admin/client/services/authentication.service.d.ts +54 -0
- package/build/admin/client/services/authentication.service.d.ts.map +1 -0
- package/build/admin/client/services/authentication.service.js +99 -0
- package/build/admin/client/services/authentication.service.js.map +1 -0
- package/build/admin/client/services/base-service.d.ts +39 -0
- package/build/admin/client/services/base-service.d.ts.map +1 -0
- package/build/admin/client/services/base-service.js +107 -0
- package/build/admin/client/services/base-service.js.map +1 -0
- package/build/admin/client/services/client.service.d.ts +86 -0
- package/build/admin/client/services/client.service.d.ts.map +1 -0
- package/build/admin/client/services/client.service.js +193 -0
- package/build/admin/client/services/client.service.js.map +1 -0
- package/build/admin/client/services/event.service.d.ts +84 -0
- package/build/admin/client/services/event.service.d.ts.map +1 -0
- package/build/admin/client/services/event.service.js +155 -0
- package/build/admin/client/services/event.service.js.map +1 -0
- package/build/admin/client/services/federated-identity.service.d.ts +89 -0
- package/build/admin/client/services/federated-identity.service.d.ts.map +1 -0
- package/build/admin/client/services/federated-identity.service.js +120 -0
- package/build/admin/client/services/federated-identity.service.js.map +1 -0
- package/build/admin/client/services/group.service.d.ts +52 -0
- package/build/admin/client/services/group.service.d.ts.map +1 -0
- package/build/admin/client/services/group.service.js +105 -0
- package/build/admin/client/services/group.service.js.map +1 -0
- package/build/admin/client/services/identity-provider.service.d.ts +47 -0
- package/build/admin/client/services/identity-provider.service.d.ts.map +1 -0
- package/build/admin/client/services/identity-provider.service.js +86 -0
- package/build/admin/client/services/identity-provider.service.js.map +1 -0
- package/build/admin/client/services/index.d.ts +11 -0
- package/build/admin/client/services/index.d.ts.map +1 -0
- package/build/admin/client/services/index.js +11 -0
- package/build/admin/client/services/index.js.map +1 -0
- package/build/admin/client/services/realm.service.d.ts +41 -0
- package/build/admin/client/services/realm.service.d.ts.map +1 -0
- package/build/admin/client/services/realm.service.js +80 -0
- package/build/admin/client/services/realm.service.js.map +1 -0
- package/build/admin/client/services/role.service.d.ts +45 -0
- package/build/admin/client/services/role.service.d.ts.map +1 -0
- package/build/admin/client/services/role.service.js +92 -0
- package/build/admin/client/services/role.service.js.map +1 -0
- package/build/admin/client/services/user.service.d.ts +84 -0
- package/build/admin/client/services/user.service.d.ts.map +1 -0
- package/build/admin/client/services/user.service.js +216 -0
- package/build/admin/client/services/user.service.js.map +1 -0
- package/build/admin/client/types/config.types.d.ts +59 -0
- package/build/admin/client/types/config.types.d.ts.map +1 -0
- package/build/admin/client/types/config.types.js +13 -0
- package/build/admin/client/types/config.types.js.map +1 -0
- package/build/admin/client/types/event.types.d.ts +176 -0
- package/build/admin/client/types/event.types.d.ts.map +1 -0
- package/build/admin/client/types/event.types.js +2 -0
- package/build/admin/client/types/event.types.js.map +1 -0
- package/build/admin/client/types/index.d.ts +4 -0
- package/build/admin/client/types/index.d.ts.map +1 -0
- package/build/admin/client/types/index.js +4 -0
- package/build/admin/client/types/index.js.map +1 -0
- package/build/admin/client/types/keycloak.types.d.ts +169 -0
- package/build/admin/client/types/keycloak.types.d.ts.map +1 -0
- package/build/admin/client/types/keycloak.types.js +2 -0
- package/build/admin/client/types/keycloak.types.js.map +1 -0
- package/build/admin/client/utils/index.d.ts +2 -0
- package/build/admin/client/utils/index.d.ts.map +1 -0
- package/build/admin/client/utils/index.js +2 -0
- package/build/admin/client/utils/index.js.map +1 -0
- package/build/admin/client/utils/retry.d.ts +40 -0
- package/build/admin/client/utils/retry.d.ts.map +1 -0
- package/build/admin/client/utils/retry.js +72 -0
- package/build/admin/client/utils/retry.js.map +1 -0
- package/build/admin/config/keycloak.config.d.ts +33 -0
- package/build/admin/config/keycloak.config.d.ts.map +1 -0
- package/build/admin/config/keycloak.config.js +2 -0
- package/build/admin/config/keycloak.config.js.map +1 -0
- package/build/admin/config/keycloak.defaults.d.ts +11 -0
- package/build/admin/config/keycloak.defaults.d.ts.map +1 -0
- package/build/admin/config/keycloak.defaults.js +60 -0
- package/build/admin/config/keycloak.defaults.js.map +1 -0
- package/build/admin/health/keycloak.health.d.ts +13 -0
- package/build/admin/health/keycloak.health.d.ts.map +1 -0
- package/build/admin/health/keycloak.health.js +54 -0
- package/build/admin/health/keycloak.health.js.map +1 -0
- package/build/admin/index.d.ts +10 -0
- package/build/admin/index.d.ts.map +1 -0
- package/build/admin/index.js +9 -0
- package/build/admin/index.js.map +1 -0
- package/build/admin/keycloak-admin.interfaces.d.ts +45 -0
- package/build/admin/keycloak-admin.interfaces.d.ts.map +1 -0
- package/build/admin/keycloak-admin.interfaces.js +2 -0
- package/build/admin/keycloak-admin.interfaces.js.map +1 -0
- package/build/admin/keycloak-admin.module.d.ts +23 -0
- package/build/admin/keycloak-admin.module.d.ts.map +1 -0
- package/build/admin/keycloak-admin.module.js +101 -0
- package/build/admin/keycloak-admin.module.js.map +1 -0
- package/build/admin/keycloak.constants.d.ts +16 -0
- package/build/admin/keycloak.constants.d.ts.map +1 -0
- package/build/admin/keycloak.constants.js +16 -0
- package/build/admin/keycloak.constants.js.map +1 -0
- package/build/admin/permissions/index.d.ts +2 -0
- package/build/admin/permissions/index.d.ts.map +1 -0
- package/build/admin/permissions/index.js +2 -0
- package/build/admin/permissions/index.js.map +1 -0
- package/build/admin/permissions/keycloak-admin.permissions.d.ts +45 -0
- package/build/admin/permissions/keycloak-admin.permissions.d.ts.map +1 -0
- package/build/admin/permissions/keycloak-admin.permissions.js +68 -0
- package/build/admin/permissions/keycloak-admin.permissions.js.map +1 -0
- package/build/admin/services/keycloak-admin.service.d.ts +64 -0
- package/build/admin/services/keycloak-admin.service.d.ts.map +1 -0
- package/build/admin/services/keycloak-admin.service.js +152 -0
- package/build/admin/services/keycloak-admin.service.js.map +1 -0
- package/build/decorators/auth-decorators.d.ts +217 -0
- package/build/decorators/auth-decorators.d.ts.map +1 -0
- package/build/decorators/auth-decorators.js +251 -0
- package/build/decorators/auth-decorators.js.map +1 -0
- package/build/decorators/context-utils.d.ts +101 -0
- package/build/decorators/context-utils.d.ts.map +1 -0
- package/build/decorators/context-utils.js +178 -0
- package/build/decorators/context-utils.js.map +1 -0
- package/build/decorators/graphql-auth-decorators.d.ts +144 -0
- package/build/decorators/graphql-auth-decorators.d.ts.map +1 -0
- package/build/decorators/graphql-auth-decorators.js +152 -0
- package/build/decorators/graphql-auth-decorators.js.map +1 -0
- package/build/decorators/index.d.ts +5 -0
- package/build/decorators/index.d.ts.map +1 -0
- package/build/decorators/index.js +4 -0
- package/build/decorators/index.js.map +1 -0
- package/build/guards/index.d.ts +4 -0
- package/build/guards/index.d.ts.map +1 -0
- package/build/guards/index.js +4 -0
- package/build/guards/index.js.map +1 -0
- package/build/guards/jwt-auth.guard.d.ts +52 -0
- package/build/guards/jwt-auth.guard.d.ts.map +1 -0
- package/build/guards/jwt-auth.guard.js +97 -0
- package/build/guards/jwt-auth.guard.js.map +1 -0
- package/build/guards/permission.guard.d.ts +37 -0
- package/build/guards/permission.guard.d.ts.map +1 -0
- package/build/guards/permission.guard.js +73 -0
- package/build/guards/permission.guard.js.map +1 -0
- package/build/guards/role.guard.d.ts +33 -0
- package/build/guards/role.guard.d.ts.map +1 -0
- package/build/guards/role.guard.js +69 -0
- package/build/guards/role.guard.js.map +1 -0
- package/build/index.d.ts +92 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +98 -0
- package/build/index.js.map +1 -0
- package/build/keycloak/index.d.ts +7 -0
- package/build/keycloak/index.d.ts.map +1 -0
- package/build/keycloak/index.js +5 -0
- package/build/keycloak/index.js.map +1 -0
- package/build/keycloak/keycloak.constants.d.ts +2 -0
- package/build/keycloak/keycloak.constants.d.ts.map +1 -0
- package/build/keycloak/keycloak.constants.js +2 -0
- package/build/keycloak/keycloak.constants.js.map +1 -0
- package/build/keycloak/keycloak.interfaces.d.ts +12 -0
- package/build/keycloak/keycloak.interfaces.d.ts.map +1 -0
- package/build/keycloak/keycloak.interfaces.js +2 -0
- package/build/keycloak/keycloak.interfaces.js.map +1 -0
- package/build/keycloak/keycloak.module.d.ts +56 -0
- package/build/keycloak/keycloak.module.d.ts.map +1 -0
- package/build/keycloak/keycloak.module.js +104 -0
- package/build/keycloak/keycloak.module.js.map +1 -0
- package/build/keycloak/keycloak.types.d.ts +60 -0
- package/build/keycloak/keycloak.types.d.ts.map +1 -0
- package/build/keycloak/keycloak.types.js +2 -0
- package/build/keycloak/keycloak.types.js.map +1 -0
- package/build/keycloak/services/jwks-cache.service.d.ts +64 -0
- package/build/keycloak/services/jwks-cache.service.d.ts.map +1 -0
- package/build/keycloak/services/jwks-cache.service.js +176 -0
- package/build/keycloak/services/jwks-cache.service.js.map +1 -0
- package/build/keycloak/services/keycloak-token-validation.service.d.ts +88 -0
- package/build/keycloak/services/keycloak-token-validation.service.d.ts.map +1 -0
- package/build/keycloak/services/keycloak-token-validation.service.js +243 -0
- package/build/keycloak/services/keycloak-token-validation.service.js.map +1 -0
- package/build/package.json +72 -0
- package/package.json +93 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Parameters for Admin Events
|
|
3
|
+
*
|
|
4
|
+
* Filters and pagination options for querying administrative events.
|
|
5
|
+
*/
|
|
6
|
+
export interface AdminEventQuery {
|
|
7
|
+
/**
|
|
8
|
+
* Filter by operation types to include
|
|
9
|
+
*/
|
|
10
|
+
operationTypes?: ('CREATE' | 'UPDATE' | 'DELETE' | 'ACTION')[];
|
|
11
|
+
/**
|
|
12
|
+
* Filter by resource types affected
|
|
13
|
+
*/
|
|
14
|
+
resourceTypes?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Filter by resource path (e.g., 'users/123', 'clients/abc')
|
|
17
|
+
*/
|
|
18
|
+
resourcePath?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Start of date range (inclusive)
|
|
21
|
+
*/
|
|
22
|
+
dateFrom?: Date;
|
|
23
|
+
/**
|
|
24
|
+
* End of date range (inclusive)
|
|
25
|
+
*/
|
|
26
|
+
dateTo?: Date;
|
|
27
|
+
/**
|
|
28
|
+
* Offset for pagination (start index)
|
|
29
|
+
*/
|
|
30
|
+
first?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Maximum number of results to return.
|
|
33
|
+
* Keycloak caps this at 100; larger values are silently truncated.
|
|
34
|
+
*/
|
|
35
|
+
max?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Query Parameters for Access Events
|
|
39
|
+
*
|
|
40
|
+
* Filters and pagination options for querying authentication and authorization events.
|
|
41
|
+
*/
|
|
42
|
+
export interface AccessEventQuery {
|
|
43
|
+
/**
|
|
44
|
+
* Filter by event types to include (e.g., ['LOGIN', 'LOGOUT', 'LOGIN_ERROR'])
|
|
45
|
+
*/
|
|
46
|
+
type?: string[];
|
|
47
|
+
/**
|
|
48
|
+
* Filter by client ID making the request
|
|
49
|
+
*/
|
|
50
|
+
client?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Filter by user ID involved in the event
|
|
53
|
+
*/
|
|
54
|
+
user?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Start of date range (inclusive)
|
|
57
|
+
*/
|
|
58
|
+
dateFrom?: Date;
|
|
59
|
+
/**
|
|
60
|
+
* End of date range (inclusive)
|
|
61
|
+
*/
|
|
62
|
+
dateTo?: Date;
|
|
63
|
+
/**
|
|
64
|
+
* Offset for pagination (start index)
|
|
65
|
+
*/
|
|
66
|
+
first?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Maximum number of results to return.
|
|
69
|
+
* Keycloak caps this at 100; larger values are silently truncated.
|
|
70
|
+
*/
|
|
71
|
+
max?: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Keycloak Admin Event Representation
|
|
75
|
+
*
|
|
76
|
+
* Represents a single administrative event (user creation, role assignment, client updates, etc.)
|
|
77
|
+
* in a Keycloak realm.
|
|
78
|
+
*/
|
|
79
|
+
export interface KeycloakAdminEvent {
|
|
80
|
+
/**
|
|
81
|
+
* Event timestamp (milliseconds since epoch)
|
|
82
|
+
*/
|
|
83
|
+
time: number;
|
|
84
|
+
/**
|
|
85
|
+
* ID of the realm where the event occurred
|
|
86
|
+
*/
|
|
87
|
+
realmId: string;
|
|
88
|
+
/**
|
|
89
|
+
* Type of operation: CREATE, UPDATE, DELETE, or ACTION
|
|
90
|
+
*/
|
|
91
|
+
operationType: 'CREATE' | 'UPDATE' | 'DELETE' | 'ACTION';
|
|
92
|
+
/**
|
|
93
|
+
* Type of resource affected (e.g., USER, CLIENT, ROLE, GROUP, etc.)
|
|
94
|
+
*/
|
|
95
|
+
resourceType: string;
|
|
96
|
+
/**
|
|
97
|
+
* Path to the resource (e.g., 'users/user-id' or 'clients/client-id')
|
|
98
|
+
*/
|
|
99
|
+
resourcePath: string;
|
|
100
|
+
/**
|
|
101
|
+
* Double-encoded JSON string containing the full representation of the created or updated resource.
|
|
102
|
+
* Present only on CREATE and UPDATE operations.
|
|
103
|
+
*
|
|
104
|
+
* **Important**: Must be decoded twice:
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const decoded = JSON.parse(JSON.parse(event.representation));
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
representation?: string;
|
|
110
|
+
/**
|
|
111
|
+
* Authentication details of who performed the operation
|
|
112
|
+
*/
|
|
113
|
+
authDetails?: {
|
|
114
|
+
/**
|
|
115
|
+
* Realm where the admin authenticated
|
|
116
|
+
*/
|
|
117
|
+
realmId: string;
|
|
118
|
+
/**
|
|
119
|
+
* Client ID of the admin application
|
|
120
|
+
*/
|
|
121
|
+
clientId: string;
|
|
122
|
+
/**
|
|
123
|
+
* User ID of the admin who performed the operation
|
|
124
|
+
*/
|
|
125
|
+
userId: string;
|
|
126
|
+
/**
|
|
127
|
+
* IP address from which the operation was performed
|
|
128
|
+
*/
|
|
129
|
+
ipAddress: string;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Keycloak Access Event Representation
|
|
134
|
+
*
|
|
135
|
+
* Represents a single authentication or authorization event (login, logout, permission check, etc.)
|
|
136
|
+
* in a Keycloak realm.
|
|
137
|
+
*/
|
|
138
|
+
export interface KeycloakAccessEvent {
|
|
139
|
+
/**
|
|
140
|
+
* Event timestamp (milliseconds since epoch)
|
|
141
|
+
*/
|
|
142
|
+
time: number;
|
|
143
|
+
/**
|
|
144
|
+
* ID of the realm where the event occurred
|
|
145
|
+
*/
|
|
146
|
+
realmId: string;
|
|
147
|
+
/**
|
|
148
|
+
* Type of event (e.g., LOGIN, LOGOUT, LOGIN_ERROR, CODE_TO_TOKEN, etc.)
|
|
149
|
+
*/
|
|
150
|
+
type: string;
|
|
151
|
+
/**
|
|
152
|
+
* Keycloak session ID, if available
|
|
153
|
+
*/
|
|
154
|
+
sessionId?: string;
|
|
155
|
+
/**
|
|
156
|
+
* Keycloak user ID, if the event is tied to a user
|
|
157
|
+
*/
|
|
158
|
+
userId?: string;
|
|
159
|
+
/**
|
|
160
|
+
* IP address from which the request originated
|
|
161
|
+
*/
|
|
162
|
+
ipAddress?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Client ID making the request
|
|
165
|
+
*/
|
|
166
|
+
clientId?: string;
|
|
167
|
+
/**
|
|
168
|
+
* Additional event-specific details (keys and values depend on event type)
|
|
169
|
+
*/
|
|
170
|
+
details?: Record<string, string>;
|
|
171
|
+
/**
|
|
172
|
+
* Error message, present only if the event represents a failure (e.g., LOGIN_ERROR)
|
|
173
|
+
*/
|
|
174
|
+
error?: string;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=event.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.types.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/types/event.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;IAE/D;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAClC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,aAAa,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEzD;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE;QACb;;WAEG;QACH,OAAO,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,QAAQ,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,MAAM,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.types.js","sourceRoot":"","sources":["../../../../src/admin/client/types/event.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/admin/client/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keycloak realm representation
|
|
3
|
+
*/
|
|
4
|
+
export interface RealmRepresentation {
|
|
5
|
+
id?: string;
|
|
6
|
+
realm?: string;
|
|
7
|
+
displayName?: string;
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
sslRequired?: string;
|
|
10
|
+
registrationAllowed?: boolean;
|
|
11
|
+
loginWithEmailAllowed?: boolean;
|
|
12
|
+
duplicateEmailsAllowed?: boolean;
|
|
13
|
+
resetPasswordAllowed?: boolean;
|
|
14
|
+
editUsernameAllowed?: boolean;
|
|
15
|
+
bruteForceProtected?: boolean;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Keycloak user representation
|
|
20
|
+
*/
|
|
21
|
+
export interface UserRepresentation {
|
|
22
|
+
id?: string;
|
|
23
|
+
username?: string;
|
|
24
|
+
email?: string;
|
|
25
|
+
firstName?: string;
|
|
26
|
+
lastName?: string;
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
emailVerified?: boolean;
|
|
29
|
+
attributes?: Record<string, string[]>;
|
|
30
|
+
requiredActions?: string[];
|
|
31
|
+
credentials?: CredentialRepresentation[];
|
|
32
|
+
groups?: string[];
|
|
33
|
+
[key: string]: unknown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Keycloak credential representation
|
|
37
|
+
*/
|
|
38
|
+
export interface CredentialRepresentation {
|
|
39
|
+
type?: string;
|
|
40
|
+
value?: string;
|
|
41
|
+
temporary?: boolean;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Keycloak client representation
|
|
46
|
+
*/
|
|
47
|
+
export interface ClientRepresentation {
|
|
48
|
+
id?: string;
|
|
49
|
+
clientId?: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
enabled?: boolean;
|
|
53
|
+
clientAuthenticatorType?: string;
|
|
54
|
+
secret?: string;
|
|
55
|
+
publicClient?: boolean;
|
|
56
|
+
protocol?: string;
|
|
57
|
+
redirectUris?: string[];
|
|
58
|
+
webOrigins?: string[];
|
|
59
|
+
directAccessGrantsEnabled?: boolean;
|
|
60
|
+
serviceAccountsEnabled?: boolean;
|
|
61
|
+
standardFlowEnabled?: boolean;
|
|
62
|
+
implicitFlowEnabled?: boolean;
|
|
63
|
+
bearerOnly?: boolean;
|
|
64
|
+
consentRequired?: boolean;
|
|
65
|
+
attributes?: Record<string, string>;
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Keycloak role representation
|
|
70
|
+
*/
|
|
71
|
+
export interface RoleRepresentation {
|
|
72
|
+
id?: string;
|
|
73
|
+
name?: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
composite?: boolean;
|
|
76
|
+
clientRole?: boolean;
|
|
77
|
+
containerId?: string;
|
|
78
|
+
attributes?: Record<string, string[]>;
|
|
79
|
+
[key: string]: unknown;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Keycloak group representation
|
|
83
|
+
*/
|
|
84
|
+
export interface GroupRepresentation {
|
|
85
|
+
id?: string;
|
|
86
|
+
name?: string;
|
|
87
|
+
path?: string;
|
|
88
|
+
attributes?: Record<string, string[]>;
|
|
89
|
+
realmRoles?: string[];
|
|
90
|
+
clientRoles?: Record<string, string[]>;
|
|
91
|
+
subGroups?: GroupRepresentation[];
|
|
92
|
+
[key: string]: unknown;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Keycloak identity provider representation
|
|
96
|
+
*/
|
|
97
|
+
export interface IdentityProviderRepresentation {
|
|
98
|
+
alias?: string;
|
|
99
|
+
displayName?: string;
|
|
100
|
+
providerId?: string;
|
|
101
|
+
enabled?: boolean;
|
|
102
|
+
trustEmail?: boolean;
|
|
103
|
+
storeToken?: boolean;
|
|
104
|
+
addReadTokenRoleOnCreate?: boolean;
|
|
105
|
+
authenticateByDefault?: boolean;
|
|
106
|
+
linkOnly?: boolean;
|
|
107
|
+
firstBrokerLoginFlowAlias?: string;
|
|
108
|
+
config?: Record<string, string>;
|
|
109
|
+
[key: string]: unknown;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Keycloak authentication flow representation
|
|
113
|
+
*/
|
|
114
|
+
export interface AuthenticationFlowRepresentation {
|
|
115
|
+
id?: string;
|
|
116
|
+
alias?: string;
|
|
117
|
+
description?: string;
|
|
118
|
+
providerId?: string;
|
|
119
|
+
topLevel?: boolean;
|
|
120
|
+
builtIn?: boolean;
|
|
121
|
+
authenticationExecutions?: AuthenticationExecutionInfoRepresentation[];
|
|
122
|
+
[key: string]: unknown;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Keycloak authentication execution representation
|
|
126
|
+
*/
|
|
127
|
+
export interface AuthenticationExecutionInfoRepresentation {
|
|
128
|
+
id?: string;
|
|
129
|
+
requirement?: string;
|
|
130
|
+
displayName?: string;
|
|
131
|
+
alias?: string;
|
|
132
|
+
description?: string;
|
|
133
|
+
requirementChoices?: string[];
|
|
134
|
+
configurable?: boolean;
|
|
135
|
+
providerId?: string;
|
|
136
|
+
level?: number;
|
|
137
|
+
index?: number;
|
|
138
|
+
[key: string]: unknown;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Keycloak protocol mapper representation
|
|
142
|
+
*/
|
|
143
|
+
export interface ProtocolMapperRepresentation {
|
|
144
|
+
id?: string;
|
|
145
|
+
name?: string;
|
|
146
|
+
protocol?: string;
|
|
147
|
+
protocolMapper?: string;
|
|
148
|
+
consentRequired?: boolean;
|
|
149
|
+
config?: Record<string, string>;
|
|
150
|
+
[key: string]: unknown;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* User query parameters
|
|
154
|
+
*/
|
|
155
|
+
export interface UserQuery {
|
|
156
|
+
briefRepresentation?: boolean;
|
|
157
|
+
email?: string;
|
|
158
|
+
emailVerified?: boolean;
|
|
159
|
+
enabled?: boolean;
|
|
160
|
+
exact?: boolean;
|
|
161
|
+
first?: number;
|
|
162
|
+
firstName?: string;
|
|
163
|
+
lastName?: string;
|
|
164
|
+
max?: number;
|
|
165
|
+
search?: string;
|
|
166
|
+
username?: string;
|
|
167
|
+
[key: string]: unknown;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=keycloak.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.types.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/types/keycloak.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.types.js","sourceRoot":"","sources":["../../../../src/admin/client/types/keycloak.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/admin/client/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Logger } from '@pawells/logger';
|
|
2
|
+
/**
|
|
3
|
+
* Retry configuration options
|
|
4
|
+
*/
|
|
5
|
+
export interface RetryConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Maximum number of retry attempts
|
|
8
|
+
* @default 3
|
|
9
|
+
*/
|
|
10
|
+
maxRetries?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Initial delay in milliseconds before first retry
|
|
13
|
+
* @default 1000
|
|
14
|
+
*/
|
|
15
|
+
initialDelay?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Maximum delay in milliseconds between retries
|
|
18
|
+
* @default 30000
|
|
19
|
+
*/
|
|
20
|
+
maxDelay?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Backoff multiplier for exponential backoff
|
|
23
|
+
* @default 2
|
|
24
|
+
*/
|
|
25
|
+
backoffMultiplier?: number;
|
|
26
|
+
/**
|
|
27
|
+
* HTTP status codes that should trigger a retry
|
|
28
|
+
* @default [408, 429, 500, 502, 503, 504]
|
|
29
|
+
*/
|
|
30
|
+
retryableStatuses?: number[];
|
|
31
|
+
/**
|
|
32
|
+
* Logger instance for retry logging
|
|
33
|
+
*/
|
|
34
|
+
logger?: Logger;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Execute a function with retry logic
|
|
38
|
+
*/
|
|
39
|
+
export declare function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig): Promise<T>;
|
|
40
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAW9C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AA8CD;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAChC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,WAAgB,GACtB,OAAO,CAAC,CAAC,CAAC,CA0CZ"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { TimeoutError, RateLimitError, NetworkError } from '../errors/index.js';
|
|
2
|
+
const HTTP_STATUS_TIMEOUT = 408;
|
|
3
|
+
const HTTP_STATUS_RATE_LIMIT = 429;
|
|
4
|
+
const HTTP_STATUS_INTERNAL_ERROR = 500;
|
|
5
|
+
const HTTP_STATUS_BAD_GATEWAY = 502;
|
|
6
|
+
const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;
|
|
7
|
+
const HTTP_STATUS_GATEWAY_TIMEOUT = 504;
|
|
8
|
+
const JITTER_FACTOR = 0.2;
|
|
9
|
+
/**
|
|
10
|
+
* Default retry configuration
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
13
|
+
maxRetries: 3,
|
|
14
|
+
initialDelay: 1000,
|
|
15
|
+
maxDelay: 30000,
|
|
16
|
+
backoffMultiplier: 2,
|
|
17
|
+
retryableStatuses: [HTTP_STATUS_TIMEOUT, HTTP_STATUS_RATE_LIMIT, HTTP_STATUS_INTERNAL_ERROR, HTTP_STATUS_BAD_GATEWAY, HTTP_STATUS_SERVICE_UNAVAILABLE, HTTP_STATUS_GATEWAY_TIMEOUT],
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Determine if an error is retryable
|
|
21
|
+
*/
|
|
22
|
+
function isRetryableError(error, retryableStatuses) {
|
|
23
|
+
if (error instanceof TimeoutError || error instanceof RateLimitError || error instanceof NetworkError) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (error && typeof error === 'object' && 'statusCode' in error) {
|
|
27
|
+
const { statusCode } = error;
|
|
28
|
+
return statusCode !== undefined && retryableStatuses.includes(statusCode);
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Calculate delay with exponential backoff and jitter
|
|
34
|
+
*/
|
|
35
|
+
function calculateDelay(attempt, initialDelay, maxDelay, backoffMultiplier) {
|
|
36
|
+
const exponentialDelay = initialDelay * Math.pow(backoffMultiplier, attempt);
|
|
37
|
+
const delayWithCap = Math.min(exponentialDelay, maxDelay);
|
|
38
|
+
// Add jitter (±20%)
|
|
39
|
+
const jitter = delayWithCap * JITTER_FACTOR * (Math.random() * 2 - 1);
|
|
40
|
+
return Math.floor(delayWithCap + jitter);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Execute a function with retry logic
|
|
44
|
+
*/
|
|
45
|
+
export async function withRetry(fn, config = {}) {
|
|
46
|
+
const { maxRetries, initialDelay, maxDelay, backoffMultiplier, retryableStatuses, } = { ...DEFAULT_RETRY_CONFIG, ...config };
|
|
47
|
+
let lastError;
|
|
48
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
49
|
+
try {
|
|
50
|
+
return await fn();
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
54
|
+
// Don't retry on last attempt
|
|
55
|
+
if (attempt === maxRetries) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
// Check if error is retryable
|
|
59
|
+
if (!isRetryableError(error, retryableStatuses)) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
// Calculate delay and wait
|
|
63
|
+
const delay = calculateDelay(attempt, initialDelay, maxDelay, backoffMultiplier);
|
|
64
|
+
if (config.logger) {
|
|
65
|
+
config.logger.warn(`Retrying after ${delay}ms (attempt ${attempt + 1}/${maxRetries})`, { error: lastError.message });
|
|
66
|
+
}
|
|
67
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
throw lastError ?? new Error('Max retries exceeded');
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/admin/client/utils/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { KeycloakAdminScope } from '../permissions/keycloak-admin.permissions.js';
|
|
2
|
+
export interface KeycloakAdminConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
realmName: string;
|
|
6
|
+
credentials: {
|
|
7
|
+
type: 'password';
|
|
8
|
+
username: string;
|
|
9
|
+
password: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: 'clientCredentials';
|
|
12
|
+
clientId: string;
|
|
13
|
+
clientSecret: string;
|
|
14
|
+
};
|
|
15
|
+
timeout?: number;
|
|
16
|
+
retry?: {
|
|
17
|
+
maxRetries: number;
|
|
18
|
+
initialDelay: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Explicit list of permitted operation scopes.
|
|
22
|
+
*
|
|
23
|
+
* Defaults to all read-only scopes ({@link KEYCLOAK_DEFAULT_SCOPES}) when omitted.
|
|
24
|
+
* Write scopes must be explicitly declared.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* permissions: ['users:read', 'users:write', 'federated-identity:read', 'federated-identity:write']
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
permissions?: KeycloakAdminScope[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=keycloak.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.config.d.ts","sourceRoot":"","sources":["../../../src/admin/config/keycloak.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EACR;QACD,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KACjB,GACC;QACD,IAAI,EAAE,mBAAmB,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACrB,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACrB,CAAC;IACF;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.config.js","sourceRoot":"","sources":["../../../src/admin/config/keycloak.config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { KeycloakAdminConfig } from './keycloak.config.js';
|
|
2
|
+
/**
|
|
3
|
+
* SECURITY: Default Keycloak configuration
|
|
4
|
+
* Credentials are intentionally left empty and MUST be provided via environment variables:
|
|
5
|
+
* - For password auth: KEYCLOAK_USERNAME and KEYCLOAK_PASSWORD
|
|
6
|
+
* - For client credentials: KEYCLOAK_CLIENT_ID and KEYCLOAK_CLIENT_SECRET
|
|
7
|
+
* Do not commit credentials to source code.
|
|
8
|
+
*/
|
|
9
|
+
export declare const KeycloakAdminDefaults: KeycloakAdminConfig;
|
|
10
|
+
export declare function validateKeycloakAdminConfig(config: KeycloakAdminConfig): void;
|
|
11
|
+
//# sourceMappingURL=keycloak.defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.defaults.d.ts","sourceRoot":"","sources":["../../../src/admin/config/keycloak.defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAOhE;;;;;;GAMG;AAEH,eAAO,MAAM,qBAAqB,EAAE,mBAcnC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAmC7E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import { KEYCLOAK_ALL_SCOPES } from '../permissions/keycloak-admin.permissions.js';
|
|
3
|
+
// Keycloak timeout constants (in milliseconds)
|
|
4
|
+
const KEYCLOAK_TIMEOUT = 1000;
|
|
5
|
+
const KEYCLOAK_TIMEOUT_30_SECONDS_MULTIPLIER = 30;
|
|
6
|
+
/**
|
|
7
|
+
* SECURITY: Default Keycloak configuration
|
|
8
|
+
* Credentials are intentionally left empty and MUST be provided via environment variables:
|
|
9
|
+
* - For password auth: KEYCLOAK_USERNAME and KEYCLOAK_PASSWORD
|
|
10
|
+
* - For client credentials: KEYCLOAK_CLIENT_ID and KEYCLOAK_CLIENT_SECRET
|
|
11
|
+
* Do not commit credentials to source code.
|
|
12
|
+
*/
|
|
13
|
+
export const KeycloakAdminDefaults = {
|
|
14
|
+
enabled: false,
|
|
15
|
+
baseUrl: 'http://localhost:8080',
|
|
16
|
+
realmName: 'master',
|
|
17
|
+
credentials: {
|
|
18
|
+
type: 'password',
|
|
19
|
+
username: '', // Must be set via environment variable
|
|
20
|
+
password: '', // Must be set via environment variable
|
|
21
|
+
},
|
|
22
|
+
timeout: KEYCLOAK_TIMEOUT * KEYCLOAK_TIMEOUT_30_SECONDS_MULTIPLIER, // 30 seconds
|
|
23
|
+
retry: {
|
|
24
|
+
maxRetries: 3,
|
|
25
|
+
initialDelay: KEYCLOAK_TIMEOUT,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export function validateKeycloakAdminConfig(config) {
|
|
29
|
+
const schema = Joi.object({
|
|
30
|
+
enabled: Joi.boolean().required(),
|
|
31
|
+
baseUrl: Joi.string()
|
|
32
|
+
.uri({ scheme: ['http', 'https'] })
|
|
33
|
+
.required(),
|
|
34
|
+
realmName: Joi.string().min(1).required(),
|
|
35
|
+
credentials: Joi.alternatives()
|
|
36
|
+
.try(Joi.object({
|
|
37
|
+
type: Joi.string().valid('password').required(),
|
|
38
|
+
username: Joi.string().required(),
|
|
39
|
+
password: Joi.string().required(),
|
|
40
|
+
}), Joi.object({
|
|
41
|
+
type: Joi.string().valid('clientCredentials').required(),
|
|
42
|
+
clientId: Joi.string().required(),
|
|
43
|
+
clientSecret: Joi.string().required(),
|
|
44
|
+
}))
|
|
45
|
+
.required(),
|
|
46
|
+
timeout: Joi.number().min(KEYCLOAK_TIMEOUT).optional(),
|
|
47
|
+
retry: Joi.object({
|
|
48
|
+
maxRetries: Joi.number().min(0).required(),
|
|
49
|
+
initialDelay: Joi.number().min(0).required(),
|
|
50
|
+
}).optional(),
|
|
51
|
+
permissions: Joi.array()
|
|
52
|
+
.items(Joi.string().valid(...KEYCLOAK_ALL_SCOPES))
|
|
53
|
+
.optional(),
|
|
54
|
+
});
|
|
55
|
+
const { error } = schema.validate(config);
|
|
56
|
+
if (error) {
|
|
57
|
+
throw new Error(`Keycloak configuration validation failed: ${error.details.map((d) => d.message).join(', ')}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=keycloak.defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak.defaults.js","sourceRoot":"","sources":["../../../src/admin/config/keycloak.defaults.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAEnF,+CAA+C;AAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAElD;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAwB;IACzD,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,uBAAuB;IAChC,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE;QACZ,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,EAAE,EAAE,uCAAuC;QACrD,QAAQ,EAAE,EAAE,EAAE,uCAAuC;KACrD;IACD,OAAO,EAAE,gBAAgB,GAAG,sCAAsC,EAAE,aAAa;IACjF,KAAK,EAAE;QACN,UAAU,EAAE,CAAC;QACb,YAAY,EAAE,gBAAgB;KAC9B;CACD,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,MAA2B;IACtE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;aACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;aAClC,QAAQ,EAAE;QACZ,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QACzC,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE;aAC7B,GAAG,CACH,GAAG,CAAC,MAAM,CAAC;YACV,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;YAC/C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SACjC,CAAC,EACF,GAAG,CAAC,MAAM,CAAC;YACV,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE;YACxD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACjC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SACrC,CAAC,CACF;aACA,QAAQ,EAAE;QACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;QACtD,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC;YACjB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC1C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC5C,CAAC,CAAC,QAAQ,EAAE;QACb,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE;aACtB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,CAAC;aACjD,QAAQ,EAAE;KACZ,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChH,CAAC;AACF,CAAC"}
|