keycloak-api-rails 0.10.2 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
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: []