keycloak_ruby 0.2.0 → 0.2.1
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 +4 -4
- data/README.md +33 -0
- data/lib/keycloak_ruby/config.rb +2 -1
- data/lib/keycloak_ruby/railtie.rb +14 -0
- data/lib/keycloak_ruby/request_params.rb +1 -2
- data/lib/keycloak_ruby/testing/keycloak_helpers.rb +25 -7
- data/lib/keycloak_ruby/testing/login_middleware.rb +51 -0
- data/lib/keycloak_ruby/version.rb +1 -1
- data/lib/keycloak_ruby.rb +3 -1
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dab863bc25bb5a8c853b4792d3b190c473718e4435e3123150ea04cf3e7d135b
|
|
4
|
+
data.tar.gz: fa732b217abe15b324be2b173b740dc2e54743ee9a7a430258b603c8dfa68fc5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fabda0c8e26181776ca2846b75985b84dd320aef47437f4ee6d617f3f5d58cf95454079163cbca733dab44fd392853e44f0c5c84a0a32f25763cd4373d2c78cd
|
|
7
|
+
data.tar.gz: 660fc8396f0456432b6722b66517a58a48768517b5f559d9741e93081eba8aa4817650a1da26c9d44ffe317071217c167ecd7b764da12547ee9a0caf957e9719
|
data/README.md
CHANGED
|
@@ -181,3 +181,36 @@ For test purpose there mock helper sign_in(user)
|
|
|
181
181
|
|
|
182
182
|
- add `require "keycloak_ruby/testing/keycloak_helpers"` to keycloak_helper.rb
|
|
183
183
|
- add sign_in in tests `config.include KeycloakRuby::Testing::KeycloakHelpers`
|
|
184
|
+
|
|
185
|
+
### Fast test login
|
|
186
|
+
|
|
187
|
+
По умолчанию `sign_in` в браузерных тестах (`:feature` / `:system`) проходит полный цикл через OmniAuth.
|
|
188
|
+
Чтобы ускорить тесты, можно включить быстрый логин через Rack-middleware — он записывает фейковые токены
|
|
189
|
+
прямо в сессию, минуя OmniAuth и Keycloak.
|
|
190
|
+
|
|
191
|
+
Добавьте в `config/keycloak.yml`:
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
test:
|
|
195
|
+
fast_test_login: true
|
|
196
|
+
# ... остальные параметры
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
После этого `sign_in(user)` в feature/system тестах будет использовать middleware вместо полного входа.
|
|
200
|
+
|
|
201
|
+
Если в отдельном тесте нужно проверить сам логин (flash-сообщения, редиректы и т.д.),
|
|
202
|
+
используйте `full_sign_in(user)` — он всегда проходит полный цикл через OmniAuth.
|
|
203
|
+
|
|
204
|
+
```ruby
|
|
205
|
+
# Большинство тестов — быстрый вход (при fast_test_login: true)
|
|
206
|
+
sign_in(user)
|
|
207
|
+
|
|
208
|
+
# Тесты, проверяющие логин
|
|
209
|
+
full_sign_in(user)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
| Тип теста | `sign_in` (fast_test_login: true) | `sign_in` (fast_test_login: false) | `full_sign_in` |
|
|
213
|
+
|---|---|---|---|
|
|
214
|
+
| `:feature` / `:system` | Middleware — сессия напрямую | OmniAuth mock → visit /login → клик | OmniAuth mock → visit /login → клик |
|
|
215
|
+
| `:request` | `mock_token_service` | `mock_token_service` | `mock_token_service` |
|
|
216
|
+
| `:controller` и др. | `mock_token_service` | `mock_token_service` | `mock_keycloak_login` без Capybara |
|
data/lib/keycloak_ruby/config.rb
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module KeycloakRuby
|
|
4
|
+
# Подключает middleware для быстрого логина в тестах.
|
|
5
|
+
# Включается только если в конфиге стоит fast_test_login: true
|
|
6
|
+
class Railtie < ::Rails::Railtie
|
|
7
|
+
initializer "keycloak_ruby.test_login_middleware" do |app|
|
|
8
|
+
if Rails.env.test? && KeycloakRuby.config.fast_test_login
|
|
9
|
+
require "keycloak_ruby/testing/login_middleware"
|
|
10
|
+
app.middleware.insert_before ActionDispatch::Flash, KeycloakRuby::Testing::LoginMiddleware
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -4,16 +4,30 @@
|
|
|
4
4
|
# :reek:UtilityFunction :reek:ControlParameter :reek:ManualDispatch :reek:BooleanParameter :reek:LongParameterList
|
|
5
5
|
module KeycloakRuby
|
|
6
6
|
module Testing
|
|
7
|
-
#
|
|
7
|
+
# Хелперы для тестов с Keycloak
|
|
8
8
|
module KeycloakHelpers
|
|
9
|
-
#
|
|
9
|
+
# Быстрый вход: если включён fast_test_login, для браузерных тестов
|
|
10
|
+
# устанавливает сессию через middleware без OmniAuth.
|
|
11
|
+
# Если флаг выключен — идёт через полный логин.
|
|
12
|
+
# Для остальных типов тестов — мокирует TokenService.
|
|
10
13
|
def sign_in(user, test_type: auto_detect_test_type)
|
|
14
|
+
case test_type
|
|
15
|
+
when :feature, :system
|
|
16
|
+
fast_login_enabled? ? visit("/__test_login__/#{user.id}") : full_sign_in(user, test_type:)
|
|
17
|
+
else
|
|
18
|
+
mock_token_service(user)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Полная процедура входа через OmniAuth для тестов, которые проверяют сам логин.
|
|
23
|
+
# Проходит /login → OmniAuth callback → SessionsController#create.
|
|
24
|
+
def full_sign_in(user, test_type: auto_detect_test_type)
|
|
11
25
|
case test_type
|
|
12
26
|
when :request
|
|
13
27
|
mock_token_service(user)
|
|
14
28
|
when :feature, :system
|
|
15
29
|
mock_keycloak_login(user, use_capybara: true)
|
|
16
|
-
else
|
|
30
|
+
else
|
|
17
31
|
mock_keycloak_login(user, use_capybara: false)
|
|
18
32
|
end
|
|
19
33
|
end
|
|
@@ -31,9 +45,9 @@ module KeycloakRuby
|
|
|
31
45
|
user_data
|
|
32
46
|
end
|
|
33
47
|
|
|
34
|
-
#
|
|
48
|
+
# Удаление всех пользователей из Keycloak
|
|
35
49
|
def self.delete_all_keycloak_users
|
|
36
|
-
users = KeycloakRuby::User.find("") #
|
|
50
|
+
users = KeycloakRuby::User.find("") # Пустая строка — ищем всех
|
|
37
51
|
users.each do |user|
|
|
38
52
|
KeycloakRuby::User.delete_by_id(user["id"])
|
|
39
53
|
end
|
|
@@ -107,17 +121,21 @@ module KeycloakRuby
|
|
|
107
121
|
:feature
|
|
108
122
|
end
|
|
109
123
|
end
|
|
124
|
+
|
|
125
|
+
def fast_login_enabled?
|
|
126
|
+
KeycloakRuby.config.fast_test_login
|
|
127
|
+
end
|
|
110
128
|
end
|
|
111
129
|
end
|
|
112
130
|
end
|
|
113
|
-
#
|
|
131
|
+
# Автоматическое подключение хелперов в тестовые фреймворки
|
|
114
132
|
if defined?(RSpec)
|
|
115
133
|
RSpec.configure do |config|
|
|
116
134
|
config.include KeycloakRuby::Testing::KeycloakHelpers
|
|
117
135
|
end
|
|
118
136
|
elsif defined?(Minitest)
|
|
119
137
|
module Minitest
|
|
120
|
-
#
|
|
138
|
+
# Подключение хелперов в Minitest
|
|
121
139
|
class Test
|
|
122
140
|
include KeycloakRuby::Testing::KeycloakHelpers
|
|
123
141
|
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module KeycloakRuby
|
|
4
|
+
module Testing
|
|
5
|
+
# Rack-middleware для быстрой аутентификации в тестах.
|
|
6
|
+
# Записывает токены в сессию напрямую, минуя OmniAuth и Keycloak.
|
|
7
|
+
#
|
|
8
|
+
# Подключается автоматически в test-окружении через KeycloakRuby::Railtie.
|
|
9
|
+
# Используется хелпером sign_in для браузерных тестов (:feature/:system).
|
|
10
|
+
#
|
|
11
|
+
# Было: visit /login → рендер HTML → клик → OmniAuth → SessionsController → редирект
|
|
12
|
+
# Стало: visit /__test_login__/123 → запись сессии → 200 OK
|
|
13
|
+
class LoginMiddleware
|
|
14
|
+
TEST_LOGIN_PATH = %r{\A/__test_login__/(\d+)\z}
|
|
15
|
+
|
|
16
|
+
def initialize(app)
|
|
17
|
+
@app = app
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def call(env)
|
|
21
|
+
if (match = env["PATH_INFO"].match(TEST_LOGIN_PATH))
|
|
22
|
+
handle_test_login(env, match[1].to_i)
|
|
23
|
+
else
|
|
24
|
+
@app.call(env)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def handle_test_login(env, user_id)
|
|
31
|
+
user = ::User.find(user_id)
|
|
32
|
+
fill_session(env, user)
|
|
33
|
+
[200, { "Content-Type" => "text/plain" }, ["Logged in"]]
|
|
34
|
+
rescue ActiveRecord::RecordNotFound
|
|
35
|
+
[404, { "Content-Type" => "text/plain" }, ["Test login failed: User #{user_id} not found"]]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# :reek:UtilityFunction
|
|
39
|
+
def fill_session(env, user)
|
|
40
|
+
email = user.email
|
|
41
|
+
expired_time = 2.hours.from_now.to_i
|
|
42
|
+
token_payload = { "email" => email, "exp" => expired_time }
|
|
43
|
+
|
|
44
|
+
session = env["rack.session"]
|
|
45
|
+
session[:access_token] = JWT.encode(token_payload, nil, "none")
|
|
46
|
+
session[:refresh_token] = "fake-refresh-#{email}"
|
|
47
|
+
session[:id_token] = "fake-id-#{email}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -6,7 +6,7 @@ module KeycloakRuby
|
|
|
6
6
|
# Follows Semantic Versioning 2.0 (https://semver.org)
|
|
7
7
|
# @example
|
|
8
8
|
# KeycloakRuby::VERSION # => "0.1.3"
|
|
9
|
-
VERSION = "0.2.
|
|
9
|
+
VERSION = "0.2.1"
|
|
10
10
|
|
|
11
11
|
# Provides version information and comparison methods for the KeycloakRuby gem.
|
|
12
12
|
# This module follows Semantic Versioning 2.0 guidelines.
|
data/lib/keycloak_ruby.rb
CHANGED
|
@@ -11,11 +11,13 @@ require "omniauth/rails_csrf_protection/railtie" if defined?(Rails)
|
|
|
11
11
|
loader = Zeitwerk::Loader.for_gem
|
|
12
12
|
loader.ignore(
|
|
13
13
|
"#{__dir__}/generators",
|
|
14
|
-
"#{__dir__}/templates"
|
|
14
|
+
"#{__dir__}/templates",
|
|
15
|
+
"#{__dir__}/keycloak_ruby/railtie.rb"
|
|
15
16
|
)
|
|
16
17
|
loader.setup
|
|
17
18
|
|
|
18
19
|
require "generators/keycloak_ruby/install_generator" if defined?(Rails)
|
|
20
|
+
require "keycloak_ruby/railtie" if defined?(Rails::Railtie)
|
|
19
21
|
|
|
20
22
|
# Module for interacting with Keycloak
|
|
21
23
|
module KeycloakRuby
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: keycloak_ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sergey Arkhipov
|
|
@@ -133,11 +133,13 @@ files:
|
|
|
133
133
|
- lib/keycloak_ruby/client.rb
|
|
134
134
|
- lib/keycloak_ruby/config.rb
|
|
135
135
|
- lib/keycloak_ruby/errors.rb
|
|
136
|
+
- lib/keycloak_ruby/railtie.rb
|
|
136
137
|
- lib/keycloak_ruby/request_params.rb
|
|
137
138
|
- lib/keycloak_ruby/request_performer.rb
|
|
138
139
|
- lib/keycloak_ruby/response_validator.rb
|
|
139
140
|
- lib/keycloak_ruby/testing.rb
|
|
140
141
|
- lib/keycloak_ruby/testing/keycloak_helpers.rb
|
|
142
|
+
- lib/keycloak_ruby/testing/login_middleware.rb
|
|
141
143
|
- lib/keycloak_ruby/token_refresher.rb
|
|
142
144
|
- lib/keycloak_ruby/token_service.rb
|
|
143
145
|
- lib/keycloak_ruby/user.rb
|