keycloak 1.0.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9b66ff5c33100fbe4a1221a3ad0fe8899c26de8
4
- data.tar.gz: ca9645e61cb4ae023a988f0fc50ba7cebc943236
3
+ metadata.gz: 664d5f8c6abad5cc3a139175fe7125f9ca41342a
4
+ data.tar.gz: 4e3c751dd137ba1081acf6a4e1c968c762459210
5
5
  SHA512:
6
- metadata.gz: 5ce5a1507693b069e489f4355caa64a6530697bb837c8b3e3f798f511f660f8a209e5f6af5b5a1bb1912fe6c0a5a94729f6e8c8c74083e106e3fada6159c2322
7
- data.tar.gz: 0b976a1c591ef4b1089e485ead5db390838dff1781a4a5b633952cee3508625b890a7d98bc79a35e287517fd16a6e4d5c8c36b3b73fe0a7a629e48382e7e1975
6
+ metadata.gz: 947e8843b23edd19b26120fb7f2b505e75e316600eaa4855dbf0c39047e0813c8272e386d2180b9b794d6d95550f2e41b72f18213e18f0141d05ed455c571c16
7
+ data.tar.gz: 174f31ed0058103d9e83f859fb821fa47bf0e21846ac88de822987d8ce582df71d93b302539c3305d3c17047dab441265f33d697c646fa1e8eaac9c2080b8933
@@ -4,11 +4,14 @@ class InitializerGenerator < Rails::Generators::Base
4
4
  proxy = ""
5
5
  generate_request_exception = true
6
6
  "# Set proxy to connect in keycloak server
7
- Keycloak::proxy = #{proxy}
7
+ Keycloak.proxy = #{proxy}
8
8
  # If true, then all request exception will explode in application (this is the default value)
9
- Keycloak::generate_request_exception = #{generate_request_exception}
9
+ Keycloak.generate_request_exception = #{generate_request_exception}
10
10
  # controller that manage the user session
11
- Keycloak::keycloak_controller = 'session'"
11
+ Keycloak.keycloak_controller = 'session'
12
+ # internal user for admin tasks
13
+ Keycloak::Internal.admin_user = ''
14
+ Keycloak::Internal.admin_password = ''"
12
15
  end
13
16
  end
14
17
  end
@@ -7,16 +7,17 @@ require 'uri'
7
7
 
8
8
  module Keycloak
9
9
 
10
- class << self
11
- attr_accessor :proxy, :generate_request_exception, :keycloak_controller
10
+ class << self
11
+ attr_accessor :proxy, :generate_request_exception, :keycloak_controller,
12
+ :last_response
12
13
  end
13
14
 
14
15
 
15
16
  def self.explode_exception
16
- if Keycloak::generate_request_exception == nil
17
- Keycloak::generate_request_exception = true
17
+ if Keycloak.generate_request_exception == nil
18
+ Keycloak.generate_request_exception = true
18
19
  end
19
- Keycloak::generate_request_exception
20
+ Keycloak.generate_request_exception
20
21
  end
21
22
 
22
23
  module Client
@@ -39,11 +40,11 @@ module Keycloak
39
40
  @user, @password = user, password
40
41
 
41
42
  payload = {'client_id' => @client_id,
42
- 'client_secret' => @secret,
43
- 'username' => @user,
44
- 'password' => @password,
45
- 'grant_type' => 'password'
46
- }
43
+ 'client_secret' => @secret,
44
+ 'username' => @user,
45
+ 'password' => @password,
46
+ 'grant_type' => 'password'
47
+ }
47
48
 
48
49
  mount_request_token(payload)
49
50
  end
@@ -207,13 +208,13 @@ module Keycloak
207
208
  KEYCLOACK_CONTROLLER_DEFAULT = 'session'
208
209
 
209
210
  def self.setup_module
210
- Keycloak::proxy ||= ''
211
- Keycloak::keycloak_controller ||= KEYCLOACK_CONTROLLER_DEFAULT
211
+ Keycloak.proxy ||= ''
212
+ Keycloak.keycloak_controller ||= KEYCLOACK_CONTROLLER_DEFAULT
212
213
  get_installation
213
214
  end
214
215
 
215
216
  def self.exec_request(proc_request)
216
- if Keycloak::explode_exception
217
+ if Keycloak.explode_exception
217
218
  proc_request.call
218
219
  else
219
220
  begin
@@ -225,7 +226,7 @@ module Keycloak
225
226
  end
226
227
 
227
228
  def self.openid_configuration
228
- RestClient.proxy = Keycloak::proxy unless Keycloak::proxy.empty?
229
+ RestClient.proxy = Keycloak.proxy unless Keycloak.proxy.empty?
229
230
  full_url = "#{@url}/realms/#{@realm}/.well-known/openid-configuration"
230
231
  _request = -> do
231
232
  RestClient.get full_url
@@ -260,7 +261,7 @@ module Keycloak
260
261
  if @token["id_token"]
261
262
  @decoded_id_token = JWT.decode @token["id_token"], @public_key, false, { :algorithm => 'RS256' }
262
263
  end
263
- Keycloak::Admin::setup_admin(@auth_server_url, @realm, @token["access_token"])
264
+ Keycloak::Admin.setup_admin(@auth_server_url, @realm, @token["access_token"])
264
265
  @token
265
266
  else
266
267
  response.return!
@@ -277,7 +278,7 @@ module Keycloak
277
278
  module Admin
278
279
 
279
280
  class << self
280
- attr_reader :access_token, :auth_server_url, :realm, :last_response
281
+ attr_reader :access_token, :auth_server_url, :realm
281
282
  end
282
283
 
283
284
  def self.setup_admin(auth_server_url, realm, access_token)
@@ -311,13 +312,16 @@ module Keycloak
311
312
  end
312
313
 
313
314
  def self.revoke_consent_user(id, clientID = nil)
314
- if !clientID
315
+ if clientID.nil?
315
316
  clientID = Keycloak::Client.client_id
316
317
  end
317
318
  generic_delete("users/#{id}/consents/#{clientID}")
318
319
  end
319
320
 
320
321
  def self.update_account_email(id, actions, redirectUri = '', clientID = nil)
322
+ if clientID.nil?
323
+ clientID = Keycloak::Client.client_id
324
+ end
321
325
  generic_put("users/#{id}/execute-actions-email", {:redirect_uri => redirectUri, :client_id => clientID}, actions)
322
326
  end
323
327
 
@@ -403,19 +407,19 @@ module Keycloak
403
407
  # Generics methods
404
408
 
405
409
  def self.generic_get(service, queryParameters = nil)
406
- generic_request(service, queryParameters, nil, 'GET')
410
+ Keycloak.generic_request(@access_token, full_url(service), queryParameters, nil, 'GET')
407
411
  end
408
412
 
409
413
  def self.generic_post(service, queryParameters, bodyParameter)
410
- generic_request(service, queryParameters, bodyParameter, 'POST')
414
+ Keycloak.generic_request(@access_token, full_url(service), queryParameters, bodyParameter, 'POST')
411
415
  end
412
416
 
413
417
  def self.generic_put(service, queryParameters, bodyParameter)
414
- generic_request(service, queryParameters, bodyParameter, 'PUT')
418
+ Keycloak.generic_request(@access_token, full_url(service), queryParameters, bodyParameter, 'PUT')
415
419
  end
416
420
 
417
421
  def self.generic_delete(service, queryParameters = nil, bodyParameter = nil)
418
- generic_request(service, queryParameters, bodyParameter, 'DELETE')
422
+ Keycloak.generic_request(@access_token, full_url(service), queryParameters, bodyParameter, 'DELETE')
419
423
  end
420
424
 
421
425
  private
@@ -424,86 +428,184 @@ module Keycloak
424
428
  @auth_server_url + "/admin/realms/#{@realm}/"
425
429
  end
426
430
 
427
- def self.generic_request(service, queryParameters, bodyParameter, method)
428
- final_url = base_url + service
431
+ def self.full_url(service)
432
+ base_url + service
433
+ end
434
+
435
+ end
429
436
 
430
- header = {'Content-Type' => 'application/x-www-form-urlencoded',
431
- 'Authorization' => "Bearer #{@access_token}"}
437
+ module Internal
438
+ include Keycloak::Admin
432
439
 
433
- if queryParameters
434
- parameters = URI.encode_www_form(queryParameters)
435
- final_url = final_url << '?' << parameters
436
- end
440
+ class << self
441
+ attr_accessor :admin_user, :admin_password
442
+ end
443
+
444
+ def self.forgot_password(userID, redirectURI)
445
+ proc = lambda {|token|
446
+ Keycloak.generic_request(token["access_token"],
447
+ Keycloak::Client.auth_server_url + "/admin/realms/#{Keycloak::Client.realm}/users/#{userID}/execute-actions-email",
448
+ {:redirect_uri => redirectURI, :client_id => Keycloak::Client.client_id},
449
+ ['UPDATE_PASSWORD'],
450
+ 'PUT')
451
+ }
452
+
453
+ default_call(proc)
454
+
455
+ end
456
+
457
+ def self.get_logged_user_info
458
+ proc = lambda {|token|
459
+ userinfo = Keycloak::Client.get_userinfo
460
+ Keycloak.generic_request(token["access_token"],
461
+ Keycloak::Client.auth_server_url + "/admin/realms/#{Keycloak::Client.realm}/users/#{userinfo['sub']}",
462
+ nil, nil, 'GET')
463
+ }
464
+
465
+ default_call(proc)
466
+ end
467
+
468
+ def self.is_logged_federation_user?
469
+ info = get_logged_user_info
470
+ info['federationLink'] != nil
471
+ end
472
+
473
+ protected
474
+
475
+ def self.default_call(proc)
476
+ begin
477
+ tk = nil
478
+ resp = nil
479
+
480
+ Keycloak::Client.get_installation
481
+
482
+ payload = {'client_id' => Keycloak::Client.client_id,
483
+ 'client_secret' => Keycloak::Client.secret,
484
+ 'username' => @admin_user,
485
+ 'password' => @admin_password,
486
+ 'grant_type' => 'password'
487
+ }
488
+
489
+ header = {'Content-Type' => 'application/x-www-form-urlencoded'}
437
490
 
438
- case method.upcase
439
- when 'GET'
440
491
  _request = -> do
441
- RestClient.get(final_url, header){|response, request, result|
442
- rescue_response(response)
492
+ RestClient.post(Keycloak::Client.configuration['token_endpoint'], payload, header){|response, request, result|
493
+ case response.code
494
+ when 200..399
495
+ tk = JSON response.body
496
+ resp = proc.call(tk)
497
+ else
498
+ response.return!
499
+ end
443
500
  }
444
501
  end
445
- when 'POST', 'PUT'
446
- header["Content-Type"] = 'application/json'
447
- parameters = JSON.generate bodyParameter
448
- _request = -> do
449
- case method.upcase
450
- when 'POST'
451
- RestClient.post(final_url, parameters, header){|response, request, result|
452
- rescue_response(response)
453
- }
454
- else
455
- RestClient.put(final_url, parameters, header){|response, request, result|
456
- rescue_response(response)
457
- }
458
- end
459
- end
460
- when 'DELETE'
461
- _request = -> do
462
- if bodyParameter
463
- header["Content-Type"] = 'application/json'
464
- parameters = JSON.generate bodyParameter
465
- RestClient::Request.execute(method: :delete, url: final_url,
466
- payload: parameters, headers: header){|response, request, result|
467
- rescue_response(response)
468
- }
469
- else
470
- RestClient.delete(final_url, header){|response, request, result|
471
- rescue_response(response)
502
+
503
+ Keycloak::Client.exec_request _request
504
+ ensure
505
+ if tk
506
+ payload = {'client_id' => Keycloak::Client.client_id,
507
+ 'client_secret' => Keycloak::Client.secret,
508
+ 'refresh_token' => tk["refresh_token"]
509
+ }
510
+
511
+ header = {'Content-Type' => 'application/x-www-form-urlencoded'}
512
+ _request = -> do
513
+ RestClient.post(Keycloak::Client.configuration['end_session_endpoint'], payload, header){|response, request, result|
514
+ case response.code
515
+ when 200..399
516
+ resp if resp.nil?
517
+ else
518
+ response.return!
519
+ end
472
520
  }
473
521
  end
522
+ Keycloak::Client.exec_request _request
474
523
  end
475
- else
476
- raise
477
524
  end
525
+ end
478
526
 
479
- _request.call
527
+ end
528
+
529
+ private
530
+
531
+ def self.generic_request(accessToken, uri, queryParameters, bodyParameter, method)
532
+ final_url = uri
533
+
534
+ header = {'Content-Type' => 'application/x-www-form-urlencoded',
535
+ 'Authorization' => "Bearer #{accessToken}"}
480
536
 
537
+ if queryParameters
538
+ parameters = URI.encode_www_form(queryParameters)
539
+ final_url = final_url << '?' << parameters
481
540
  end
482
541
 
483
- def self.rescue_response(response)
484
- @last_response = response
485
- case @last_response.code
486
- when 200..399
487
- if @last_response.body.empty?
488
- true
542
+ case method.upcase
543
+ when 'GET'
544
+ _request = -> do
545
+ RestClient.get(final_url, header){|response, request, result|
546
+ rescue_response(response)
547
+ }
548
+ end
549
+ when 'POST', 'PUT'
550
+ header["Content-Type"] = 'application/json'
551
+ parameters = JSON.generate bodyParameter
552
+ _request = -> do
553
+ case method.upcase
554
+ when 'POST'
555
+ RestClient.post(final_url, parameters, header){|response, request, result|
556
+ rescue_response(response)
557
+ }
489
558
  else
490
- @last_response.body
559
+ RestClient.put(final_url, parameters, header){|response, request, result|
560
+ rescue_response(response)
561
+ }
491
562
  end
492
- else
493
- if Keycloak::explode_exception
494
- @last_response.return!
563
+ end
564
+ when 'DELETE'
565
+ _request = -> do
566
+ if bodyParameter
567
+ header["Content-Type"] = 'application/json'
568
+ parameters = JSON.generate bodyParameter
569
+ RestClient::Request.execute(method: :delete, url: final_url,
570
+ payload: parameters, headers: header){|response, request, result|
571
+ rescue_response(response)
572
+ }
495
573
  else
496
- begin
497
- @last_response.return!
498
- rescue RestClient::ExceptionWithResponse => err
499
- err.response
500
- rescue Exception => e
501
- e.message
502
- end
574
+ RestClient.delete(final_url, header){|response, request, result|
575
+ rescue_response(response)
576
+ }
503
577
  end
504
578
  end
579
+ else
580
+ raise
505
581
  end
506
582
 
507
- end
583
+ _request.call
584
+
585
+ end
586
+
587
+ def self.rescue_response(response)
588
+ @last_response = response
589
+ case @last_response.code
590
+ when 200..399
591
+ if @last_response.body.empty?
592
+ true
593
+ else
594
+ @last_response.body
595
+ end
596
+ else
597
+ if Keycloak.explode_exception
598
+ @last_response.return!
599
+ else
600
+ begin
601
+ @last_response.return!
602
+ rescue RestClient::ExceptionWithResponse => err
603
+ err.response
604
+ rescue Exception => e
605
+ e.message
606
+ end
607
+ end
608
+ end
609
+ end
508
610
 
509
611
  end
@@ -1,3 +1,3 @@
1
1
  module Keycloak
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keycloak
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guilherme Portugues
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-03 00:00:00.000000000 Z
11
+ date: 2017-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler