keycloak-api-manager 6.0.1 → 6.0.3
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/Handlers/attackDetectionHandler.js +12 -8
- package/Handlers/clientPoliciesHandler.js +4 -2
- package/Handlers/clientScopesHandler.js +9 -9
- package/Handlers/clientsHandler.js +1 -13
- package/Handlers/groupsHandler.js +3 -2
- package/Handlers/organizationsHandler.js +2 -1
- package/Handlers/realmsHandler.js +0 -1
- package/Handlers/rolesHandler.js +14 -12
- package/Handlers/userProfileHandler.js +2 -2
- package/OIDC_MIGRATION_PLAN.md +5 -15
- package/README.md +4 -4
- package/docs/api/attack-detection.md +82 -16
- package/docs/api/authentication-management.md +356 -70
- package/docs/api/client-policies.md +103 -16
- package/docs/api/client-scopes.md +52 -4
- package/docs/api/components.md +107 -19
- package/docs/api/configuration.md +39 -386
- package/docs/api/groups.md +46 -5
- package/docs/api/identity-providers.md +50 -5
- package/docs/api/roles.md +37 -7
- package/docs/api/server-info.md +42 -17
- package/docs/api/user-profile.md +55 -10
- package/docs/api-reference.md +7 -7
- package/docs/guides/PKCE-Login-Flow.md +13 -659
- package/docs/test-configuration.md +19 -1
- package/docs/testing.md +86 -0
- package/index.js +131 -0
- package/package.json +1 -1
- package/test/config/secrets.json.example +1 -1
- package/test/helpers/config.js +15 -9
|
@@ -2,7 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Manage client scopes, protocol mappers, and role scope mappings.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Namespace: KeycloakManager.clientScopes
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Client scopes are reusable bundles of:
|
|
10
|
+
|
|
11
|
+
- Protocol mappers (claims in tokens/userinfo).
|
|
12
|
+
- Realm role mappings.
|
|
13
|
+
- Client role mappings.
|
|
14
|
+
|
|
15
|
+
This handler covers full CRUD for scopes and all mapper/mapping operations.
|
|
6
16
|
|
|
7
17
|
## Scope CRUD
|
|
8
18
|
|
|
@@ -12,28 +22,33 @@ Manage client scopes, protocol mappers, and role scope mappings.
|
|
|
12
22
|
- **Returns**: Promise<object>
|
|
13
23
|
|
|
14
24
|
### find(filter)
|
|
15
|
-
- **Optional**: `search`, `first`, `max`
|
|
25
|
+
- **Optional**: `search`, `first`, `max`, `realm`
|
|
16
26
|
- **Returns**: Promise<Array<ClientScopeRepresentation>>
|
|
17
27
|
|
|
18
28
|
### findOne(filter)
|
|
19
29
|
- **Required**: `filter.id` (scope id)
|
|
30
|
+
- **Optional**: `filter.realm`
|
|
20
31
|
- **Returns**: Promise<ClientScopeRepresentation>
|
|
21
32
|
|
|
22
33
|
### findOneByName(filter)
|
|
23
34
|
- **Required**: `filter.name` (scope name)
|
|
35
|
+
- **Optional**: `filter.realm`
|
|
24
36
|
- **Returns**: Promise<ClientScopeRepresentation|null>
|
|
25
37
|
|
|
26
38
|
### update(filter, scopeRepresentation)
|
|
27
39
|
- **Required**: `filter.id` (scope id)
|
|
40
|
+
- **Optional**: `filter.realm`
|
|
28
41
|
- **Required**: `scopeRepresentation` (partial)
|
|
29
42
|
- **Returns**: Promise<void>
|
|
30
43
|
|
|
31
44
|
### del(filter)
|
|
32
45
|
- **Required**: `filter.id` (scope id)
|
|
46
|
+
- **Optional**: `filter.realm`
|
|
33
47
|
- **Returns**: Promise<void>
|
|
34
48
|
|
|
35
49
|
### delByName(filter)
|
|
36
50
|
- **Required**: `filter.name` (scope name)
|
|
51
|
+
- **Optional**: `filter.realm`
|
|
37
52
|
- **Returns**: Promise<void>
|
|
38
53
|
|
|
39
54
|
## Realm Default Scopes
|
|
@@ -44,10 +59,12 @@ Manage client scopes, protocol mappers, and role scope mappings.
|
|
|
44
59
|
|
|
45
60
|
### addDefaultClientScope(filter)
|
|
46
61
|
- **Required**: `filter.id` (scope id)
|
|
62
|
+
- **Optional**: `filter.realm`
|
|
47
63
|
- **Returns**: Promise<void>
|
|
48
64
|
|
|
49
65
|
### delDefaultClientScope(filter)
|
|
50
66
|
- **Required**: `filter.id` (scope id)
|
|
67
|
+
- **Optional**: `filter.realm`
|
|
51
68
|
- **Returns**: Promise<void>
|
|
52
69
|
|
|
53
70
|
### listDefaultOptionalClientScopes(filter)
|
|
@@ -56,35 +73,42 @@ Manage client scopes, protocol mappers, and role scope mappings.
|
|
|
56
73
|
|
|
57
74
|
### addDefaultOptionalClientScope(filter)
|
|
58
75
|
- **Required**: `filter.id` (scope id)
|
|
76
|
+
- **Optional**: `filter.realm`
|
|
59
77
|
- **Returns**: Promise<void>
|
|
60
78
|
|
|
61
79
|
### delDefaultOptionalClientScope(filter)
|
|
62
80
|
- **Required**: `filter.id` (scope id)
|
|
81
|
+
- **Optional**: `filter.realm`
|
|
63
82
|
- **Returns**: Promise<void>
|
|
64
83
|
|
|
65
84
|
## Protocol Mappers
|
|
66
85
|
|
|
67
86
|
### listProtocolMappers(filter)
|
|
68
87
|
- **Required**: `filter.id` (scope id)
|
|
88
|
+
- **Optional**: `filter.realm`
|
|
69
89
|
- **Returns**: Promise<Array<ProtocolMapperRepresentation>>
|
|
70
90
|
|
|
71
91
|
### findProtocolMapper(filter)
|
|
72
92
|
- **Required**: `filter.id` (scope id)
|
|
73
93
|
- **Required**: `filter.mapperId` (mapper id)
|
|
94
|
+
- **Optional**: `filter.realm`
|
|
74
95
|
- **Returns**: Promise<ProtocolMapperRepresentation>
|
|
75
96
|
|
|
76
97
|
### findProtocolMapperByName(filter)
|
|
77
98
|
- **Required**: `filter.id` (scope id)
|
|
78
99
|
- **Required**: `filter.name` (mapper name)
|
|
100
|
+
- **Optional**: `filter.realm`
|
|
79
101
|
- **Returns**: Promise<ProtocolMapperRepresentation>
|
|
80
102
|
|
|
81
103
|
### findProtocolMappersByProtocol(filter)
|
|
82
104
|
- **Required**: `filter.id` (scope id)
|
|
83
105
|
- **Required**: `filter.protocol` (`openid-connect` or `saml`)
|
|
106
|
+
- **Optional**: `filter.realm`
|
|
84
107
|
- **Returns**: Promise<Array<ProtocolMapperRepresentation>>
|
|
85
108
|
|
|
86
109
|
### addProtocolMapper(filter, protocolMapper)
|
|
87
110
|
- **Required**: `filter.id` (scope id)
|
|
111
|
+
- **Optional**: `filter.realm`
|
|
88
112
|
- **Required**: `protocolMapper.name`
|
|
89
113
|
- **Required**: `protocolMapper.protocol`
|
|
90
114
|
- **Required**: `protocolMapper.protocolMapper`
|
|
@@ -93,75 +117,89 @@ Manage client scopes, protocol mappers, and role scope mappings.
|
|
|
93
117
|
|
|
94
118
|
### addMultipleProtocolMappers(filter, protocolMappers)
|
|
95
119
|
- **Required**: `filter.id` (scope id)
|
|
120
|
+
- **Optional**: `filter.realm`
|
|
96
121
|
- **Required**: `protocolMappers` (Array<ProtocolMapperRepresentation>)
|
|
97
122
|
- **Returns**: Promise<void>
|
|
98
123
|
|
|
99
124
|
### updateProtocolMapper(filter, protocolMapper)
|
|
100
125
|
- **Required**: `filter.id` (scope id)
|
|
101
126
|
- **Required**: `filter.mapperId` (mapper id)
|
|
127
|
+
- **Optional**: `filter.realm`
|
|
102
128
|
- **Required**: `protocolMapper` (updated representation)
|
|
103
129
|
- **Returns**: Promise<void>
|
|
104
130
|
|
|
105
131
|
### delProtocolMapper(filter)
|
|
106
132
|
- **Required**: `filter.id` (scope id)
|
|
107
133
|
- **Required**: `filter.mapperId` (mapper id)
|
|
134
|
+
- **Optional**: `filter.realm`
|
|
108
135
|
- **Returns**: Promise<void>
|
|
109
136
|
|
|
110
137
|
## Client Scope Role Mappings (for one client scope)
|
|
111
138
|
|
|
112
139
|
### listScopeMappings(filter)
|
|
113
140
|
- **Required**: `filter.id` (scope id)
|
|
141
|
+
- **Optional**: `filter.realm`
|
|
114
142
|
- **Returns**: Promise<object>
|
|
115
143
|
|
|
116
144
|
### listAvailableClientScopeMappings(filter)
|
|
117
145
|
- **Required**: `filter.id` (scope id)
|
|
118
146
|
- **Required**: `filter.clientUniqueId` (client UUID)
|
|
147
|
+
- **Optional**: `filter.realm`
|
|
119
148
|
- **Returns**: Promise<Array<RoleRepresentation>>
|
|
120
149
|
|
|
121
150
|
### addClientScopeMappings(filter, roleRepresentation)
|
|
122
151
|
- **Required**: `filter.id` (scope id)
|
|
123
152
|
- **Required**: `filter.clientUniqueId` (client UUID)
|
|
153
|
+
- **Optional**: `filter.realm`
|
|
124
154
|
- **Required**: `roleRepresentation` (Array<{id,name}> or role-like object depending on endpoint)
|
|
125
155
|
- **Returns**: Promise<void>
|
|
126
156
|
|
|
127
157
|
### delClientScopeMappings(filter, roleRepresentation)
|
|
128
158
|
- **Required**: `filter.id` (scope id)
|
|
129
159
|
- **Required**: `filter.clientUniqueId` (client UUID)
|
|
160
|
+
- **Optional**: `filter.realm`
|
|
130
161
|
- **Required**: `roleRepresentation`
|
|
131
162
|
- **Returns**: Promise<void>
|
|
132
163
|
|
|
133
164
|
### listClientScopeMappings(filter)
|
|
134
165
|
- **Required**: `filter.id` (scope id)
|
|
135
166
|
- **Required**: `filter.clientUniqueId` (client UUID)
|
|
167
|
+
- **Optional**: `filter.realm`
|
|
136
168
|
- **Returns**: Promise<Array<RoleRepresentation>>
|
|
137
169
|
|
|
138
170
|
### listCompositeClientScopeMappings(filter)
|
|
139
171
|
- **Required**: `filter.id` (scope id)
|
|
140
172
|
- **Required**: `filter.clientUniqueId` (client UUID)
|
|
173
|
+
- **Optional**: `filter.realm`
|
|
141
174
|
- **Returns**: Promise<Array<RoleRepresentation>>
|
|
142
175
|
|
|
143
176
|
## Realm Scope Mappings (for one client scope)
|
|
144
177
|
|
|
145
178
|
### listAvailableRealmScopeMappings(filter)
|
|
146
179
|
- **Required**: `filter.id` (scope id)
|
|
180
|
+
- **Optional**: `filter.realm`
|
|
147
181
|
- **Returns**: Promise<Array<RoleRepresentation>>
|
|
148
182
|
|
|
149
183
|
### addRealmScopeMappings(filter, roleRepresentation)
|
|
150
184
|
- **Required**: `filter.id` (scope id)
|
|
185
|
+
- **Optional**: `filter.realm`
|
|
151
186
|
- **Required**: `roleRepresentation`
|
|
152
187
|
- **Returns**: Promise<void>
|
|
153
188
|
|
|
154
|
-
### delRealmScopeMappings(filter,
|
|
189
|
+
### delRealmScopeMappings(filter, roleRepresentation)
|
|
155
190
|
- **Required**: `filter.id` (scope id)
|
|
156
|
-
- **
|
|
191
|
+
- **Optional**: `filter.realm`
|
|
192
|
+
- **Required**: `roleRepresentation`
|
|
157
193
|
- **Returns**: Promise<void>
|
|
158
194
|
|
|
159
195
|
### listRealmScopeMappings(filter)
|
|
160
196
|
- **Required**: `filter.id` (scope id)
|
|
197
|
+
- **Optional**: `filter.realm`
|
|
161
198
|
- **Returns**: Promise<Array<RoleRepresentation>>
|
|
162
199
|
|
|
163
200
|
### listCompositeRealmScopeMappings(filter)
|
|
164
201
|
- **Required**: `filter.id` (scope id)
|
|
202
|
+
- **Optional**: `filter.realm`
|
|
165
203
|
- **Returns**: Promise<Array<RoleRepresentation>>
|
|
166
204
|
|
|
167
205
|
## Example
|
|
@@ -187,6 +225,16 @@ await KeycloakManager.clientScopes.addProtocolMapper(
|
|
|
187
225
|
}
|
|
188
226
|
}
|
|
189
227
|
);
|
|
228
|
+
|
|
229
|
+
await KeycloakManager.clientScopes.addRealmScopeMappings(
|
|
230
|
+
{ id: scope.id },
|
|
231
|
+
[{ id: realmRole.id, name: realmRole.name }]
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
await KeycloakManager.clientScopes.addClientScopeMappings(
|
|
235
|
+
{ id: scope.id, clientUniqueId: client.id },
|
|
236
|
+
[{ id: clientRole.id, name: clientRole.name }]
|
|
237
|
+
);
|
|
190
238
|
```
|
|
191
239
|
|
|
192
240
|
## See Also
|
package/docs/api/components.md
CHANGED
|
@@ -2,39 +2,108 @@
|
|
|
2
2
|
|
|
3
3
|
Manage Keycloak components (LDAP providers, Kerberos, user federation, storage mappers, and subcomponents).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Namespace: KeycloakManager.components
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Components represent pluggable server-side modules in Keycloak (for example user federation providers and their mappers).
|
|
10
|
+
This handler supports full CRUD plus sub-component listing.
|
|
6
11
|
|
|
7
12
|
## Methods
|
|
8
13
|
|
|
9
14
|
### create(componentRepresentation)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
|
|
16
|
+
Create a component.
|
|
17
|
+
|
|
18
|
+
Parameters:
|
|
19
|
+
|
|
20
|
+
- componentRepresentation (object, required): component payload.
|
|
21
|
+
|
|
22
|
+
Common fields:
|
|
23
|
+
|
|
24
|
+
- name (string, required): component name.
|
|
25
|
+
- providerId (string, required): provider implementation id (for example ldap).
|
|
26
|
+
- providerType (string, required): provider class/type.
|
|
27
|
+
- parentId (string, optional): usually realm id or parent component id.
|
|
28
|
+
- config (object, optional): provider config map (Keycloak convention often uses arrays of strings).
|
|
29
|
+
- subType (string, optional): subtype where applicable.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
|
|
33
|
+
- Promise<object>: creation response (usually includes id).
|
|
15
34
|
|
|
16
35
|
### find(filter)
|
|
17
|
-
|
|
18
|
-
|
|
36
|
+
|
|
37
|
+
List components.
|
|
38
|
+
|
|
39
|
+
Parameters:
|
|
40
|
+
|
|
41
|
+
- filter (object, optional):
|
|
42
|
+
- parent (string, optional): parent id.
|
|
43
|
+
- type (string, optional): provider type filter.
|
|
44
|
+
- name (string, optional): name filter.
|
|
45
|
+
- first (number, optional): pagination offset.
|
|
46
|
+
- max (number, optional): pagination limit.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
|
|
50
|
+
- Promise<Array<ComponentRepresentation>>
|
|
19
51
|
|
|
20
52
|
### findOne(filter)
|
|
21
|
-
|
|
22
|
-
|
|
53
|
+
|
|
54
|
+
Get a single component by id.
|
|
55
|
+
|
|
56
|
+
Parameters:
|
|
57
|
+
|
|
58
|
+
- filter (object, required):
|
|
59
|
+
- id (string, required): component id.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
|
|
63
|
+
- Promise<ComponentRepresentation>
|
|
23
64
|
|
|
24
65
|
### update(filter, componentRepresentation)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
66
|
+
|
|
67
|
+
Update an existing component.
|
|
68
|
+
|
|
69
|
+
Parameters:
|
|
70
|
+
|
|
71
|
+
- filter (object, required):
|
|
72
|
+
- id (string, required): component id.
|
|
73
|
+
- componentRepresentation (object, required): updated payload.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
|
|
77
|
+
- Promise<void>
|
|
28
78
|
|
|
29
79
|
### del(filter)
|
|
30
|
-
|
|
31
|
-
|
|
80
|
+
|
|
81
|
+
Delete a component by id.
|
|
82
|
+
|
|
83
|
+
Parameters:
|
|
84
|
+
|
|
85
|
+
- filter (object, required):
|
|
86
|
+
- id (string, required): component id.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
|
|
90
|
+
- Promise<void>
|
|
32
91
|
|
|
33
92
|
### listSubComponents(filter)
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
93
|
+
|
|
94
|
+
List sub-components for a parent component.
|
|
95
|
+
|
|
96
|
+
Parameters:
|
|
97
|
+
|
|
98
|
+
- filter (object, required):
|
|
99
|
+
- id (string, required): parent component id.
|
|
100
|
+
- type (string, required): sub-component provider type.
|
|
101
|
+
- first (number, optional): pagination offset.
|
|
102
|
+
- max (number, optional): pagination limit.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
|
|
106
|
+
- Promise<Array<ComponentRepresentation>>
|
|
38
107
|
|
|
39
108
|
## Example
|
|
40
109
|
|
|
@@ -50,6 +119,25 @@ const ldapComponent = await KeycloakManager.components.create({
|
|
|
50
119
|
bindDn: ['cn=admin,dc=company,dc=local']
|
|
51
120
|
}
|
|
52
121
|
});
|
|
122
|
+
|
|
123
|
+
const allLdapProviders = await KeycloakManager.components.find({
|
|
124
|
+
type: 'org.keycloak.storage.UserStorageProvider',
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const firstProvider = allLdapProviders[0];
|
|
128
|
+
|
|
129
|
+
if (firstProvider) {
|
|
130
|
+
await KeycloakManager.components.update(
|
|
131
|
+
{ id: firstProvider.id },
|
|
132
|
+
{
|
|
133
|
+
...firstProvider,
|
|
134
|
+
config: {
|
|
135
|
+
...(firstProvider.config || {}),
|
|
136
|
+
editMode: ['READ_ONLY'],
|
|
137
|
+
},
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
53
141
|
```
|
|
54
142
|
|
|
55
143
|
## See Also
|