doorkeeper-openid_connect 1.7.5 → 1.8.0.pre.rc1

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
2
  SHA256:
3
- metadata.gz: 8faf5bba278059c030aab079426353b543baa68bc374991f6ba243454cd09aac
4
- data.tar.gz: 06f56eb8b593086cc03fee056efb4d82447fd40cdd341b354ed371fde47dec63
3
+ metadata.gz: 1f78f5dd79c5979e4c8e4ba7e24524f9b6fbe412944e353c1ce3e1b11eaf6479
4
+ data.tar.gz: 86801e079f717fe9723018c0ac7a5eae02a6a2cc867ff855bb73f1d75bc5ac8f
5
5
  SHA512:
6
- metadata.gz: d40202cdca7cddf5606674a4c08a4894ba9be7f8ec072520c73e81e1da48c87ba3e1c95573e0baa1ddcccaa20201eeb76d9af947e3f772223f2a4c658c730e92
7
- data.tar.gz: a36e15a4cdc316a82a67cc842731149ec5522e27dc21569d2c33bdbe292afc5bc81d6c4f93679c0b7ada133dcfb5e43ae4250470709a58371664f83d983e38bb
6
+ metadata.gz: 281765487d56b6c8cccbe51d56d33074d74307eaf5ff5c618c2ba1c19c0a0b936794fab02ec897ac0768115bb043f100487957a453b49ae067b636d01b332367
7
+ data.tar.gz: '0381cfe02e6b5b898ed5bd4ff1323351cb054b5a983ba7d34c1e67e21bf24a6f1a48b993595d04b59db8c17e25bb51ec06523a7877a50ca8220fea8068e903e9'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  ## Unreleased
2
2
 
3
+ ## v1.8.0-rc1 (2021-04-20)
4
+
5
+ ### Upgrading
6
+
7
+ This gem now requires Doorkeeper 5.5 and Ruby 2.5.
8
+
9
+ ### Changes
10
+
11
+ - [#138] Support form_post response mode (thanks to @linhdangduy)
12
+ - [#144] Support block syntax for `issuer` configuration (thanks to @maxxsnake)
13
+ - [#145] Register token flows with the strategy instead of the token class (thanks to @paukul)
14
+
3
15
  ## v1.7.5 (2020-12-15)
4
16
 
5
17
  ### Changes
data/README.md CHANGED
@@ -34,6 +34,7 @@ The following parts of [OpenID Connect Core 1.0](http://openid.net/specs/openid-
34
34
  - [Requesting Claims using Scope Values](http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims)
35
35
  - [UserInfo Endpoint](http://openid.net/specs/openid-connect-core-1_0.html#UserInfo)
36
36
  - [Normal Claims](http://openid.net/specs/openid-connect-core-1_0.html#NormalClaims)
37
+ - [OAuth 2.0 Form Post Response Mode](https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html)
37
38
 
38
39
  In addition we also support most of [OpenID Connect Discovery 1.0](http://openid.net/specs/openid-connect-discovery-1_0.html) for automatic configuration discovery.
39
40
 
@@ -103,6 +104,7 @@ The following settings are required in `config/initializers/doorkeeper_openid_co
103
104
 
104
105
  - `issuer`
105
106
  - Identifier for the issuer of the response (i.e. your application URL). The value is a case sensitive URL using the `https` scheme that contains scheme, host, and optionally, port number and path components and no query or fragment components.
107
+ - You can either pass a string value, or a block to generate the issuer dynamically based on the `resource_owner` and `application` passed to the block.
106
108
  - `subject`
107
109
  - Identifier for the resource owner (i.e. the authenticated user). A locally unique and never reassigned identifier within the issuer for the end-user, which is intended to be consumed by the client. The value is a case-sensitive string and must not exceed 255 ASCII characters in length.
108
110
  - The database ID of the user is an acceptable choice if you don't mind leaking that information.
@@ -38,7 +38,7 @@ module Doorkeeper
38
38
 
39
39
  # TODO: support id_token response type
40
40
  response_types_supported: doorkeeper.authorization_response_types,
41
- response_modes_supported: %w[query fragment],
41
+ response_modes_supported: response_modes_supported(doorkeeper),
42
42
  grant_types_supported: grant_types_supported(doorkeeper),
43
43
 
44
44
  # TODO: look into doorkeeper-jwt_assertion for these
@@ -76,6 +76,10 @@ module Doorkeeper
76
76
  grant_types_supported
77
77
  end
78
78
 
79
+ def response_modes_supported(doorkeeper)
80
+ doorkeeper.authorization_response_flows.flat_map(&:response_mode_matches).uniq
81
+ end
82
+
79
83
  def webfinger_response
80
84
  {
81
85
  subject: params.require(:resource),
@@ -17,19 +17,17 @@ module Doorkeeper
17
17
  true
18
18
  end
19
19
 
20
- def redirect_uri
21
- Authorization::URIBuilder.uri_with_fragment(pre_auth.redirect_uri, redirect_uri_params)
22
- end
23
-
24
- private
25
-
26
- def redirect_uri_params
20
+ def body
27
21
  {
28
22
  expires_in: auth.token.expires_in_seconds,
29
23
  state: pre_auth.state,
30
24
  id_token: id_token.as_jws_token
31
25
  }
32
26
  end
27
+
28
+ def redirect_uri
29
+ Authorization::URIBuilder.uri_with_fragment(pre_auth.redirect_uri, body)
30
+ end
33
31
  end
34
32
  end
35
33
  end
@@ -3,9 +3,7 @@
3
3
  module Doorkeeper
4
4
  module OAuth
5
5
  class IdTokenTokenResponse < IdTokenResponse
6
- private
7
-
8
- def redirect_uri_params
6
+ def body
9
7
  super.merge({
10
8
  access_token: auth.token.token,
11
9
  token_type: auth.token.token_type
@@ -16,13 +16,11 @@ require 'doorkeeper/openid_connect/claims_builder'
16
16
  require 'doorkeeper/openid_connect/claims/claim'
17
17
  require 'doorkeeper/openid_connect/claims/normal_claim'
18
18
  require 'doorkeeper/openid_connect/config'
19
- require 'doorkeeper/openid_connect/response_types_config'
20
19
  require 'doorkeeper/openid_connect/engine'
21
20
  require 'doorkeeper/openid_connect/errors'
22
21
  require 'doorkeeper/openid_connect/id_token'
23
22
  require 'doorkeeper/openid_connect/id_token_token'
24
23
  require 'doorkeeper/openid_connect/user_info'
25
- require 'doorkeeper/openid_connect/response_mode'
26
24
  require 'doorkeeper/openid_connect/version'
27
25
 
28
26
  require 'doorkeeper/openid_connect/helpers/controller'
@@ -65,26 +63,22 @@ module Doorkeeper
65
63
  end
66
64
  end
67
65
 
68
- if defined?(::Doorkeeper::GrantFlow)
69
- Doorkeeper::GrantFlow.register(
70
- :id_token,
71
- response_type_matches: 'id_token',
72
- response_type_strategy: Doorkeeper::OpenidConnect::IdToken,
73
- )
66
+ Doorkeeper::GrantFlow.register(
67
+ :id_token,
68
+ response_type_matches: 'id_token',
69
+ response_mode_matches: %w[fragment form_post],
70
+ response_type_strategy: Doorkeeper::Request::IdToken,
71
+ )
74
72
 
75
- Doorkeeper::GrantFlow.register(
76
- 'id_token token',
77
- response_type_matches: 'id_token token',
78
- response_type_strategy: Doorkeeper::OpenidConnect::IdTokenToken,
79
- )
73
+ Doorkeeper::GrantFlow.register(
74
+ 'id_token token',
75
+ response_type_matches: 'id_token token',
76
+ response_mode_matches: %w[fragment form_post],
77
+ response_type_strategy: Doorkeeper::Request::IdTokenToken,
78
+ )
80
79
 
81
- Doorkeeper::GrantFlow.register_alias(
82
- 'implicit_oidc', as: ['implicit', 'id_token', 'id_token token']
83
- )
84
- else
85
- # TODO: drop this and corresponding file when we will set minimal
86
- # required Doorkeeper version to 5.5.
87
- Doorkeeper::Config.prepend OpenidConnect::ResponseTypeConfig
88
- end
80
+ Doorkeeper::GrantFlow.register_alias(
81
+ 'implicit_oidc', as: ['implicit', 'id_token', 'id_token token']
82
+ )
89
83
  end
90
84
  end
@@ -52,15 +52,16 @@ module Doorkeeper
52
52
  redirect_uri: params[:redirect_uri],
53
53
  response_on_fragment: pre_auth.response_on_fragment?,
54
54
  )
55
- end
55
+ end
56
56
 
57
57
  response.headers.merge!(error_response.headers)
58
58
 
59
- if error_response.redirectable?
60
- render json: error_response.body, status: :found, location: error_response.redirect_uri
61
- else
62
- render json: error_response.body, status: error_response.status
63
- end
59
+ # NOTE: Assign error_response to @authorize_response then use redirect_or_render method that are defined at
60
+ # doorkeeper's authorizations_controller.
61
+ # - https://github.com/doorkeeper-gem/doorkeeper/blob/v5.5.0/app/controllers/doorkeeper/authorizations_controller.rb#L110
62
+ # - https://github.com/doorkeeper-gem/doorkeeper/blob/v5.5.0/app/controllers/doorkeeper/authorizations_controller.rb#L52
63
+ @authorize_response = error_response
64
+ redirect_or_render(@authorize_response)
64
65
  end
65
66
 
66
67
  def handle_oidc_prompt_param!(owner)
@@ -40,7 +40,11 @@ module Doorkeeper
40
40
  private
41
41
 
42
42
  def issuer
43
- Doorkeeper::OpenidConnect.configuration.issuer
43
+ if Doorkeeper::OpenidConnect.configuration.issuer.respond_to?(:call)
44
+ Doorkeeper::OpenidConnect.configuration.issuer.call(@resource_owner, @access_token.application).to_s
45
+ else
46
+ Doorkeeper::OpenidConnect.configuration.issuer
47
+ end
44
48
  end
45
49
 
46
50
  def subject
@@ -7,27 +7,20 @@ module Doorkeeper
7
7
  attr_reader :nonce
8
8
 
9
9
  def initialize(server, attrs = {}, resource_owner = nil)
10
- if (Doorkeeper::VERSION::MAJOR >= 5 && Doorkeeper::VERSION::MINOR >= 4) ||
11
- Doorkeeper::VERSION::MAJOR >= 6
12
- super
13
- else
14
- super(server, attrs)
15
- end
10
+ super
16
11
  @nonce = attrs[:nonce]
17
12
  end
18
13
 
19
- # This method will be updated when doorkeeper move to version > 5.2.2
20
- # TODO: delete this method and refactor response_on_fragment? method (below) when doorkeeper gem version constrains is > 5.2.2
21
- def error_response
22
- if error == :invalid_request
23
- Doorkeeper::OAuth::InvalidRequestResponse.from_request(self, response_on_fragment: response_on_fragment?)
24
- else
25
- Doorkeeper::OAuth::ErrorResponse.from_request(self, response_on_fragment: response_on_fragment?)
14
+ # NOTE: Auto get default response_mode of specified response_type if response_mode is not
15
+ # yet present. We can delete this method after Doorkeeper's minimize version support it.
16
+ def response_on_fragment?
17
+ return response_mode == 'fragment' if response_mode.present?
18
+
19
+ grant_flow = server.authorization_response_flows.detect do |flow|
20
+ flow.matches_response_type?(response_type)
26
21
  end
27
- end
28
22
 
29
- def response_on_fragment?
30
- Doorkeeper::OpenidConnect::ResponseMode.new(response_type).fragment?
23
+ grant_flow&.default_response_mode == 'fragment'
31
24
  end
32
25
  end
33
26
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Doorkeeper
4
4
  module OpenidConnect
5
- VERSION = '1.7.5'
5
+ VERSION = '1.8.0-rc1'
6
6
  end
7
7
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Doorkeeper::OpenidConnect.configure do
4
- issuer 'issuer string'
4
+ issuer do |resource_owner, application|
5
+ 'issuer string'
6
+ end
5
7
 
6
8
  signing_key <<~KEY
7
9
  -----BEGIN RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doorkeeper-openid_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.5
4
+ version: 1.8.0.pre.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Dengler
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-12-16 00:00:00.000000000 Z
12
+ date: 2021-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: doorkeeper
@@ -17,20 +17,20 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '5.2'
20
+ version: '5.5'
21
21
  - - "<"
22
22
  - !ruby/object:Gem::Version
23
- version: '5.5'
23
+ version: '5.6'
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
28
  - - ">="
29
29
  - !ruby/object:Gem::Version
30
- version: '5.2'
30
+ version: '5.5'
31
31
  - - "<"
32
32
  - !ruby/object:Gem::Version
33
- version: '5.5'
33
+ version: '5.6'
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: json-jwt
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -157,8 +157,6 @@ files:
157
157
  - lib/doorkeeper/openid_connect/rails/routes.rb
158
158
  - lib/doorkeeper/openid_connect/rails/routes/mapper.rb
159
159
  - lib/doorkeeper/openid_connect/rails/routes/mapping.rb
160
- - lib/doorkeeper/openid_connect/response_mode.rb
161
- - lib/doorkeeper/openid_connect/response_types_config.rb
162
160
  - lib/doorkeeper/openid_connect/user_info.rb
163
161
  - lib/doorkeeper/openid_connect/version.rb
164
162
  - lib/doorkeeper/request/id_token.rb
@@ -179,12 +177,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
177
  requirements:
180
178
  - - ">="
181
179
  - !ruby/object:Gem::Version
182
- version: '2.4'
180
+ version: '2.5'
183
181
  required_rubygems_version: !ruby/object:Gem::Requirement
184
182
  requirements:
185
- - - ">="
183
+ - - ">"
186
184
  - !ruby/object:Gem::Version
187
- version: '0'
185
+ version: 1.3.1
188
186
  requirements: []
189
187
  rubygems_version: 3.1.4
190
188
  signing_key:
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Doorkeeper
4
- module OpenidConnect
5
- class ResponseMode
6
- attr_reader :type
7
-
8
- def initialize(response_type)
9
- @type = response_type
10
- end
11
-
12
- def fragment?
13
- mode == 'fragment'
14
- end
15
-
16
- def query?
17
- mode == 'query'
18
- end
19
-
20
- def mode
21
- case type
22
- when 'token', 'id_token', 'id_token token'
23
- 'fragment'
24
- else
25
- 'query'
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Doorkeeper
4
- module OpenidConnect
5
- module ResponseTypeConfig
6
- private def calculate_authorization_response_types
7
- types = super
8
- if grant_flows.include? 'implicit_oidc'
9
- types << 'token'
10
- types << 'id_token'
11
- types << 'id_token token'
12
- end
13
- types
14
- end
15
- end
16
- end
17
- end