omniauth_openid_connect 0.6.1 → 0.8.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 +4 -4
- data/.github/workflows/main.yml +1 -1
- data/CHANGELOG.md +28 -11
- data/README.md +65 -39
- data/lib/omniauth/openid_connect/version.rb +1 -1
- data/lib/omniauth/strategies/openid_connect.rb +14 -6
- data/omniauth_openid_connect.gemspec +9 -8
- data/test/lib/omniauth/strategies/openid_connect_test.rb +67 -11
- data/test/strategy_test_case.rb +1 -1
- data/test/test_helper.rb +1 -0
- metadata +28 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a88d5af43ae7fa7338b12da92488397a3d9ea250b9bdc7f285f5621f9571b609
|
4
|
+
data.tar.gz: baa1254704b191df4aebc92a78c0733585e43ae85a4f50506571e27854a2f561
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7689fc4611d597687bf25f8ad7c3b54f8b9dd1955f4940bd126ebbcfb6bb1203d1774828cd6f6f9fcd922e82d0ddbe4de97025eeb4d883236323b78e57aacf1d
|
7
|
+
data.tar.gz: 42c6116449d17622dfc8b98d81ec315b1ee7b5c741e7f160884845413e3d2bc3aa99bf1cbf34d97c9066e0673670128b81ccea873b41e8ce559b4dbfe863e851
|
data/.github/workflows/main.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,29 @@
|
|
1
|
-
#
|
1
|
+
# Unreleased
|
2
|
+
|
3
|
+
# v0.8.0 (2024-07-04)
|
4
|
+
|
5
|
+
- Add `send_state` parameter to disable sending of state (https://github.com/omniauth/omniauth_openid_connect/pull/182)
|
6
|
+
|
7
|
+
# v0.7.1 (2023-04-26)
|
8
|
+
|
9
|
+
- Fix handling of JWKS response (https://github.com/omniauth/omniauth_openid_connect/pull/157)
|
10
|
+
|
11
|
+
# v0.7.0 (2023-04-25)
|
12
|
+
|
13
|
+
- Update openid_connect to 2.2 (https://github.com/omniauth/omniauth_openid_connect/pull/153)
|
14
|
+
- Drop Ruby 2.5 and 2.6 CI support (https://github.com/omniauth/omniauth_openid_connect/pull/154)
|
15
|
+
- Improvements to README (https://github.com/omniauth/omniauth_openid_connect/pull/152, https://github.com/omniauth/omniauth_openid_connect/pull/151)
|
16
|
+
- Add option `logout_path` (https://github.com/omniauth/omniauth_openid_connect/pull/143)
|
17
|
+
|
18
|
+
# v0.6.1 (2023-02-22)
|
2
19
|
|
3
20
|
- Fix uninitialized constant error (https://github.com/omniauth/omniauth_openid_connect/pull/147)
|
4
21
|
|
5
|
-
# v0.6.0 (
|
22
|
+
# v0.6.0 (2023-01-22)
|
6
23
|
|
7
24
|
- Support verification of HS256-signed JWTs (https://github.com/omniauth/omniauth_openid_connect/pull/134)
|
8
25
|
|
9
|
-
# v0.5.0 (26
|
26
|
+
# v0.5.0 (2022-12-26)
|
10
27
|
|
11
28
|
- Support the "nonce" parameter forwarding without a session [#130](https://github.com/omniauth/omniauth_openid_connect/pull/130)
|
12
29
|
- Fetch key from JWKS URI if available [#133](https://github.com/omniauth/omniauth_openid_connect/pull/133)
|
@@ -14,7 +31,7 @@
|
|
14
31
|
- Add email_verified claim in user info [#131](https://github.com/omniauth/omniauth_openid_connect/pull/131)
|
15
32
|
- Add PKCE verification support [#128](https://github.com/omniauth/omniauth_openid_connect/pull/128)
|
16
33
|
|
17
|
-
# v0.4.0 (06
|
34
|
+
# v0.4.0 (2022-02-06)
|
18
35
|
|
19
36
|
- Support dynamic parameters to the authorize URI [#90](https://github.com/omniauth/omniauth_openid_connect/pull/90)
|
20
37
|
- Upgrade Faker and replace Travis with Github Actions [#102](https://github.com/omniauth/omniauth_openid_connect/pull/102)
|
@@ -22,12 +39,12 @@
|
|
22
39
|
- Fall back to the discovered jwks when no key specified [#97](https://github.com/omniauth/omniauth_openid_connect/pull/97)
|
23
40
|
- Allow updating to omniauth v2 [#88](https://github.com/omniauth/omniauth_openid_connect/pull/88)
|
24
41
|
|
25
|
-
# v0.3.5 (07
|
42
|
+
# v0.3.5 (2020-06-07)
|
26
43
|
|
27
44
|
- bugfix: Info from decoded id_token is not exposed into `request.env['omniauth.auth']` [#61](https://github.com/m0n9oose/omniauth_openid_connect/pull/61)
|
28
45
|
- bugfix: NoMethodError (`undefined method 'count' for #<OpenIDConnect::ResponseObject::IdToken>`) [#60](https://github.com/m0n9oose/omniauth_openid_connect/pull/60)
|
29
46
|
|
30
|
-
# v0.3.4 (21
|
47
|
+
# v0.3.4 (2020-05-21)
|
31
48
|
|
32
49
|
- Try to verify id_token when response_type is code [#44](https://github.com/m0n9oose/omniauth_openid_connect/pull/44)
|
33
50
|
- Provide more information on error [#49](https://github.com/m0n9oose/omniauth_openid_connect/pull/49)
|
@@ -36,7 +53,7 @@
|
|
36
53
|
- refactor: take uid_field from raw_attributes [#54](https://github.com/m0n9oose/omniauth_openid_connect/pull/54)
|
37
54
|
- chore(ci): add 2.7, ruby-head and jruby-head [#55](https://github.com/m0n9oose/omniauth_openid_connect/pull/55)
|
38
55
|
|
39
|
-
# v0.3.3 (09
|
56
|
+
# v0.3.3 (2019-11-09)
|
40
57
|
|
41
58
|
- Pass `acr_values` to authorize url [#43](https://github.com/m0n9oose/omniauth_openid_connect/pull/43)
|
42
59
|
- Add raw info for id token [#42](https://github.com/m0n9oose/omniauth_openid_connect/pull/42)
|
@@ -46,17 +63,17 @@
|
|
46
63
|
- Fix gemspec homepage [#33](https://github.com/m0n9oose/omniauth_openid_connect/pull/33)
|
47
64
|
- Add support for `response_type` `id_token` [#32](https://github.com/m0n9oose/omniauth_openid_connect/pull/32)
|
48
65
|
|
49
|
-
# v0.3.2 (03
|
66
|
+
# v0.3.2 (2019-08-03)
|
50
67
|
|
51
68
|
- Use response_mode in `authorize_uri` if the option is defined [#30](https://github.com/m0n9oose/omniauth_openid_connect/pull/30)
|
52
69
|
- Move verification of `id_token` to before accessing tokens [#28](https://github.com/m0n9oose/omniauth_openid_connect/pull/28)
|
53
70
|
- Update omniauth dependency [#26](https://github.com/m0n9oose/omniauth_openid_connect/pull/26)
|
54
71
|
|
55
|
-
# v0.3.1 (08
|
72
|
+
# v0.3.1 (2019-06-08)
|
56
73
|
|
57
74
|
- Set default OmniAuth name to openid_connect [#23](https://github.com/m0n9oose/omniauth_openid_connect/pull/23)
|
58
75
|
|
59
|
-
# v0.3.0 (
|
76
|
+
# v0.3.0 (2019-04-07)
|
60
77
|
|
61
78
|
- RP-Initiated Logout phase [#5](https://github.com/m0n9oose/omniauth_openid_connect/pull/5)
|
62
79
|
- Allows `ui_locales`, `claims_locales` and `login_hint` as request params [#6](https://github.com/m0n9oose/omniauth_openid_connect/pull/6)
|
@@ -65,7 +82,7 @@
|
|
65
82
|
- Handle errors when fetching access_token at callback_phase [#17](https://github.com/m0n9oose/omniauth_openid_connect/pull/17)
|
66
83
|
- Allow state method to receive env [#19](https://github.com/m0n9oose/omniauth_openid_connect/pull/19)
|
67
84
|
|
68
|
-
# v0.2.4 (06
|
85
|
+
# v0.2.4 (2019-01-06)
|
69
86
|
|
70
87
|
- Prompt and login hint [#4](https://github.com/m0n9oose/omniauth_openid_connect/pull/4)
|
71
88
|
- Bump openid_connect dependency [#9](https://github.com/m0n9oose/omniauth_openid_connect/pull/9)
|
data/README.md
CHANGED
@@ -23,53 +23,79 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
## Supported Ruby Versions
|
25
25
|
|
26
|
-
OmniAuth::OpenIDConnect is tested under 2.
|
26
|
+
OmniAuth::OpenIDConnect is tested under 2.7, 3.0, 3.1, 3.2
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
30
|
Example configuration
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
34
|
+
provider :openid_connect, {
|
35
|
+
name: :my_provider,
|
36
|
+
scope: [:openid, :email, :profile, :address],
|
37
|
+
response_type: :code,
|
38
|
+
uid_field: "preferred_username",
|
39
|
+
client_options: {
|
40
|
+
port: 443,
|
41
|
+
scheme: "https",
|
42
|
+
host: "myprovider.com",
|
43
|
+
identifier: ENV["OP_CLIENT_ID"],
|
44
|
+
secret: ENV["OP_SECRET_KEY"],
|
45
|
+
redirect_uri: "http://myapp.com/users/auth/openid_connect/callback",
|
46
|
+
},
|
47
|
+
}
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
### with Devise
|
31
52
|
```ruby
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
}
|
53
|
+
Devise.setup do |config|
|
54
|
+
config.omniauth :openid_connect, {
|
55
|
+
name: :my_provider,
|
56
|
+
scope: [:openid, :email, :profile, :address],
|
57
|
+
response_type: :code,
|
58
|
+
uid_field: "preferred_username",
|
59
|
+
client_options: {
|
60
|
+
port: 443,
|
61
|
+
scheme: "https",
|
62
|
+
host: "myprovider.com",
|
63
|
+
identifier: ENV["OP_CLIENT_ID"],
|
64
|
+
secret: ENV["OP_SECRET_KEY"],
|
65
|
+
redirect_uri: "http://myapp.com/users/auth/openid_connect/callback",
|
66
|
+
},
|
67
|
+
}
|
68
|
+
end
|
46
69
|
```
|
47
70
|
|
48
71
|
### Options Overview
|
49
72
|
|
50
|
-
| Field | Description
|
51
|
-
|
52
|
-
| name | Arbitrary string to identify connection and identify it from other openid_connect providers
|
53
|
-
| issuer | Root url for the authorization server
|
54
|
-
| discovery | Should OpenID discovery be used. This is recommended if the IDP provides a discovery endpoint. See client config for how to manually enter discovered values.
|
55
|
-
| client_auth_method | Which authentication method to use to authenticate your app with the authorization server
|
56
|
-
| scope | Which OpenID scopes to include (:openid is always required)
|
57
|
-
| response_type | Which OAuth2 response type to use with the authorization request
|
58
|
-
| state | A value to be used for the OAuth2 state parameter on the authorization request. Can be a proc that generates a string.
|
59
|
-
| require_state | Should state
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
| Field | Description | Required | Default | Example/Options |
|
74
|
+
|------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-------------------------------|-----------------------------------------------------|
|
75
|
+
| name | Arbitrary string to identify connection and identify it from other openid_connect providers | no | String: openid_connect | :my_idp |
|
76
|
+
| issuer | Root url for the authorization server | yes | | https://myprovider.com |
|
77
|
+
| discovery | Should OpenID discovery be used. This is recommended if the IDP provides a discovery endpoint. See client config for how to manually enter discovered values. | no | false | one of: true, false |
|
78
|
+
| client_auth_method | Which authentication method to use to authenticate your app with the authorization server | no | Sym: basic | "basic", "jwks" |
|
79
|
+
| scope | Which OpenID scopes to include (:openid is always required) | no | Array<sym> [:openid] | [:openid, :profile, :email] |
|
80
|
+
| response_type | Which OAuth2 response type to use with the authorization request | no | String: code | one of: 'code', 'id_token' |
|
81
|
+
| state | A value to be used for the OAuth2 state parameter on the authorization request. Can be a proc that generates a string. | no | Random 16 character string | Proc.new { SecureRandom.hex(32) } |
|
82
|
+
| require_state | Should the callback phase require that a state is present. If `send_state` is true, then the callback state must match the authorize state. This is recommended, not required by the OIDC specification. | no | true | false |
|
83
|
+
| send_state | Should the authorize phase send a `state` parameter - this is recommended, not required by the OIDC specification | no | true | false |
|
84
|
+
| response_mode | The response mode per [spec](https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html) | no | nil | one of: :query, :fragment, :form_post, :web_message |
|
85
|
+
| display | An optional parameter to the authorization request to determine how the authorization and consent page | no | nil | one of: :page, :popup, :touch, :wap |
|
86
|
+
| prompt | An optional parameter to the authrization request to determine what pages the user will be shown | no | nil | one of: :none, :login, :consent, :select_account |
|
87
|
+
| send_scope_to_token_endpoint | Should the scope parameter be sent to the authorization token endpoint? | no | true | one of: true, false |
|
88
|
+
| post_logout_redirect_uri | The logout redirect uri to use per the [session management draft](https://openid.net/specs/openid-connect-session-1_0.html) | no | empty | https://myapp.com/logout/callback |
|
89
|
+
| uid_field | The field of the user info response to be used as a unique id | no | 'sub' | "sub", "preferred_username" |
|
90
|
+
| extra_authorize_params | A hash of extra fixed parameters that will be merged to the authorization request | no | Hash | {"tenant" => "common"} |
|
91
|
+
| allow_authorize_params | A list of allowed dynamic parameters that will be merged to the authorization request | no | Array | [:screen_name] |
|
92
|
+
| pkce | Enable [PKCE flow](https://oauth.net/2/pkce/) | no | false | one of: true, false |
|
93
|
+
| pkce_verifier | Specify a custom PKCE verifier code. | no | A random 128-char string | Proc.new { SecureRandom.hex(64) } |
|
94
|
+
| pkce_options | Specify a custom implementation of the PKCE code challenge/method. | no | SHA256(code_challenge) in hex | Proc to customise the code challenge generation |
|
95
|
+
| client_options | A hash of client options detailed in its own section | yes | | |
|
96
|
+
| jwt_secret_base64 | For HMAC with SHA2 (e.g. HS256) signing algorithms, specify the base64-encoded secret used to sign the JWT token. Defaults to the OAuth2 client secret if not specified. | no | client_options.secret | "bXlzZWNyZXQ=\n" |
|
97
|
+
| logout_path | The log out is only triggered when the request path ends on this path | no | '/logout' | '/sign_out' |
|
98
|
+
| acr_values | Authentication Class Reference(ACR) values to be passed to the authorize_uri to enforce a specific level, see [RFC9470](https://www.rfc-editor.org/rfc/rfc9470.html) | no | nil | "c1 c2" |
|
73
99
|
|
74
100
|
### Client Config Options
|
75
101
|
|
@@ -131,7 +157,7 @@ For the full low down on OpenID Connect, please check out
|
|
131
157
|
|
132
158
|
## Contributing
|
133
159
|
|
134
|
-
1. Fork it ( http://github.com/
|
160
|
+
1. Fork it ( http://github.com/omniauth/omniauth_openid_connect/fork )
|
135
161
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
136
162
|
3. Cover your changes with tests and make sure they're green (`bundle install && bundle exec rake test`)
|
137
163
|
4. Commit your changes (`git commit -am 'Add some feature'`)
|
@@ -42,6 +42,7 @@ module OmniAuth
|
|
42
42
|
option :client_x509_signing_key
|
43
43
|
option :scope, [:openid]
|
44
44
|
option :response_type, 'code' # ['code', 'id_token']
|
45
|
+
option :send_state, true
|
45
46
|
option :require_state, true
|
46
47
|
option :state
|
47
48
|
option :response_mode # [:query, :fragment, :form_post, :web_message]
|
@@ -68,6 +69,8 @@ module OmniAuth
|
|
68
69
|
code_challenge_method: 'S256',
|
69
70
|
}
|
70
71
|
|
72
|
+
option :logout_path, '/logout'
|
73
|
+
|
71
74
|
def uid
|
72
75
|
user_info.raw_attributes[options.uid_field.to_sym] || user_info.sub
|
73
76
|
end
|
@@ -118,7 +121,12 @@ module OmniAuth
|
|
118
121
|
def callback_phase
|
119
122
|
error = params['error_reason'] || params['error']
|
120
123
|
error_description = params['error_description'] || params['error_reason']
|
121
|
-
invalid_state =
|
124
|
+
invalid_state =
|
125
|
+
if options.send_state
|
126
|
+
(options.require_state && params['state'].to_s.empty?) || params['state'] != stored_state
|
127
|
+
else
|
128
|
+
false
|
129
|
+
end
|
122
130
|
|
123
131
|
raise CallbackError, error: params['error'], reason: error_description, uri: params['error_uri'] if error
|
124
132
|
raise CallbackError, error: :csrf_detected, reason: "Invalid 'state' parameter" if invalid_state
|
@@ -167,13 +175,12 @@ module OmniAuth
|
|
167
175
|
end_session_uri.to_s
|
168
176
|
end
|
169
177
|
|
170
|
-
def authorize_uri
|
178
|
+
def authorize_uri # rubocop:disable Metrics/AbcSize
|
171
179
|
client.redirect_uri = redirect_uri
|
172
180
|
opts = {
|
173
181
|
response_type: options.response_type,
|
174
182
|
response_mode: options.response_mode,
|
175
183
|
scope: options.scope,
|
176
|
-
state: new_state,
|
177
184
|
login_hint: params['login_hint'],
|
178
185
|
ui_locales: params['ui_locales'],
|
179
186
|
claims_locales: params['claims_locales'],
|
@@ -183,6 +190,7 @@ module OmniAuth
|
|
183
190
|
acr_values: options.acr_values,
|
184
191
|
}
|
185
192
|
|
193
|
+
opts[:state] = new_state if options.send_state
|
186
194
|
opts.merge!(options.extra_authorize_params) unless options.extra_authorize_params.empty?
|
187
195
|
|
188
196
|
options.allow_authorize_params.each do |key|
|
@@ -226,7 +234,7 @@ module OmniAuth
|
|
226
234
|
private
|
227
235
|
|
228
236
|
def fetch_key
|
229
|
-
@fetch_key ||= parse_jwk_key(::OpenIDConnect.http_client.
|
237
|
+
@fetch_key ||= parse_jwk_key(::OpenIDConnect.http_client.get(client_options.jwks_uri).body)
|
230
238
|
end
|
231
239
|
|
232
240
|
def base64_decoded_jwt_secret
|
@@ -402,7 +410,7 @@ module OmniAuth
|
|
402
410
|
end
|
403
411
|
|
404
412
|
def parse_jwk_key(key)
|
405
|
-
json = JSON.parse(key)
|
413
|
+
json = key.is_a?(String) ? JSON.parse(key) : key
|
406
414
|
return JSON::JWK::Set.new(json['keys']) if json.key?('keys')
|
407
415
|
|
408
416
|
JSON::JWK.new(json)
|
@@ -432,7 +440,7 @@ module OmniAuth
|
|
432
440
|
end
|
433
441
|
|
434
442
|
def logout_path_pattern
|
435
|
-
@logout_path_pattern ||=
|
443
|
+
@logout_path_pattern ||= /\A#{Regexp.quote(request_path)}#{options.logout_path}/
|
436
444
|
end
|
437
445
|
|
438
446
|
def id_token_callback_phase
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.email = ['jjbohn@gmail.com', 'm0n9oose@gmail.com']
|
12
12
|
spec.summary = 'OpenID Connect Strategy for OmniAuth'
|
13
13
|
spec.description = 'OpenID Connect Strategy for OmniAuth.'
|
14
|
-
spec.homepage = 'https://github.com/
|
14
|
+
spec.homepage = 'https://github.com/omniauth/omniauth_openid_connect'
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -20,23 +20,24 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
22
|
spec.metadata = {
|
23
|
-
'bug_tracker_uri' => 'https://github.com/
|
24
|
-
'changelog_uri' => 'https://github.com/
|
25
|
-
'documentation_uri' => "https://github.com/
|
26
|
-
'source_code_uri' => "https://github.com/
|
23
|
+
'bug_tracker_uri' => 'https://github.com/omniauth/omniauth_openid_connect/issues',
|
24
|
+
'changelog_uri' => 'https://github.com/omniauth/omniauth_openid_connect/releases',
|
25
|
+
'documentation_uri' => "https://github.com/omniauth/omniauth_openid_connect/tree/v#{spec.version}#readme",
|
26
|
+
'source_code_uri' => "https://github.com/omniauth/omniauth_openid_connect/tree/v#{spec.version}",
|
27
27
|
'rubygems_mfa_required' => 'true',
|
28
28
|
}
|
29
29
|
|
30
30
|
spec.add_dependency 'omniauth', '>= 1.9', '< 3'
|
31
|
-
spec.add_dependency 'openid_connect', '~>
|
31
|
+
spec.add_dependency 'openid_connect', '~> 2.2'
|
32
32
|
spec.add_development_dependency 'faker', '~> 2.0'
|
33
33
|
spec.add_development_dependency 'guard', '~> 2.14'
|
34
34
|
spec.add_development_dependency 'guard-bundler', '~> 2.2'
|
35
35
|
spec.add_development_dependency 'guard-minitest', '~> 2.4'
|
36
|
-
spec.add_development_dependency 'minitest', '~> 5.
|
37
|
-
spec.add_development_dependency 'mocha', '~> 1
|
36
|
+
spec.add_development_dependency 'minitest', '~> 5.20'
|
37
|
+
spec.add_development_dependency 'mocha', '~> 2.1'
|
38
38
|
spec.add_development_dependency 'rake', '~> 12.0'
|
39
39
|
spec.add_development_dependency 'rubocop', '~> 1.12'
|
40
40
|
spec.add_development_dependency 'simplecov', '~> 0.21'
|
41
41
|
spec.add_development_dependency 'simplecov-lcov', '~> 0.8'
|
42
|
+
spec.add_development_dependency 'webmock', '~> 3.18'
|
42
43
|
end
|
@@ -69,6 +69,17 @@ module OmniAuth
|
|
69
69
|
strategy.other_phase
|
70
70
|
end
|
71
71
|
|
72
|
+
def test_logout_phase_with_logout_path
|
73
|
+
strategy.options.issuer = 'example.com'
|
74
|
+
strategy.options.client_options.host = 'example.com'
|
75
|
+
strategy.options.logout_path = '/sign_out'
|
76
|
+
|
77
|
+
request.stubs(:path).returns('/auth/openid_connect/sign_out')
|
78
|
+
|
79
|
+
strategy.expects(:call_app!)
|
80
|
+
strategy.other_phase
|
81
|
+
end
|
82
|
+
|
72
83
|
def test_logout_phase
|
73
84
|
strategy.options.issuer = 'example.com'
|
74
85
|
strategy.options.client_options.host = 'example.com'
|
@@ -442,6 +453,50 @@ module OmniAuth
|
|
442
453
|
strategy.callback_phase
|
443
454
|
end
|
444
455
|
|
456
|
+
def test_callback_phase_with_send_state_disabled # rubocop:disable Metrics/AbcSize
|
457
|
+
code = SecureRandom.hex(16)
|
458
|
+
|
459
|
+
strategy.options.client_options.host = 'example.com'
|
460
|
+
strategy.options.require_state = true
|
461
|
+
strategy.options.send_state = false
|
462
|
+
strategy.options.discovery = true
|
463
|
+
refute_match(/state/, strategy.authorize_uri, 'URI must not contain state')
|
464
|
+
|
465
|
+
request.stubs(:params).returns('code' => code)
|
466
|
+
request.stubs(:path).returns('')
|
467
|
+
|
468
|
+
issuer = stub('OpenIDConnect::Discovery::Issuer')
|
469
|
+
issuer.stubs(:issuer).returns('https://example.com/')
|
470
|
+
::OpenIDConnect::Discovery::Provider.stubs(:discover!).returns(issuer)
|
471
|
+
|
472
|
+
config = stub('OpenIDConnect::Discovery::Provder::Config')
|
473
|
+
config.stubs(:authorization_endpoint).returns('https://example.com/authorization')
|
474
|
+
config.stubs(:token_endpoint).returns('https://example.com/token')
|
475
|
+
config.stubs(:userinfo_endpoint).returns('https://example.com/userinfo')
|
476
|
+
config.stubs(:jwks_uri).returns('https://example.com/jwks')
|
477
|
+
config.stubs(:jwks).returns(JSON::JWK::Set.new(jwks['keys']))
|
478
|
+
|
479
|
+
::OpenIDConnect::Discovery::Provider::Config.stubs(:discover!).with('https://example.com/').returns(config)
|
480
|
+
|
481
|
+
id_token = stub('OpenIDConnect::ResponseObject::IdToken')
|
482
|
+
id_token.stubs(:raw_attributes).returns('sub' => 'sub', 'name' => 'name', 'email' => 'email')
|
483
|
+
id_token.stubs(:verify!).with(issuer: 'https://example.com/', client_id: @identifier, nonce: nonce).returns(true)
|
484
|
+
::OpenIDConnect::ResponseObject::IdToken.stubs(:decode).returns(id_token)
|
485
|
+
|
486
|
+
strategy.unstub(:user_info)
|
487
|
+
access_token = stub('OpenIDConnect::AccessToken')
|
488
|
+
access_token.stubs(:access_token)
|
489
|
+
access_token.stubs(:refresh_token)
|
490
|
+
access_token.stubs(:expires_in)
|
491
|
+
access_token.stubs(:scope)
|
492
|
+
access_token.stubs(:id_token).returns(jwt.to_s)
|
493
|
+
client.expects(:access_token!).at_least_once.returns(access_token)
|
494
|
+
access_token.expects(:userinfo!).returns(user_info)
|
495
|
+
|
496
|
+
strategy.call!('rack.session' => { 'omniauth.nonce' => nonce })
|
497
|
+
strategy.callback_phase
|
498
|
+
end
|
499
|
+
|
445
500
|
def test_callback_phase_with_no_state_without_state_verification # rubocop:disable Metrics/AbcSize
|
446
501
|
code = SecureRandom.hex(16)
|
447
502
|
|
@@ -509,10 +564,10 @@ module OmniAuth
|
|
509
564
|
strategy.options.client_options.jwks_uri = 'https://jwks.example.com'
|
510
565
|
strategy.options.response_type = 'id_token'
|
511
566
|
|
512
|
-
|
513
|
-
.
|
514
|
-
|
515
|
-
|
567
|
+
stub_request(:get, strategy.options.client_options.jwks_uri).to_return(
|
568
|
+
body: jwks.to_json,
|
569
|
+
headers: { 'Content-Type' => 'application/json' }
|
570
|
+
)
|
516
571
|
|
517
572
|
strategy.unstub(:user_info)
|
518
573
|
access_token = stub('OpenIDConnect::AccessToken')
|
@@ -788,8 +843,7 @@ module OmniAuth
|
|
788
843
|
access_token: 'test_access_token',
|
789
844
|
id_token: jwt.to_s,
|
790
845
|
token_type: 'Bearer',
|
791
|
-
}
|
792
|
-
success = Struct.new(:status, :body).new(200, json_response)
|
846
|
+
}
|
793
847
|
|
794
848
|
request.stubs(:path).returns('')
|
795
849
|
strategy.call!('rack.session' => { 'omniauth.state' => state, 'omniauth.nonce' => nonce })
|
@@ -798,11 +852,13 @@ module OmniAuth
|
|
798
852
|
id_token.stubs(:verify!).with(issuer: strategy.options.issuer, client_id: @identifier, nonce: nonce).returns(true)
|
799
853
|
::OpenIDConnect::ResponseObject::IdToken.stubs(:decode).returns(id_token)
|
800
854
|
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
855
|
+
url = "#{ opts.scheme }://#{ opts.host }:#{ opts.port }#{ opts.token_endpoint }"
|
856
|
+
body = { scope: 'openid', grant_type: 'client_credentials', client_id: @identifier, client_secret: @secret }
|
857
|
+
|
858
|
+
stub_request(:post, url).with(body: body).to_return(
|
859
|
+
body: json_response.to_json,
|
860
|
+
headers: { 'Content-Type' => 'application/json' }
|
861
|
+
)
|
806
862
|
|
807
863
|
assert(strategy.send(:access_token))
|
808
864
|
end
|
data/test/strategy_test_case.rb
CHANGED
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth_openid_connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Bohn
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-07-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: omniauth
|
@@ -37,14 +37,14 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.2'
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.2'
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: faker
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,28 +107,28 @@ dependencies:
|
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '5.
|
110
|
+
version: '5.20'
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
113
|
version_requirements: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '5.
|
117
|
+
version: '5.20'
|
118
118
|
- !ruby/object:Gem::Dependency
|
119
119
|
name: mocha
|
120
120
|
requirement: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '1
|
124
|
+
version: '2.1'
|
125
125
|
type: :development
|
126
126
|
prerelease: false
|
127
127
|
version_requirements: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '1
|
131
|
+
version: '2.1'
|
132
132
|
- !ruby/object:Gem::Dependency
|
133
133
|
name: rake
|
134
134
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,6 +185,20 @@ dependencies:
|
|
185
185
|
- - "~>"
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0.8'
|
188
|
+
- !ruby/object:Gem::Dependency
|
189
|
+
name: webmock
|
190
|
+
requirement: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '3.18'
|
195
|
+
type: :development
|
196
|
+
prerelease: false
|
197
|
+
version_requirements: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '3.18'
|
188
202
|
description: OpenID Connect Strategy for OmniAuth.
|
189
203
|
email:
|
190
204
|
- jjbohn@gmail.com
|
@@ -213,14 +227,14 @@ files:
|
|
213
227
|
- test/lib/omniauth/strategies/openid_connect_test.rb
|
214
228
|
- test/strategy_test_case.rb
|
215
229
|
- test/test_helper.rb
|
216
|
-
homepage: https://github.com/
|
230
|
+
homepage: https://github.com/omniauth/omniauth_openid_connect
|
217
231
|
licenses:
|
218
232
|
- MIT
|
219
233
|
metadata:
|
220
|
-
bug_tracker_uri: https://github.com/
|
221
|
-
changelog_uri: https://github.com/
|
222
|
-
documentation_uri: https://github.com/
|
223
|
-
source_code_uri: https://github.com/
|
234
|
+
bug_tracker_uri: https://github.com/omniauth/omniauth_openid_connect/issues
|
235
|
+
changelog_uri: https://github.com/omniauth/omniauth_openid_connect/releases
|
236
|
+
documentation_uri: https://github.com/omniauth/omniauth_openid_connect/tree/v0.8.0#readme
|
237
|
+
source_code_uri: https://github.com/omniauth/omniauth_openid_connect/tree/v0.8.0
|
224
238
|
rubygems_mfa_required: 'true'
|
225
239
|
post_install_message:
|
226
240
|
rdoc_options: []
|
@@ -237,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
237
251
|
- !ruby/object:Gem::Version
|
238
252
|
version: '0'
|
239
253
|
requirements: []
|
240
|
-
rubygems_version: 3.
|
254
|
+
rubygems_version: 3.5.14
|
241
255
|
signing_key:
|
242
256
|
specification_version: 4
|
243
257
|
summary: OpenID Connect Strategy for OmniAuth
|