keycloak-admin 1.0.24 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +6 -10
- data/README.md +68 -11
- data/bin/console +9 -0
- data/lib/keycloak-admin/client/client_client.rb +21 -0
- data/lib/keycloak-admin/client/group_client.rb +35 -1
- data/lib/keycloak-admin/client/role_client.rb +13 -0
- data/lib/keycloak-admin/representation/role_representation.rb +3 -1
- data/lib/keycloak-admin/version.rb +1 -1
- data/spec/client/client_client_spec.rb +62 -0
- data/spec/representation/role_representation_spec.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf6847f9dc60316780255644c15320d06a998331df2283e30a007c4bea951ba1
|
4
|
+
data.tar.gz: 4af207ec29032148c58ff23194f4ade85aec556718bb4896c00ec29fe95000a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e03b3d8ae4f5eac52399fefcbea427d34a5afc5e08475365a8166faa5031eebb7b87cff23393e16e91e2df0f50263023b29262addff9550f79ef7bb5c739637
|
7
|
+
data.tar.gz: 1c91e21ee8d74ba5ca05f773d20acdc11e3a6c8fd8ab3e8098cb75c7d44ed1c7763e3954b094012a5fe9000c1ff4cb048355e7a3a1f134b8911fc349b03919d9
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## [1.1.1] - 2024-01-21
|
9
|
+
|
10
|
+
* Add/List realm-role/s to a group, Allow role-names with spaces, List groups assigned to role (thanks to @LiquidMagical
|
11
|
+
)
|
12
|
+
|
13
|
+
## [1.1.0] - 2023-10-03
|
14
|
+
|
15
|
+
* Search for groups with parameters (thanks to @@tlloydthwaites)
|
16
|
+
* Get client by ID, Find client by Client ID, Update Client (thanks to @gee-forr)
|
17
|
+
|
8
18
|
## [1.0.24] - 2023-06-07
|
9
19
|
|
10
20
|
* Revert the modifications on the feature 'Update a User' introduced in `1.0.22`. This implementation had breaking changes such as not being able to update several attributes (`first_name`, `email`, etc).
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
keycloak-admin (1.
|
4
|
+
keycloak-admin (1.1.1)
|
5
5
|
http-cookie (~> 1.0, >= 1.0.3)
|
6
6
|
rest-client (~> 2.0)
|
7
7
|
|
@@ -10,14 +10,13 @@ GEM
|
|
10
10
|
specs:
|
11
11
|
byebug (11.1.3)
|
12
12
|
diff-lcs (1.5.0)
|
13
|
-
domain_name (0.
|
14
|
-
unf (>= 0.0.5, < 1.0.0)
|
13
|
+
domain_name (0.6.20240107)
|
15
14
|
http-accept (1.7.0)
|
16
15
|
http-cookie (1.0.5)
|
17
16
|
domain_name (~> 0.5)
|
18
|
-
mime-types (3.
|
17
|
+
mime-types (3.5.2)
|
19
18
|
mime-types-data (~> 3.2015)
|
20
|
-
mime-types-data (3.2023.
|
19
|
+
mime-types-data (3.2023.1205)
|
21
20
|
netrc (0.11.0)
|
22
21
|
rest-client (2.1.0)
|
23
22
|
http-accept (>= 1.7.0, < 2.0)
|
@@ -33,13 +32,10 @@ GEM
|
|
33
32
|
rspec-expectations (3.12.3)
|
34
33
|
diff-lcs (>= 1.2.0, < 2.0)
|
35
34
|
rspec-support (~> 3.12.0)
|
36
|
-
rspec-mocks (3.12.
|
35
|
+
rspec-mocks (3.12.6)
|
37
36
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
37
|
rspec-support (~> 3.12.0)
|
39
|
-
rspec-support (3.12.
|
40
|
-
unf (0.1.4)
|
41
|
-
unf_ext
|
42
|
-
unf_ext (0.0.8.2)
|
38
|
+
rspec-support (3.12.1)
|
43
39
|
|
44
40
|
PLATFORMS
|
45
41
|
ruby
|
data/README.md
CHANGED
@@ -21,7 +21,7 @@ To login on Keycloak's Admin API, you first need to setup a client.
|
|
21
21
|
|
22
22
|
Go to your realm administration page and open `Clients`. Then, click on the `Create` button.
|
23
23
|
On the first screen, enter:
|
24
|
-
* `Client ID`: _e.g. my-app-admin-client_
|
24
|
+
* `Client ID`: _e.g. my-app-admin-client_
|
25
25
|
* `Client Protocol`: select `openid-connect`
|
26
26
|
* `Root URL`: let it blank
|
27
27
|
|
@@ -45,7 +45,7 @@ The next screen must be configured depending on how you want to authenticate:
|
|
45
45
|
* In this gem's configuration (see Section `Configuration`):
|
46
46
|
* Setup `username` and `password` according to your user's configuration
|
47
47
|
* Setup `client_id` with your `Client ID` (_e.g. my-app-admin-client_)
|
48
|
-
* If your client is `confidential`, copy its Client Secret to `client_secret`
|
48
|
+
* If your client is `confidential`, copy its Client Secret to `client_secret`
|
49
49
|
|
50
50
|
### Login with `Direct Access Grants` (Service account)
|
51
51
|
|
@@ -60,15 +60,15 @@ Using a service account to use the REST Admin API does not require to create a d
|
|
60
60
|
* After saving this client
|
61
61
|
* open the `Service Account Roles` and add relevant `realm-management.` client's roles. For instance: `view-users` if you want to search for users using this gem.
|
62
62
|
* open the `Credentials` tab and copy the `Client Secret`
|
63
|
-
|
63
|
+
|
64
64
|
* In this gem's configuration (see Section `Configuration`):
|
65
65
|
* Set `use_service_account` to `true`
|
66
66
|
* Setup `client_id` with your `Client ID` (_e.g. my-app-admin-client_)
|
67
|
-
* Copy its Client Secret to `client_secret`
|
67
|
+
* Copy its Client Secret to `client_secret`
|
68
68
|
|
69
69
|
## Configuration
|
70
70
|
|
71
|
-
To configure this gem, call `KeycloakAdmin.configure`.
|
71
|
+
To configure this gem, call `KeycloakAdmin.configure`.
|
72
72
|
For instance, to configure this gem based on environment variables, write (and load if required) a `keycloak_admin.rb`:
|
73
73
|
```ruby
|
74
74
|
KeycloakAdmin.configure do |config|
|
@@ -96,14 +96,14 @@ All options have a default value. However, all of them can be changed in your in
|
|
96
96
|
| `client_realm_name` | `""`| String | Required | Name of the realm that contains the admin client. | `master` |
|
97
97
|
| `client_id` | `admin-cli`| String | Required | Client that should be used to access admin capabilities. | `api-cli` |
|
98
98
|
| `client_secret` | `nil`| String | Optional | If your client is `confidential`, this parameter must be specified. | `4e3c481c-f823-4a6a-b8a7-bf8c86e3eac3` |
|
99
|
-
| `use_service_account` | `true` | Boolean | Required | `true` if the connection to the client uses a Service Account. `false` if the connection to the client uses a username/password credential. | `false` |
|
99
|
+
| `use_service_account` | `true` | Boolean | Required | `true` if the connection to the client uses a Service Account. `false` if the connection to the client uses a username/password credential. | `false` |
|
100
100
|
| `username` | `nil`| String | Optional | Username to access the Admin REST API. Recommended if `user_service_account` is set to `false`. | `mummy` |
|
101
101
|
| `password` | `nil`| String | Optional | Clear password to access the Admin REST API. Recommended if `user_service_account` is set to `false`. | `bobby` |
|
102
102
|
| `logger` | `Logger.new(STDOUT)`| Logger | Optional | The logger used by `keycloak-admin` | `Rails.logger` |
|
103
103
|
| `rest_client_options` | `{}`| Hash | Optional | Options to pass to `RestClient` | `{ verify_ssl: OpenSSL::SSL::VERIFY_NONE }` |
|
104
104
|
|
105
105
|
|
106
|
-
## Use
|
106
|
+
## Use Cases
|
107
107
|
|
108
108
|
### Supported features
|
109
109
|
|
@@ -113,13 +113,15 @@ All options have a default value. However, all of them can be changed in your in
|
|
113
113
|
* Reset credentials
|
114
114
|
* Impersonate a user
|
115
115
|
* Exchange a configurable token
|
116
|
-
* Get list of clients
|
117
|
-
* Create clients
|
116
|
+
* Get list of clients, or find a client by its id or client_id
|
117
|
+
* Create, update, and delete clients
|
118
118
|
* Get list of groups, create/save a group
|
119
119
|
* Get list of roles, save a role
|
120
120
|
* Get list of realms, save/update/delete a realm
|
121
121
|
* Get list of client role mappings for a user/group
|
122
122
|
* Get list of members of a group
|
123
|
+
* Get list of groups that have a specific role assigned
|
124
|
+
* Get list of realm-roles assigned to a group, add a realm-role to a group
|
123
125
|
* Save client role mappings for a user/group
|
124
126
|
* Save realm-level role mappings for a user/group
|
125
127
|
* Add a Group on a User
|
@@ -279,10 +281,26 @@ KeycloakAdmin.realm("a_realm").delete
|
|
279
281
|
|
280
282
|
### Get list of clients in a realm
|
281
283
|
|
282
|
-
Returns an array of `KeycloakAdmin::ClientRepresentation
|
284
|
+
Returns an array of `KeycloakAdmin::ClientRepresentation` or a single `KeycloakAdmin::ClientRepresentation`
|
285
|
+
|
286
|
+
Finding a client by its `client_id` is a somewhat slow operation, as it requires fetching all clients and then filtering. Keycloak's API does not support fetching a client by its `client_id` directly.
|
283
287
|
|
284
288
|
```ruby
|
285
289
|
KeycloakAdmin.realm("a_realm").clients.list
|
290
|
+
KeycloakAdmin.realm("a_realm").clients.get(id) # id is Keycloak's database id, not the client_id
|
291
|
+
KeycloakAdmin.realm("a_realm").clients.find_by_client_id(client_id)
|
292
|
+
```
|
293
|
+
|
294
|
+
### Updating a client
|
295
|
+
|
296
|
+
```ruby
|
297
|
+
my_client = KeycloakAdmin.realm("a_realm").clients.get(id)
|
298
|
+
|
299
|
+
my_client.name = "My new client name"
|
300
|
+
my_client.description = "This is a new description"
|
301
|
+
my_client.redirect_uris << "https://www.example.com/auth/callback"
|
302
|
+
|
303
|
+
KeycloakAdmin.realm("a_realm").clients.update(client) # Returns the updated client
|
286
304
|
```
|
287
305
|
|
288
306
|
### Get list of groups in a realm
|
@@ -293,6 +311,22 @@ Returns an array of `KeycloakAdmin::GroupRepresentation`.
|
|
293
311
|
KeycloakAdmin.realm("a_realm").groups.list
|
294
312
|
```
|
295
313
|
|
314
|
+
### Search for a group
|
315
|
+
|
316
|
+
Returns an array of `KeycloakAdmin::GroupRepresentation`.
|
317
|
+
|
318
|
+
According to [the documentation](https://www.keycloak.org/docs-api/22.0.1/rest-api/index.html#_groups):
|
319
|
+
* When providing a `String` parameter, this produces an arbitrary search string
|
320
|
+
* When providing a `Hash`, you can specify other fields (_e.g_ q, max, first)
|
321
|
+
|
322
|
+
```ruby
|
323
|
+
KeycloakAdmin.realm("a_realm").groups.search("MyGroup")
|
324
|
+
```
|
325
|
+
|
326
|
+
```ruby
|
327
|
+
KeycloakAdmin.realm("a_realm").groups.search({query: "MyGroup", exact: true, max: 1})
|
328
|
+
```
|
329
|
+
|
296
330
|
### Save a group
|
297
331
|
|
298
332
|
Returns the id of saved `group` provided, which must be of type `KeycloakAdmin::GroupRepresentation`.
|
@@ -335,6 +369,30 @@ You can specify paging with `first` and `max`:
|
|
335
369
|
KeycloakAdmin.realm("a_realm").group("group_id").members(first:0, max:100)
|
336
370
|
```
|
337
371
|
|
372
|
+
### Get list of groups that have a specific role assigned
|
373
|
+
|
374
|
+
Returns an array of `KeycloakAdmin::GroupRepresentation`
|
375
|
+
|
376
|
+
```ruby
|
377
|
+
KeycloakAdmin.realm("a_realm").roles.list_groups("role_name")
|
378
|
+
```
|
379
|
+
|
380
|
+
### Get list of realm-roles assigned to a group
|
381
|
+
|
382
|
+
Returns an array of `KeycloakAdmin::RoleRepresentation`
|
383
|
+
|
384
|
+
```ruby
|
385
|
+
KeycloakAdmin.realm("a_realm").groups.get_realm_level_roles("group_id")
|
386
|
+
```
|
387
|
+
|
388
|
+
### Add a realm-role to a group
|
389
|
+
|
390
|
+
Returns added `KeycloakAdmin::RoleRepresentation`
|
391
|
+
|
392
|
+
```ruby
|
393
|
+
KeycloakAdmin.realm("a_realm").groups.add_realm_level_role_name!("group_id", "role_name")
|
394
|
+
```
|
395
|
+
|
338
396
|
### Get list of roles in a realm
|
339
397
|
|
340
398
|
Returns an array of `KeycloakAdmin::RoleRepresentation`.
|
@@ -415,4 +473,3 @@ From the `keycloak-admin-api` directory:
|
|
415
473
|
$ docker build . -t keycloak-admin:test
|
416
474
|
$ docker run -v `pwd`:/usr/src/app/ keycloak-admin:test rspec spec
|
417
475
|
```
|
418
|
-
|
data/bin/console
ADDED
@@ -6,6 +6,13 @@ module KeycloakAdmin
|
|
6
6
|
@realm_client = realm_client
|
7
7
|
end
|
8
8
|
|
9
|
+
def get(id)
|
10
|
+
response = execute_http do
|
11
|
+
RestClient::Resource.new(clients_url(id), @configuration.rest_client_options).get(headers)
|
12
|
+
end
|
13
|
+
ClientRepresentation.from_hash(JSON.parse(response))
|
14
|
+
end
|
15
|
+
|
9
16
|
def save(client_representation)
|
10
17
|
execute_http do
|
11
18
|
RestClient::Resource.new(clients_url, @configuration.rest_client_options).post(
|
@@ -21,6 +28,10 @@ module KeycloakAdmin
|
|
21
28
|
JSON.parse(response).map { |client_as_hash| ClientRepresentation.from_hash(client_as_hash) }
|
22
29
|
end
|
23
30
|
|
31
|
+
def find_by_client_id(client_id)
|
32
|
+
list.find { |client| client.client_id == client_id }
|
33
|
+
end
|
34
|
+
|
24
35
|
def delete(id)
|
25
36
|
execute_http do
|
26
37
|
RestClient::Resource.new(clients_url(id), @configuration.rest_client_options).delete(headers)
|
@@ -28,6 +39,16 @@ module KeycloakAdmin
|
|
28
39
|
true
|
29
40
|
end
|
30
41
|
|
42
|
+
def update(client_representation)
|
43
|
+
execute_http do
|
44
|
+
RestClient::Resource.new(clients_url(client_representation.id), @configuration.rest_client_options).put(
|
45
|
+
create_payload(client_representation), headers
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
get(client_representation.id)
|
50
|
+
end
|
51
|
+
|
31
52
|
def get_service_account_user(client_id)
|
32
53
|
response = execute_http do
|
33
54
|
RestClient::Resource.new(service_account_user_url(client_id), @configuration.rest_client_options).get(headers)
|
@@ -7,8 +7,20 @@ module KeycloakAdmin
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def list
|
10
|
+
search(nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
def search(query)
|
14
|
+
derived_headers = case query
|
15
|
+
when String
|
16
|
+
headers.merge({params: { search: query }})
|
17
|
+
when Hash
|
18
|
+
headers.merge({params: query })
|
19
|
+
else
|
20
|
+
headers
|
21
|
+
end
|
10
22
|
response = execute_http do
|
11
|
-
RestClient::Resource.new(groups_url, @configuration.rest_client_options).get(
|
23
|
+
RestClient::Resource.new(groups_url, @configuration.rest_client_options).get(derived_headers)
|
12
24
|
end
|
13
25
|
JSON.parse(response).map { |group_as_hash| GroupRepresentation.from_hash(group_as_hash) }
|
14
26
|
end
|
@@ -49,6 +61,28 @@ module KeycloakAdmin
|
|
49
61
|
JSON.parse(response).map { |user_as_hash| UserRepresentation.from_hash(user_as_hash) }
|
50
62
|
end
|
51
63
|
|
64
|
+
# Gets all realm-level roles for a group
|
65
|
+
def get_realm_level_roles(group_id)
|
66
|
+
url = "#{groups_url(group_id)}/role-mappings/realm"
|
67
|
+
response = execute_http do
|
68
|
+
RestClient::Resource.new(url, @configuration.rest_client_options).get(headers)
|
69
|
+
end
|
70
|
+
JSON.parse(response).map { |role_as_hash| RoleRepresentation.from_hash(role_as_hash) }
|
71
|
+
end
|
72
|
+
|
73
|
+
# Adds a realm-level role to a group via the role name
|
74
|
+
def add_realm_level_role_name!(group_id, role_name)
|
75
|
+
# creates a full role-representation object needed by the keycloak api to work
|
76
|
+
role_representation = RoleClient.new(@configuration, @realm_client).get(role_name)
|
77
|
+
url = "#{groups_url(group_id)}/role-mappings/realm"
|
78
|
+
response = execute_http do
|
79
|
+
RestClient::Resource.new(url, @configuration.rest_client_options).post(
|
80
|
+
create_payload([role_representation]), headers
|
81
|
+
)
|
82
|
+
end
|
83
|
+
role_representation
|
84
|
+
end
|
85
|
+
|
52
86
|
def groups_url(id=nil)
|
53
87
|
if id
|
54
88
|
"#{@realm_client.realm_admin_url}/groups/#{id}"
|
@@ -13,13 +13,26 @@ module KeycloakAdmin
|
|
13
13
|
JSON.parse(response).map { |role_as_hash| RoleRepresentation.from_hash(role_as_hash) }
|
14
14
|
end
|
15
15
|
|
16
|
+
# Returns the role representation for the specified role name
|
16
17
|
def get(name)
|
18
|
+
# allows special characters in the name like space
|
19
|
+
name = URI.encode_uri_component(name)
|
17
20
|
response = execute_http do
|
18
21
|
RestClient::Resource.new(role_name_url(name), @configuration.rest_client_options).get(headers)
|
19
22
|
end
|
20
23
|
RoleRepresentation.from_hash JSON.parse(response)
|
21
24
|
end
|
22
25
|
|
26
|
+
# Lists all groups that have the specified role name assigned
|
27
|
+
def list_groups(name)
|
28
|
+
# allows special characters in the name like space
|
29
|
+
name = URI.encode_uri_component(name)
|
30
|
+
response = execute_http do
|
31
|
+
RestClient::Resource.new("#{role_name_url(name)}/groups", @configuration.rest_client_options).get(headers)
|
32
|
+
end
|
33
|
+
JSON.parse(response).map { |role_as_hash| GroupRepresentation.from_hash(role_as_hash) }
|
34
|
+
end
|
35
|
+
|
23
36
|
def save(role_representation)
|
24
37
|
execute_http do
|
25
38
|
RestClient::Resource.new(roles_url, @configuration.rest_client_options).post(
|
@@ -3,7 +3,8 @@ module KeycloakAdmin
|
|
3
3
|
attr_accessor :id,
|
4
4
|
:name,
|
5
5
|
:composite,
|
6
|
-
:client_role
|
6
|
+
:client_role,
|
7
|
+
:container_id,
|
7
8
|
|
8
9
|
def self.from_hash(hash)
|
9
10
|
role = new
|
@@ -11,6 +12,7 @@ module KeycloakAdmin
|
|
11
12
|
role.name = hash["name"]
|
12
13
|
role.composite = hash["composite"]
|
13
14
|
role.client_role = hash["clientRole"]
|
15
|
+
role.container_id = hash["containerId"]
|
14
16
|
role
|
15
17
|
end
|
16
18
|
end
|
@@ -22,6 +22,49 @@ RSpec.describe KeycloakAdmin::ClientClient do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
describe "#get" do
|
26
|
+
let(:realm_name) { "valid-realm" }
|
27
|
+
let(:id) { "test_client_id" }
|
28
|
+
let(:client_name) { "test_client_name" }
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
@client_client = KeycloakAdmin.realm(realm_name).clients
|
32
|
+
|
33
|
+
stub_token_client
|
34
|
+
allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '{"id":"test_client_id","name":"test_client_name"}'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "finds a client" do
|
38
|
+
client = @client_client.get(id)
|
39
|
+
expect(client.name).to eq client_name
|
40
|
+
expect(client.id).to eq id
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#find_by_client_id" do
|
45
|
+
let(:realm_name) { "valid-realm" }
|
46
|
+
let(:client_id) { "my_client_id" }
|
47
|
+
let(:client_name) { "test_client_name" }
|
48
|
+
|
49
|
+
before(:each) do
|
50
|
+
@client_client = KeycloakAdmin.realm(realm_name).clients
|
51
|
+
|
52
|
+
stub_token_client
|
53
|
+
allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '[{"id":"test_client_id","clientId": "my_client_id","name":"test_client_name"},{"id":"test_client_id_2","clientId":"client_id_2","name":"test_client_name_2"}]'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "finds a client it has" do
|
57
|
+
client = @client_client.find_by_client_id(client_id)
|
58
|
+
expect(client.name).to eq client_name
|
59
|
+
expect(client.client_id).to eq client_id
|
60
|
+
end
|
61
|
+
|
62
|
+
it "returns nil if it doesn't have the client" do
|
63
|
+
client = @client_client.find_by_client_id("client_id_3")
|
64
|
+
expect(client).to be_nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
25
68
|
describe "#list" do
|
26
69
|
let(:realm_name) { "valid-realm" }
|
27
70
|
|
@@ -51,6 +94,25 @@ RSpec.describe KeycloakAdmin::ClientClient do
|
|
51
94
|
end
|
52
95
|
end
|
53
96
|
|
97
|
+
describe "#update" do
|
98
|
+
let(:realm_name) { "valid-realm" }
|
99
|
+
let(:client) { KeycloakAdmin::ClientRepresentation.from_hash({ "id" => "test_client_id", "clientId" => "my-client", "name" => "old_name" }) }
|
100
|
+
|
101
|
+
before(:each) do
|
102
|
+
@client_client = KeycloakAdmin.realm(realm_name).clients
|
103
|
+
|
104
|
+
stub_token_client
|
105
|
+
allow_any_instance_of(RestClient::Resource).to receive(:put).and_return ''
|
106
|
+
allow_any_instance_of(RestClient::Resource).to receive(:get).and_return '{"id":"test_client_id", "clientId": "my-client","name":"new_name"}'
|
107
|
+
end
|
108
|
+
|
109
|
+
it "updates a client" do
|
110
|
+
updated_client = @client_client.update(client)
|
111
|
+
|
112
|
+
expect(updated_client.name).to eq "new_name"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
54
116
|
describe "#delete" do
|
55
117
|
let(:realm_name) { "valid-realm" }
|
56
118
|
|
@@ -12,7 +12,7 @@ RSpec.describe KeycloakAdmin::RoleRepresentation do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "can convert to json" do
|
15
|
-
expect(@mapper.to_json).to eq "{\"id\":\"bb79fb10-a7b4-4728-a662-82a4de7844a3\",\"name\":\"abcd\",\"composite\":true,\"clientRole\":false}"
|
15
|
+
expect(@mapper.to_json).to eq "{\"id\":\"bb79fb10-a7b4-4728-a662-82a4de7844a3\",\"name\":\"abcd\",\"composite\":true,\"clientRole\":false,\"containerId\":null}"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -31,7 +31,7 @@ RSpec.describe KeycloakAdmin::RoleRepresentation do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it "can convert to json" do
|
34
|
-
expect(@mappers.to_json).to eq "[{\"id\":\"bb79fb10-a7b4-4728-a662-82a4de7844a3\",\"name\":\"abcd\",\"composite\":true,\"clientRole\":false}]"
|
34
|
+
expect(@mappers.to_json).to eq "[{\"id\":\"bb79fb10-a7b4-4728-a662-82a4de7844a3\",\"name\":\"abcd\",\"composite\":true,\"clientRole\":false,\"containerId\":null}]"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keycloak-admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorent Lempereur
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-cookie
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- Gemfile.lock
|
88
88
|
- MIT-LICENSE
|
89
89
|
- README.md
|
90
|
+
- bin/console
|
90
91
|
- keycloak-admin.gemspec
|
91
92
|
- lib/keycloak-admin.rb
|
92
93
|
- lib/keycloak-admin/client/attack_detection_client.rb
|