keycloak-api-rails 0.10.2 → 0.11.2

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
- SHA1:
3
- metadata.gz: 87874dec1c650142ab5ab797da0242c54307a27f
4
- data.tar.gz: 261fe67cecc45c6fd9831b15289d242e697ee354
2
+ SHA256:
3
+ metadata.gz: ff480abdc3a9317e66060416095339c0612ff902fec1200bf1178c7445bfad39
4
+ data.tar.gz: 29d7cb681cb2b05d801ceac2634b6773278516413112500968cdfe5fe7cae76e
5
5
  SHA512:
6
- metadata.gz: 2eecc8d1fb2e293f265712b90d44b012b68b319a22739906a39fc03e4c159d6780793dd1a2210b0e510d175bf86df6c414ddaa9c7bd360250b2a101f275548bd
7
- data.tar.gz: 96aa59b4a9d1617f946d827660bed9e7f97b6326ac02d91e00805d2ac989de33af5bb53f7ee92e0c598a81dc8e1800b63966c872b553180f07a8164f2c665803
6
+ metadata.gz: 3bd3bac623390a4efe1cf24a80106c820e2b66c186350ddab00140ccab44f1a919117afb28a2bdcf02651cc1b780d0e9cfc4e75256d6083339e140bdd44669f6
7
+ data.tar.gz: fdbc7a9b37f8d5efdf5c11ee9ca01075ccfe9bbfaf7d5babfda1653eef9557a275c34487569d4589c2f5902c8ff13a7877f5e6d55133b0e4a7b9b4bd4fb00a58
data/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.11.2] - 2022-03-30
9
+
10
+ * Update `Gemfile.lock` to avoid wrong CVE detections. The version of Rails should always be specified by the parent project. This change has no functional impact.
11
+ * Update `json-jwt` to `>=1.13.0`
12
+
13
+ ## [0.11.1] - 2019-11-27
14
+
15
+ * When a token validation error occurs, do not log it as a `warn` (but as an `info` instead)
16
+
17
+ ## [0.11.0] - 2019-11-21
18
+
19
+ * Remove dependency to `rest-client` (thanks to @@loicvigneron)
20
+ * Access Authorization Party from ENV (thanks to @@loicvigneron)
21
+ * New configuration option: `ca_certificate_file` (thanks to @@loicvigneron)
22
+ * Access the token from ENV
23
+ * Upgrade `json-jwt` to `1.11.0`
data/Dockerfile CHANGED
@@ -1,11 +1,14 @@
1
- FROM ruby:2.4
2
- RUN mkdir -p /usr/src/app/lib/keycloak-api-rails
1
+ FROM ruby:2.7.5-slim-bullseye
2
+
3
+ RUN apt-get update -qq && apt-get install -y build-essential git ruby-dev && apt-get clean && \
4
+ mkdir -p /usr/src/app/lib/keycloak-api-rails
5
+
3
6
  WORKDIR /usr/src/app
4
7
 
5
8
  COPY Gemfile /usr/src/app/
6
9
  COPY Gemfile.lock /usr/src/app/
7
10
  COPY keycloak-api-rails.gemspec /usr/src/app/
8
11
  COPY lib/keycloak-api-rails/version.rb /usr/src/app/lib/keycloak-api-rails/
9
- RUN bundle install
12
+ # RUN bundle install
10
13
  COPY . /usr/src/app
11
- RUN bundle install
14
+ # RUN bundle install
data/Gemfile.lock CHANGED
@@ -1,127 +1,156 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- keycloak-api-rails (0.10.2)
5
- json-jwt (>= 1.9.4)
4
+ keycloak-api-rails (0.11.2)
5
+ json-jwt (>= 1.11.0)
6
6
  rails (>= 4.2)
7
- rest-client (>= 2.0.2)
8
7
 
9
8
  GEM
10
9
  remote: https://rubygems.org/
11
10
  specs:
12
- actioncable (5.2.1)
13
- actionpack (= 5.2.1)
11
+ actioncable (7.0.2.3)
12
+ actionpack (= 7.0.2.3)
13
+ activesupport (= 7.0.2.3)
14
14
  nio4r (~> 2.0)
15
15
  websocket-driver (>= 0.6.1)
16
- actionmailer (5.2.1)
17
- actionpack (= 5.2.1)
18
- actionview (= 5.2.1)
19
- activejob (= 5.2.1)
16
+ actionmailbox (7.0.2.3)
17
+ actionpack (= 7.0.2.3)
18
+ activejob (= 7.0.2.3)
19
+ activerecord (= 7.0.2.3)
20
+ activestorage (= 7.0.2.3)
21
+ activesupport (= 7.0.2.3)
22
+ mail (>= 2.7.1)
23
+ net-imap
24
+ net-pop
25
+ net-smtp
26
+ actionmailer (7.0.2.3)
27
+ actionpack (= 7.0.2.3)
28
+ actionview (= 7.0.2.3)
29
+ activejob (= 7.0.2.3)
30
+ activesupport (= 7.0.2.3)
20
31
  mail (~> 2.5, >= 2.5.4)
32
+ net-imap
33
+ net-pop
34
+ net-smtp
21
35
  rails-dom-testing (~> 2.0)
22
- actionpack (5.2.1)
23
- actionview (= 5.2.1)
24
- activesupport (= 5.2.1)
25
- rack (~> 2.0)
36
+ actionpack (7.0.2.3)
37
+ actionview (= 7.0.2.3)
38
+ activesupport (= 7.0.2.3)
39
+ rack (~> 2.0, >= 2.2.0)
26
40
  rack-test (>= 0.6.3)
27
41
  rails-dom-testing (~> 2.0)
28
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
- actionview (5.2.1)
30
- activesupport (= 5.2.1)
42
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
43
+ actiontext (7.0.2.3)
44
+ actionpack (= 7.0.2.3)
45
+ activerecord (= 7.0.2.3)
46
+ activestorage (= 7.0.2.3)
47
+ activesupport (= 7.0.2.3)
48
+ globalid (>= 0.6.0)
49
+ nokogiri (>= 1.8.5)
50
+ actionview (7.0.2.3)
51
+ activesupport (= 7.0.2.3)
31
52
  builder (~> 3.1)
32
53
  erubi (~> 1.4)
33
54
  rails-dom-testing (~> 2.0)
34
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
35
- activejob (5.2.1)
36
- activesupport (= 5.2.1)
55
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
56
+ activejob (7.0.2.3)
57
+ activesupport (= 7.0.2.3)
37
58
  globalid (>= 0.3.6)
38
- activemodel (5.2.1)
39
- activesupport (= 5.2.1)
40
- activerecord (5.2.1)
41
- activemodel (= 5.2.1)
42
- activesupport (= 5.2.1)
43
- arel (>= 9.0)
44
- activestorage (5.2.1)
45
- actionpack (= 5.2.1)
46
- activerecord (= 5.2.1)
47
- marcel (~> 0.3.1)
48
- activesupport (5.2.1)
59
+ activemodel (7.0.2.3)
60
+ activesupport (= 7.0.2.3)
61
+ activerecord (7.0.2.3)
62
+ activemodel (= 7.0.2.3)
63
+ activesupport (= 7.0.2.3)
64
+ activestorage (7.0.2.3)
65
+ actionpack (= 7.0.2.3)
66
+ activejob (= 7.0.2.3)
67
+ activerecord (= 7.0.2.3)
68
+ activesupport (= 7.0.2.3)
69
+ marcel (~> 1.0)
70
+ mini_mime (>= 1.1.0)
71
+ activesupport (7.0.2.3)
49
72
  concurrent-ruby (~> 1.0, >= 1.0.2)
50
- i18n (>= 0.7, < 2)
51
- minitest (~> 5.1)
52
- tzinfo (~> 1.1)
53
- aes_key_wrap (1.0.1)
54
- arel (9.0.0)
55
- bindata (2.4.3)
56
- builder (3.2.3)
73
+ i18n (>= 1.6, < 2)
74
+ minitest (>= 5.1)
75
+ tzinfo (~> 2.0)
76
+ aes_key_wrap (1.1.0)
77
+ bindata (2.4.10)
78
+ builder (3.2.4)
57
79
  byebug (9.1.0)
58
- concurrent-ruby (1.0.5)
59
- crass (1.0.4)
60
- diff-lcs (1.3)
61
- domain_name (0.5.20180417)
62
- unf (>= 0.0.5, < 1.0.0)
63
- erubi (1.7.1)
64
- globalid (0.4.1)
65
- activesupport (>= 4.2.0)
66
- http-cookie (1.0.3)
67
- domain_name (~> 0.5)
68
- i18n (1.1.0)
80
+ concurrent-ruby (1.1.10)
81
+ crass (1.0.6)
82
+ diff-lcs (1.5.0)
83
+ digest (3.1.0)
84
+ erubi (1.10.0)
85
+ globalid (1.0.0)
86
+ activesupport (>= 5.0)
87
+ i18n (1.10.0)
69
88
  concurrent-ruby (~> 1.0)
70
- json-jwt (1.9.4)
71
- activesupport
89
+ io-wait (0.2.1)
90
+ json-jwt (1.13.0)
91
+ activesupport (>= 4.2)
72
92
  aes_key_wrap
73
93
  bindata
74
- loofah (2.2.2)
94
+ loofah (2.15.0)
75
95
  crass (~> 1.0.2)
76
96
  nokogiri (>= 1.5.9)
77
- mail (2.7.0)
97
+ mail (2.7.1)
78
98
  mini_mime (>= 0.1.1)
79
- marcel (0.3.2)
80
- mimemagic (~> 0.3.2)
81
- method_source (0.9.0)
82
- mime-types (3.2.2)
83
- mime-types-data (~> 3.2015)
84
- mime-types-data (3.2018.0812)
85
- mimemagic (0.3.2)
86
- mini_mime (1.0.1)
87
- mini_portile2 (2.3.0)
88
- minitest (5.11.3)
89
- netrc (0.11.0)
90
- nio4r (2.3.1)
91
- nokogiri (1.8.4)
92
- mini_portile2 (~> 2.3.0)
93
- rack (2.0.6)
99
+ marcel (1.0.2)
100
+ method_source (1.0.0)
101
+ mini_mime (1.1.2)
102
+ mini_portile2 (2.8.0)
103
+ minitest (5.15.0)
104
+ net-imap (0.2.3)
105
+ digest
106
+ net-protocol
107
+ strscan
108
+ net-pop (0.1.1)
109
+ digest
110
+ net-protocol
111
+ timeout
112
+ net-protocol (0.1.2)
113
+ io-wait
114
+ timeout
115
+ net-smtp (0.3.1)
116
+ digest
117
+ net-protocol
118
+ timeout
119
+ nio4r (2.5.8)
120
+ nokogiri (1.13.3)
121
+ mini_portile2 (~> 2.8.0)
122
+ racc (~> 1.4)
123
+ racc (1.6.0)
124
+ rack (2.2.3)
94
125
  rack-test (1.1.0)
95
126
  rack (>= 1.0, < 3)
96
- rails (5.2.1)
97
- actioncable (= 5.2.1)
98
- actionmailer (= 5.2.1)
99
- actionpack (= 5.2.1)
100
- actionview (= 5.2.1)
101
- activejob (= 5.2.1)
102
- activemodel (= 5.2.1)
103
- activerecord (= 5.2.1)
104
- activestorage (= 5.2.1)
105
- activesupport (= 5.2.1)
106
- bundler (>= 1.3.0)
107
- railties (= 5.2.1)
108
- sprockets-rails (>= 2.0.0)
127
+ rails (7.0.2.3)
128
+ actioncable (= 7.0.2.3)
129
+ actionmailbox (= 7.0.2.3)
130
+ actionmailer (= 7.0.2.3)
131
+ actionpack (= 7.0.2.3)
132
+ actiontext (= 7.0.2.3)
133
+ actionview (= 7.0.2.3)
134
+ activejob (= 7.0.2.3)
135
+ activemodel (= 7.0.2.3)
136
+ activerecord (= 7.0.2.3)
137
+ activestorage (= 7.0.2.3)
138
+ activesupport (= 7.0.2.3)
139
+ bundler (>= 1.15.0)
140
+ railties (= 7.0.2.3)
109
141
  rails-dom-testing (2.0.3)
110
142
  activesupport (>= 4.2.0)
111
143
  nokogiri (>= 1.6)
112
- rails-html-sanitizer (1.0.4)
113
- loofah (~> 2.2, >= 2.2.2)
114
- railties (5.2.1)
115
- actionpack (= 5.2.1)
116
- activesupport (= 5.2.1)
144
+ rails-html-sanitizer (1.4.2)
145
+ loofah (~> 2.3)
146
+ railties (7.0.2.3)
147
+ actionpack (= 7.0.2.3)
148
+ activesupport (= 7.0.2.3)
117
149
  method_source
118
- rake (>= 0.8.7)
119
- thor (>= 0.19.0, < 2.0)
120
- rake (12.3.1)
121
- rest-client (2.0.2)
122
- http-cookie (>= 1.0.2, < 2.0)
123
- mime-types (>= 1.16, < 4.0)
124
- netrc (~> 0.8)
150
+ rake (>= 12.2)
151
+ thor (~> 1.0)
152
+ zeitwerk (~> 2.5)
153
+ rake (13.0.6)
125
154
  rspec (3.7.0)
126
155
  rspec-core (~> 3.7.0)
127
156
  rspec-expectations (~> 3.7.0)
@@ -134,25 +163,17 @@ GEM
134
163
  rspec-mocks (3.7.0)
135
164
  diff-lcs (>= 1.2.0, < 2.0)
136
165
  rspec-support (~> 3.7.0)
137
- rspec-support (3.7.0)
138
- sprockets (3.7.2)
139
- concurrent-ruby (~> 1.0)
140
- rack (> 1, < 3)
141
- sprockets-rails (3.2.1)
142
- actionpack (>= 4.0)
143
- activesupport (>= 4.0)
144
- sprockets (>= 3.0.0)
145
- thor (0.20.0)
146
- thread_safe (0.3.6)
166
+ rspec-support (3.7.1)
167
+ strscan (3.0.1)
168
+ thor (1.2.1)
147
169
  timecop (0.9.1)
148
- tzinfo (1.2.5)
149
- thread_safe (~> 0.1)
150
- unf (0.1.4)
151
- unf_ext
152
- unf_ext (0.0.7.5)
153
- websocket-driver (0.7.0)
170
+ timeout (0.2.0)
171
+ tzinfo (2.0.4)
172
+ concurrent-ruby (~> 1.0)
173
+ websocket-driver (0.7.5)
154
174
  websocket-extensions (>= 0.1.0)
155
- websocket-extensions (0.1.3)
175
+ websocket-extensions (0.1.5)
176
+ zeitwerk (2.5.4)
156
177
 
157
178
  PLATFORMS
158
179
  ruby
@@ -164,4 +185,4 @@ DEPENDENCIES
164
185
  timecop (= 0.9.1)
165
186
 
166
187
  BUNDLED WITH
167
- 1.16.1
188
+ 2.1.4
data/README.md CHANGED
@@ -5,7 +5,7 @@ This gem aims at validates Keycloak JWT token in Ruby On Rails APIs.
5
5
  ## Install
6
6
 
7
7
  ```ruby
8
- gem "keycloak-api-rails", "0.10.2"
8
+ gem "keycloak-api-rails", "0.11.2"
9
9
  ```
10
10
 
11
11
  ## Token validation
@@ -14,7 +14,7 @@ Tokens send (through query strings or Authorization headers) to this Railtie Mid
14
14
 
15
15
  ## Pass token to the API
16
16
 
17
- * Method 1: By adding an `Authorization` HTTP Header with its value set to `Bearer <your token>`.
17
+ * Method 1: By adding an `Authorization` HTTP Header with its value set to `Bearer <your token>`.
18
18
  _e.g_ using curl: `curl -H "Authorization: Bearer <your-token>" https://api.pouet.io/api/more-pouets`
19
19
  * Method 2: By providing the token via query string, especially via the parameter named `authorizationToken`. Keep in mind that this method is less secure (url are kept intact in your browser history, and so on...)
20
20
  _e.g._ using curl: `curl https://api.pouet.io/api/more-pouets?authorizationToken<your-token>`
@@ -42,8 +42,8 @@ All options have a default value. However, all of them can be changed in your in
42
42
  | `token_expiration_tolerance_in_seconds` | `10`| Logger | Optional | Number of seconds a token can expire before being rejected by the API. | `15` | 
43
43
  | `public_key_cache_ttl` | `86400`| Integer | Optional | Amount of time, in seconds, specifying maximum interval between two requests to {project_name} to retrieve new public keys. It is 86400 seconds (1 day) by default. At least once per this configured interval (1 day by default) will be new public key always downloaded. | `Rails.logger` | 
44
44
  | `custom_attributes` | `[]`| Array Of String | Optional | List of token attributes to read from each token and to add to their http request env | `["originalFirstName", "originalLastName"]` | 
45
-
46
- ## Configure it
45
+ | `ca_certificate_file` | `nil`| String | Optional | Path to the certificate authority used to validate the Keycloak server certificate | `/credentials/production_root_ca_cert.pem` | 
46
+ ## Configure it
47
47
 
48
48
  Create a `keycloak.rb` file in your Rails `config/initializers` folder. For instance:
49
49
 
@@ -65,7 +65,7 @@ Once this gem is configured in your Rails project, you can read, validate and us
65
65
 
66
66
  ### Keycloak Id
67
67
 
68
- If you identify users using their Keycloak Id, this value can be read from your controllers using `Keycloak::Helper.current_user_id(request.env)`.
68
+ If you identify users using their Keycloak Id, this value can be read from your controllers using `Keycloak::Helper.current_user_id(request.env)`.
69
69
 
70
70
  ```ruby
71
71
  class AuthenticatedController < ApplicationController
@@ -173,4 +173,4 @@ From the `keycloak-rails-api` directory:
173
173
 
174
174
  ## Next developments
175
175
 
176
- * Remove dependency to `rest-client`
176
+ * Manage multiple realms
@@ -16,10 +16,9 @@ Gem::Specification.new do |spec|
16
16
  spec.require_paths = ["lib"]
17
17
 
18
18
  spec.add_dependency "rails", ">= 4.2"
19
- spec.add_dependency "json-jwt", ">= 1.9.4"
20
- spec.add_dependency "rest-client", ">= 2.0.2"
19
+ spec.add_dependency "json-jwt", ">= 1.11.0"
21
20
 
22
21
  spec.add_development_dependency "rspec", "3.7.0"
23
22
  spec.add_development_dependency "timecop", "0.9.1"
24
23
  spec.add_development_dependency "byebug", "9.1.0"
25
- end
24
+ end
@@ -8,5 +8,6 @@ module Keycloak
8
8
  config_accessor :public_key_cache_ttl
9
9
  config_accessor :custom_attributes
10
10
  config_accessor :logger
11
+ config_accessor :ca_certificate_file
11
12
  end
12
13
  end
@@ -1,12 +1,15 @@
1
1
  module Keycloak
2
2
  class Helper
3
-
4
- CURRENT_USER_ID_KEY = "keycloak:keycloak_id"
5
- CURRENT_USER_EMAIL_KEY = "keycloak:email"
6
- CURRENT_USER_LOCALE_KEY = "keycloak:locale"
7
- CURRENT_USER_ATTRIBUTES = "keycloak:attributes"
8
- ROLES_KEY = "keycloak:roles"
9
- QUERY_STRING_TOKEN_KEY = "authorizationToken"
3
+
4
+ CURRENT_USER_ID_KEY = "keycloak:keycloak_id"
5
+ CURRENT_AUTHORIZED_PARTY_KEY = "keycloak:authorized_party"
6
+ CURRENT_USER_EMAIL_KEY = "keycloak:email"
7
+ CURRENT_USER_LOCALE_KEY = "keycloak:locale"
8
+ CURRENT_USER_ATTRIBUTES = "keycloak:attributes"
9
+ ROLES_KEY = "keycloak:roles"
10
+ RESOURCE_ROLES_KEY = "keycloak:resource_roles"
11
+ TOKEN_KEY = "keycloak:token"
12
+ QUERY_STRING_TOKEN_KEY = "authorizationToken"
10
13
 
11
14
  def self.current_user_id(env)
12
15
  env[CURRENT_USER_ID_KEY]
@@ -16,6 +19,22 @@ module Keycloak
16
19
  env[CURRENT_USER_ID_KEY] = token["sub"]
17
20
  end
18
21
 
22
+ def self.keycloak_token(env)
23
+ env[TOKEN_KEY]
24
+ end
25
+
26
+ def self.assign_keycloak_token(env, token)
27
+ env[TOKEN_KEY] = token
28
+ end
29
+
30
+ def self.current_authorized_party(env)
31
+ env[CURRENT_AUTHORIZED_PARTY_KEY]
32
+ end
33
+
34
+ def self.assign_current_authorized_party(env, token)
35
+ env[CURRENT_AUTHORIZED_PARTY_KEY] = token["azp"]
36
+ end
37
+
19
38
  def self.current_user_email(env)
20
39
  env[CURRENT_USER_EMAIL_KEY]
21
40
  end
@@ -40,8 +59,19 @@ module Keycloak
40
59
  env[ROLES_KEY] = token.dig("realm_access", "roles")
41
60
  end
42
61
 
62
+ def self.current_resource_roles(env)
63
+ env[RESOURCE_ROLES_KEY]
64
+ end
65
+
66
+ def self.assign_resource_roles(env, token)
67
+ env[RESOURCE_ROLES_KEY] = token.fetch("resource_access", {}).inject({}) do |resource_roles, (name, resource_attributes)|
68
+ resource_roles[name] = resource_attributes.fetch("roles", [])
69
+ resource_roles
70
+ end
71
+ end
72
+
43
73
  def self.assign_current_user_custom_attributes(env, token, attribute_names)
44
- env[CURRENT_USER_ATTRIBUTES] = token.select { |key,value| attribute_names.include?(key) }
74
+ env[CURRENT_USER_ATTRIBUTES] = token.select { |key, value| attribute_names.include?(key) }
45
75
  end
46
76
 
47
77
  def self.current_user_custom_attributes(env)
@@ -0,0 +1,28 @@
1
+ module Keycloak
2
+ class HTTPClient
3
+ def initialize(configuration)
4
+ @server_url = configuration.server_url
5
+ @ca_certificate_file = configuration.ca_certificate_file
6
+ @x509_store = OpenSSL::X509::Store.new
7
+ @x509_store.set_default_paths
8
+ @x509_store.add_file(@ca_certificate_file) if @ca_certificate_file
9
+ end
10
+
11
+ def get(realm_id, path)
12
+ uri = build_uri(realm_id, path)
13
+ use_ssl = uri.scheme == "http" ? false : true
14
+ Net::HTTP.start(uri.host, uri.port, :use_ssl => use_ssl, :cert_store => @x509_store) do |http|
15
+ request = Net::HTTP::Get.new(uri)
16
+ response = http.request(request)
17
+ JSON.parse(response.body)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def build_uri(realm_id, path)
24
+ string_uri = File.join(@server_url, "realms", realm_id, path)
25
+ URI(string_uri)
26
+ end
27
+ end
28
+ end
@@ -9,7 +9,7 @@ module Keycloak
9
9
  method = env["REQUEST_METHOD"]
10
10
  path = env["PATH_INFO"]
11
11
  uri = env["REQUEST_URI"]
12
-
12
+
13
13
  if service.need_authentication?(method, path, env)
14
14
  logger.debug("Start authentication for #{method} : #{path}")
15
15
  token = service.read_token(uri, env)
@@ -24,16 +24,19 @@ module Keycloak
24
24
  end
25
25
 
26
26
  def authentication_failed(message)
27
- logger.warn(message)
27
+ logger.info(message)
28
28
  [401, {"Content-Type" => "application/json"}, [ { error: message }.to_json]]
29
29
  end
30
30
 
31
31
  def authentication_succeeded(env, decoded_token)
32
32
  Helper.assign_current_user_id(env, decoded_token)
33
+ Helper.assign_current_authorized_party(env, decoded_token)
33
34
  Helper.assign_current_user_email(env, decoded_token)
34
35
  Helper.assign_current_user_locale(env, decoded_token)
35
36
  Helper.assign_current_user_custom_attributes(env, decoded_token, config.custom_attributes)
36
37
  Helper.assign_realm_roles(env, decoded_token)
38
+ Helper.assign_resource_roles(env, decoded_token)
39
+ Helper.assign_keycloak_token(env, decoded_token)
37
40
  @app.call(env)
38
41
  end
39
42
 
@@ -2,15 +2,15 @@ module Keycloak
2
2
  class PublicKeyCachedResolver
3
3
  attr_reader :cached_public_key_retrieved_at
4
4
 
5
- def initialize(server_url, realm_id, public_key_cache_ttl)
6
- @resolver = PublicKeyResolver.new(server_url, realm_id)
5
+ def initialize(http_client, realm_id, public_key_cache_ttl)
6
+ @resolver = PublicKeyResolver.new(http_client, realm_id)
7
7
  @public_key_cache_ttl = public_key_cache_ttl
8
8
  @cached_public_keys = nil
9
9
  @cached_public_key_retrieved_at = nil
10
10
  end
11
11
 
12
- def self.from_configuration(configuration)
13
- PublicKeyCachedResolver.new(configuration.server_url, configuration.realm_id, configuration.public_key_cache_ttl)
12
+ def self.from_configuration(http_client, configuration)
13
+ PublicKeyCachedResolver.new(http_client, configuration.realm_id, configuration.public_key_cache_ttl)
14
14
  end
15
15
 
16
16
  def find_public_keys
@@ -1,21 +1,12 @@
1
1
  module Keycloak
2
2
  class PublicKeyResolver
3
- def initialize(server_url, realm_id)
4
- @public_certificate_url = create_public_certificate_url(server_url, realm_id)
3
+ def initialize(http_client, realm_id)
4
+ @realm_id = realm_id
5
+ @http_client = http_client
5
6
  end
6
7
 
7
8
  def find_public_keys
8
- JSON::JWK::Set.new(JSON.parse(RestClient.get(@public_certificate_url).body)["keys"])
9
- end
10
-
11
- private
12
-
13
- def create_realm_url(server_url, realm_id)
14
- "#{server_url}/realms/#{realm_id}"
15
- end
16
-
17
- def create_public_certificate_url(server_url, realm_id)
18
- "#{create_realm_url(server_url, realm_id)}/protocol/openid-connect/certs"
9
+ JSON::JWK::Set.new(@http_client.get(@realm_id, "protocol/openid-connect/certs")["keys"])
19
10
  end
20
11
  end
21
- end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module Keycloak
2
- VERSION = "0.10.2"
2
+ VERSION = "0.11.2"
3
3
  end
@@ -2,8 +2,10 @@ require "logger"
2
2
  require "json/jwt"
3
3
  require "uri"
4
4
  require "date"
5
+ require "net/http"
5
6
 
6
7
  require_relative "keycloak-api-rails/configuration"
8
+ require_relative "keycloak-api-rails/http_client"
7
9
  require_relative "keycloak-api-rails/token_error"
8
10
  require_relative "keycloak-api-rails/helper"
9
11
  require_relative "keycloak-api-rails/public_key_resolver"
@@ -22,8 +24,12 @@ module Keycloak
22
24
  @configuration
23
25
  end
24
26
 
27
+ def self.http_client
28
+ @http_client ||= Keycloak::HTTPClient.new(config)
29
+ end
30
+
25
31
  def self.public_key_resolver
26
- @public_key_resolver ||= PublicKeyCachedResolver.from_configuration(config)
32
+ @public_key_resolver ||= PublicKeyCachedResolver.from_configuration(http_client, config)
27
33
  end
28
34
 
29
35
  def self.service
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keycloak-api-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lorent Lempereur
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-16 00:00:00.000000000 Z
11
+ date: 2022-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,28 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.9.4
33
+ version: 1.11.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.9.4
41
- - !ruby/object:Gem::Dependency
42
- name: rest-client
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 2.0.2
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 2.0.2
40
+ version: 1.11.0
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rspec
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +89,7 @@ extra_rdoc_files: []
103
89
  files:
104
90
  - ".gitignore"
105
91
  - ".rspec"
92
+ - CHANGELOG.md
106
93
  - Dockerfile
107
94
  - Gemfile
108
95
  - Gemfile.lock
@@ -112,6 +99,7 @@ files:
112
99
  - lib/keycloak-api-rails.rb
113
100
  - lib/keycloak-api-rails/configuration.rb
114
101
  - lib/keycloak-api-rails/helper.rb
102
+ - lib/keycloak-api-rails/http_client.rb
115
103
  - lib/keycloak-api-rails/middleware.rb
116
104
  - lib/keycloak-api-rails/public_key_cached_resolver.rb
117
105
  - lib/keycloak-api-rails/public_key_resolver.rb
@@ -130,7 +118,7 @@ homepage: https://github.com/looorent/keycloak-api-rails
130
118
  licenses:
131
119
  - MIT
132
120
  metadata: {}
133
- post_install_message:
121
+ post_install_message:
134
122
  rdoc_options: []
135
123
  require_paths:
136
124
  - lib
@@ -145,9 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
133
  - !ruby/object:Gem::Version
146
134
  version: '0'
147
135
  requirements: []
148
- rubyforge_project:
149
- rubygems_version: 2.6.4
150
- signing_key:
136
+ rubygems_version: 3.2.3
137
+ signing_key:
151
138
  specification_version: 4
152
139
  summary: Rails middleware that validates Authorization token emitted by Keycloak
153
140
  test_files: []