omniauth_oidc 0.1.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9938b98ee466c6cc178261c9ae304cfe35ab8e8944aa4c267717badbde1aa2d
4
- data.tar.gz: aa202f151604d5f83d087541af1810b87645a0a49c14206ac92eedc579314c9c
3
+ metadata.gz: 801521d0f3ce8e7cdfa427b09c09689db790784bbacb90f9c1d46e8194db1bb6
4
+ data.tar.gz: 5a5ddd24e583e982304fca72de602dc8b405b11c98c2d019fbc88fe7058ad48f
5
5
  SHA512:
6
- metadata.gz: 7b01ce26e049dd86893188edd3662fb52d1de8c553773812dca9900c47912d4e7259602e114dd8dff35cb03889408dac6f4e110140fcf4d4b805348604095f56
7
- data.tar.gz: bdb799687fa7b29a16d35a9b417f0c55df59c3f47e94daa7d68b59a2c5baea28b692fec8862957e76e6a441af7c75e36023bd45401f078c297b5192f2d32911e
6
+ metadata.gz: 8480664bb2f337914f7eefc8aa012d58bc9b67fa66fb0e206d2aef09c0352f9228a4d9212e5a1a36a5689676b01dacc00d888dd5a186fbd6af5a69f69f519174
7
+ data.tar.gz: 45645700fc002901880944adc41cf1d97ee9d108132c5416718198955b7620203e293938646e225d798e7fd86f028c9bd4f5108aa41f2e3ba822fe6489eef936
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Released]
2
2
 
3
+ ## [0.2.0] - 2024-07-21
4
+ - Update dependencies
5
+
6
+ ## [0.2.0] - 2024-07-06
7
+ - Add option to fetch user info or skip it
8
+
3
9
  ## [0.1.1] - 2024-06-16
4
10
  - Add dependabot
5
11
 
data/README.md CHANGED
@@ -4,6 +4,8 @@ This gem provides an OmniAuth strategy for integrating OpenID Connect (OIDC) aut
4
4
 
5
5
  Developed with reference to [omniauth-openid-connect](https://github.com/jjbohn/omniauth-openid-connect) and [omniauth_openid_connect](https://github.dev/omniauth/omniauth_openid_connect).
6
6
 
7
+ [Article on Medium](https://msuliq.medium.com/authenticating-with-omniauth-and-openid-connect-oidc-in-ruby-on-rails-applications-e136ec5b48c0) about the development of this gem.
8
+
7
9
  ## Installation
8
10
 
9
11
  To install the gem run the following command in the terminal:
@@ -157,6 +159,48 @@ end
157
159
  **Please note that you should register `https://your_app.com/auth/<simple_provider>/callback` with your OIDC provider
158
160
  as a callback redirect url.**
159
161
 
162
+ ### Using Access Token Without User Info
163
+
164
+ In case your app requries only an access token and not the user information, then you can specify an optional
165
+ configuration in the omniauth initializer:
166
+
167
+ ```ruby
168
+ # config/initializers/omniauth.rb
169
+ Rails.application.config.middleware.use OmniAuth::Builder do
170
+ provider :oidc, {
171
+ name: :simple_provider_access_token_only,
172
+ fetch_user_info: false, # if not specified, default value of true will be applied
173
+ client_options: {
174
+ identifier: '23575f4602bebbd9a17dbc38d85bd1a77',
175
+ secret: ENV['SIMPLE_PROVIDER_CLIENT_SECRET'],
176
+ config_endpoint: 'https://simpleprovider.com/cdn-cgi/access/sso/oidc/23575f4602bebbd9a17dbc38d85bd1a77/.well-known/openid-configuration'
177
+ }
178
+ }
179
+ end
180
+ ```
181
+
182
+ Then the callback returned once your user authenticates with the OIDC provider will contain only access token parameters:
183
+
184
+ ```ruby
185
+ # app/controllers/callbacks_controller.rb
186
+ class CallbacksController < ApplicationController
187
+ def omniauth
188
+ # access token parameters received from OIDC provider will be available in `request.env['omniauth.auth']`
189
+ omniauth_params = request.env['omniauth.auth']
190
+
191
+ # omniauth_params will contain similar data as shown below
192
+ # {"provider"=>:simple_provider_access_token_only,
193
+ # "credentials"=>
194
+ # {"id_token"=> "id token value",
195
+ # "token"=> "token value",
196
+ # "refresh_token"=>"refresh token value",
197
+ # "expires_in"=>300,
198
+ # "scope"=>nil
199
+ # }
200
+ # }
201
+ end
202
+ end
203
+ ```
160
204
 
161
205
  ### Advanced Configuration
162
206
  You can customize the OIDC strategy further by adding additional configuration options:
@@ -165,6 +209,7 @@ You can customize the OIDC strategy further by adding additional configuration o
165
209
  |------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|-------------------------------------|-------------------------------------------------------|
166
210
  | name | Arbitrary string to identify OIDC provider and segregate it from other OIDC providers | no | `"oidc"` | `:simple_provider` |
167
211
  | issuer | Root url for the OIDC authorization server | no | retrived from config_endpoint | `"https://simpleprovider.com"` |
212
+ | fetch_user_info | Fetches user information from user_info_endpoint using the access token. If set to false the omniauth params will include only access token | no | `true` | `fetch_user_info: false` |
168
213
  | client_auth_method | Authentication method to be used with the OIDC authorization server | no | `:basic` | `"basic"`, `"jwks"` |
169
214
  | scope | OIDC scopes to be included in the server's response | `[:openid]` is required | all scopes offered by OIDC provider | `[:openid, :profile, :email]` |
170
215
  | response_type | OAuth2 response type expected from OIDC provider during authorization | no | `"code"` | `"code"` or `"id_token"` |
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OmniauthOidc
4
- VERSION = "0.1.1"
4
+ VERSION = "0.2.1"
5
5
  end
@@ -58,7 +58,7 @@ module OmniAuth
58
58
 
59
59
  verify_id_token!(@access_token.id_token) if configured_response_type == "code"
60
60
 
61
- user_info_from_access_token
61
+ options.fetch_user_info ? user_info_from_access_token : define_access_token
62
62
  end
63
63
 
64
64
  def id_token_callback_phase
@@ -106,6 +106,20 @@ module OmniAuth
106
106
  call_app!
107
107
  end
108
108
 
109
+ def define_access_token
110
+ env["omniauth.auth"] = AuthHash.new(
111
+ provider: name,
112
+ credentials: {
113
+ id_token: @access_token.id_token,
114
+ token: @access_token.access_token,
115
+ refresh_token: @access_token.refresh_token,
116
+ expires_in: @access_token.expires_in,
117
+ scope: @access_token.scope
118
+ }
119
+ )
120
+ call_app!
121
+ end
122
+
109
123
  def configured_response_type
110
124
  @configured_response_type ||= options.response_type.to_s
111
125
  end
@@ -30,7 +30,7 @@ module OmniAuth
30
30
  private
31
31
 
32
32
  def fetch_key
33
- @fetch_key ||= parse_jwk_key(::OpenIDConnect.http_client.get(config.jwks_uri).body)
33
+ @fetch_key ||= parse_jwk_key(::Oidc.http_client.get(config.jwks_uri).body)
34
34
  end
35
35
 
36
36
  def base64_decoded_jwt_secret
@@ -47,7 +47,6 @@ module OmniAuth
47
47
  nonce: params["nonce"].presence || stored_nonce)
48
48
  end
49
49
 
50
- # Workaround for https://github.com/nov/openid_connect/issues/61
51
50
  def decode_id_token(id_token)
52
51
  decoded = JSON::JWT.decode(id_token, :skip_verification)
53
52
  algorithm = decoded.algorithm.to_sym
@@ -63,7 +62,7 @@ module OmniAuth
63
62
  end
64
63
 
65
64
  decoded.verify!(keyset)
66
- ::OpenIDConnect::ResponseObject::IdToken.new(decoded)
65
+ ::Oidc::ResponseObject::IdToken.new(decoded)
67
66
  rescue JSON::JWK::Set::KidNotFound
68
67
  # Workaround for https://github.com/nov/json-jwt/pull/92#issuecomment-824654949
69
68
  raise if decoded&.header&.key?("kid")
@@ -88,7 +87,7 @@ module OmniAuth
88
87
  end
89
88
 
90
89
  def decode!(id_token, key)
91
- ::OpenIDConnect::ResponseObject::IdToken.decode(id_token, key)
90
+ ::Oidc::ResponseObject::IdToken.decode(id_token, key)
92
91
  end
93
92
 
94
93
  def decode_with_each_key!(id_token, keyset)
@@ -140,7 +139,7 @@ module OmniAuth
140
139
  if access_token.id_token
141
140
  decoded = decode_id_token(access_token.id_token).raw_attributes
142
141
 
143
- @user_info = ::OpenIDConnect::ResponseObject::UserInfo.new(
142
+ @user_info = ::Oidc::ResponseObject::UserInfo.new(
144
143
  access_token.userinfo!.raw_attributes.merge(decoded)
145
144
  )
146
145
  else
@@ -5,7 +5,7 @@ require "timeout"
5
5
  require "net/http"
6
6
  require "open-uri"
7
7
  require "omniauth"
8
- require "openid_connect"
8
+ require "oidc"
9
9
  require "openid_config_parser"
10
10
  require "forwardable"
11
11
  require "httparty"
@@ -61,6 +61,7 @@ module OmniAuth
61
61
  option :id_token_hint
62
62
  option :acr_values
63
63
  option :send_nonce, true
64
+ option :fetch_user_info, true
64
65
  option :send_scope_to_token_endpoint, true
65
66
  option :client_auth_method
66
67
  option :post_logout_redirect_uri
@@ -111,9 +112,9 @@ module OmniAuth
111
112
  }
112
113
  end
113
114
 
114
- # Initialize OpenIDConnect Client with options
115
+ # Initialize Oidc Client with options
115
116
  def client
116
- @client ||= ::OpenIDConnect::Client.new(client_options)
117
+ @client ||= ::Oidc::Client.new(client_options)
117
118
  end
118
119
 
119
120
  # Config is build from the json response from the OIDC config endpoint
@@ -33,9 +33,9 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  # Uncomment to register a new dependency of your gem
35
35
  spec.add_dependency "httparty"
36
+ spec.add_dependency "oidc"
36
37
  spec.add_dependency "omniauth"
37
38
  spec.add_dependency "openid_config_parser"
38
- spec.add_dependency "openid_connect"
39
39
 
40
40
  # For more information and examples about making a new gem, check out our
41
41
  # guide at: https://bundler.io/guides/creating_gem.html
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth_oidc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Suleyman Musayev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-16 00:00:00.000000000 Z
11
+ date: 2024-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: omniauth
28
+ name: oidc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: openid_config_parser
42
+ name: omniauth
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: openid_connect
56
+ name: openid_config_parser
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="