oauth2 1.4.8 → 1.4.9

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: f9cd34855e4a7388c32053dbf97a38dafc04685818b1de1244a5782944ba742d
4
- data.tar.gz: e763de5d77201cfb9661458882d4a52a87268804a7455207b72f997815abba74
3
+ metadata.gz: ecc51b3695e669f4853934aa43c64de29380877340685e35e44ccc1be8957226
4
+ data.tar.gz: aa8e0e388084a5374743b1fc7122fd85729f41876fdbe9d679a441813cb3e10c
5
5
  SHA512:
6
- metadata.gz: 5b0ee6b53136ba7ef8cb6614eba4bd8af80dfc274dfc0cc857e07edfcfe8a3e6f6f59e38144581c4509c3a674e7f8a6ce7389e7f2f27dae02536b07e63815bb6
7
- data.tar.gz: 0ad35386515cdca17ef71ad5a7e6c98851532ea6549de173b6131289147f0745f8ae992b5d0ff49fb300125873495c81eb81f4fd48b1d0898e88f94e57bb33f1
6
+ metadata.gz: 06c89fbcf461bc08dce02c484b7fef1284d31bed026c606bf966fe85ca351451063763e9c580e9f716bd7a811e0dd8d2f0b3572df5190724dcaf0c539fd9d4aa
7
+ data.tar.gz: cf59ec61aa6d7e7c595ff2b5ea73a24441364300ba846efb52508907568ed5aa62619b69dec6428bbfbd341540a4d802709b03703e431fc83ed1de9634d10523
data/CHANGELOG.md CHANGED
@@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file.
3
3
 
4
4
  ## unreleased
5
5
 
6
+ ## [1.4.9] - 2022-02-20
7
+
8
+ - Fixes compatibility with Faraday v2 [572](https://github.com/oauth-xx/oauth2/issues/572)
9
+ - Includes supported versions of Faraday in test matrix:
10
+ - Faraday ~> 2.2.0 with Ruby >= 2.6
11
+ - Faraday ~> 1.10 with Ruby >= 2.4
12
+ - Faraday ~> 0.17.3 with Ruby >= 1.9
13
+ - Add Windows and MacOS to test matrix
14
+
6
15
  ## [1.4.8] - 2022-02-18
7
16
 
8
17
  - MFA is now required to push new gem versions (@pboling)
data/README.md CHANGED
@@ -39,8 +39,8 @@ branch which for version 1.4.x releases. Version 2.0 is coming! ⚠️
39
39
  | Version | Release Date | Readme |
40
40
  |---------|--------------|----------------------------------------------------------|
41
41
  | 1.4.8 | Feb 18, 2022 | https://github.com/oauth-xx/oauth2/blob/v1.4.8/README.md |
42
- | 1.4.7 | Mar 18, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.7/README.md |
43
- | 1.4.6 | Mar 18, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.6/README.md |
42
+ | 1.4.7 | Mar 19, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.7/README.md |
43
+ | 1.4.6 | Mar 19, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.6/README.md |
44
44
  | 1.4.5 | Mar 18, 2021 | https://github.com/oauth-xx/oauth2/blob/v1.4.5/README.md |
45
45
  | 1.4.4 | Feb 12, 2020 | https://github.com/oauth-xx/oauth2/blob/v1.4.4/README.md |
46
46
  | 1.4.3 | Jan 29, 2020 | https://github.com/oauth-xx/oauth2/blob/v1.4.3/README.md |
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  class AccessToken
3
5
  attr_reader :client, :token, :expires_in, :expires_at, :params
@@ -38,7 +40,7 @@ module OAuth2
38
40
  # @option opts [String] :header_format ('Bearer %s') the string format to use for the Authorization header
39
41
  # @option opts [String] :param_name ('access_token') the parameter name to use for transmission of the
40
42
  # Access Token value in :body or :query transmission mode
41
- def initialize(client, token, opts = {}) # rubocop:disable Metrics/AbcSize
43
+ def initialize(client, token, opts = {})
42
44
  @client = client
43
45
  @token = token.to_s
44
46
  opts = opts.dup
@@ -151,7 +153,7 @@ module OAuth2
151
153
 
152
154
  private
153
155
 
154
- def configure_authentication!(opts) # rubocop:disable Metrics/AbcSize
156
+ def configure_authentication!(opts)
155
157
  case options[:mode]
156
158
  when :header
157
159
  opts[:headers] ||= {}
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module OAuth2
@@ -60,7 +62,7 @@ module OAuth2
60
62
  params.merge(:headers => headers)
61
63
  end
62
64
 
63
- # @see https://tools.ietf.org/html/rfc2617#section-2
65
+ # @see https://datatracker.ietf.org/doc/html/rfc2617#section-2
64
66
  def basic_auth_header
65
67
  {'Authorization' => self.class.encode_basic_auth(id, secret)}
66
68
  end
data/lib/oauth2/client.rb CHANGED
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'logger'
3
5
 
4
6
  module OAuth2
7
+ ConnectionError = Class.new(Faraday::ConnectionFailed)
5
8
  # The OAuth2::Client class
6
9
  class Client # rubocop:disable Metrics/ClassLength
7
10
  RESERVED_PARAM_KEYS = %w[headers parse].freeze
@@ -16,17 +19,18 @@ module OAuth2
16
19
  #
17
20
  # @param [String] client_id the client_id value
18
21
  # @param [String] client_secret the client_secret value
19
- # @param [Hash] opts the options to create the client with
20
- # @option opts [String] :site the OAuth2 provider site host
21
- # @option opts [String] :redirect_uri the absolute URI to the Redirection Endpoint for use in authorization grants and token exchange
22
- # @option opts [String] :authorize_url ('/oauth/authorize') absolute or relative URL path to the Authorization endpoint
23
- # @option opts [String] :token_url ('/oauth/token') absolute or relative URL path to the Token endpoint
24
- # @option opts [Symbol] :token_method (:post) HTTP method to use to request token (:get or :post)
25
- # @option opts [Symbol] :auth_scheme (:basic_auth) HTTP method to use to authorize request (:basic_auth or :request_body)
26
- # @option opts [Hash] :connection_opts ({}) Hash of connection options to pass to initialize Faraday with
27
- # @option opts [FixNum] :max_redirects (5) maximum number of redirects to follow
28
- # @option opts [Boolean] :raise_errors (true) whether or not to raise an OAuth2::Error on responses with 400+ status codes
29
- # @option opts [Proc] :extract_access_token proc that extracts the access token from the response
22
+ # @param [Hash] options the options to create the client with
23
+ # @option options [String] :site the OAuth2 provider site host
24
+ # @option options [String] :redirect_uri the absolute URI to the Redirection Endpoint for use in authorization grants and token exchange
25
+ # @option options [String] :authorize_url ('oauth/authorize') absolute or relative URL path to the Authorization endpoint
26
+ # @option options [String] :token_url ('oauth/token') absolute or relative URL path to the Token endpoint
27
+ # @option options [Symbol] :token_method (:post) HTTP method to use to request token (:get or :post)
28
+ # @option options [Symbol] :auth_scheme (:basic_auth) HTTP method to use to authorize request (:basic_auth or :request_body)
29
+ # @option options [Hash] :connection_opts ({}) Hash of connection options to pass to initialize Faraday with
30
+ # @option options [FixNum] :max_redirects (5) maximum number of redirects to follow
31
+ # @option options [Boolean] :raise_errors (true) whether or not to raise an OAuth2::Error on responses with 400+ status codes
32
+ # @option options [Logger] :logger (::Logger.new($stdout)) which logger to use when OAUTH_DEBUG is enabled
33
+ # @option options [Proc] (DEPRECATED) :extract_access_token proc that extracts the access token from the response
30
34
  # @yield [builder] The Faraday connection builder
31
35
  def initialize(client_id, client_secret, options = {}, &block)
32
36
  opts = options.dup
@@ -34,24 +38,22 @@ module OAuth2
34
38
  @secret = client_secret
35
39
  @site = opts.delete(:site)
36
40
  ssl = opts.delete(:ssl)
37
-
38
- @options = {
39
- :authorize_url => '/oauth/authorize',
40
- :token_url => '/oauth/token',
41
- :token_method => :post,
42
- :auth_scheme => :request_body,
43
- :connection_opts => {},
44
- :connection_build => block,
45
- :max_redirects => 5,
46
- :raise_errors => true,
47
- :extract_access_token => DEFAULT_EXTRACT_ACCESS_TOKEN,
48
- }.merge(opts)
41
+ @options = {:authorize_url => 'oauth/authorize',
42
+ :token_url => 'oauth/token',
43
+ :token_method => :post,
44
+ :auth_scheme => :request_body,
45
+ :connection_opts => {},
46
+ :connection_build => block,
47
+ :max_redirects => 5,
48
+ :raise_errors => true,
49
+ :extract_access_token => DEFAULT_EXTRACT_ACCESS_TOKEN, # DEPRECATED
50
+ :logger => ::Logger.new($stdout)}.merge(opts)
49
51
  @options[:connection_opts][:ssl] = ssl if ssl
50
52
  end
51
53
 
52
54
  # Set the site host
53
55
  #
54
- # @param [String] the OAuth2 provider site host
56
+ # @param value [String] the OAuth2 provider site host
55
57
  def site=(value)
56
58
  @connection = nil
57
59
  @site = value
@@ -61,8 +63,12 @@ module OAuth2
61
63
  def connection
62
64
  @connection ||=
63
65
  Faraday.new(site, options[:connection_opts]) do |builder|
66
+ oauth_debug_logging(builder)
64
67
  if options[:connection_build]
65
68
  options[:connection_build].call(builder)
69
+ else
70
+ builder.request :url_encoded # form-encode POST params
71
+ builder.adapter Faraday.default_adapter # make requests with Net::HTTP
66
72
  end
67
73
  end
68
74
  end
@@ -94,15 +100,18 @@ module OAuth2
94
100
  # code response for this request. Will default to client option
95
101
  # @option opts [Symbol] :parse @see Response::initialize
96
102
  # @yield [req] The Faraday request
97
- def request(verb, url, opts = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
98
- connection.response :logger, ::Logger.new($stdout) if ENV['OAUTH_DEBUG'] == 'true'
99
-
103
+ def request(verb, url, opts = {}) # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize
100
104
  url = connection.build_url(url).to_s
101
105
 
102
- response = connection.run_request(verb, url, opts[:body], opts[:headers]) do |req|
103
- req.params.update(opts[:params]) if opts[:params]
104
- yield(req) if block_given?
106
+ begin
107
+ response = connection.run_request(verb, url, opts[:body], opts[:headers]) do |req|
108
+ req.params.update(opts[:params]) if opts[:params]
109
+ yield(req) if block_given?
110
+ end
111
+ rescue Faraday::ConnectionFailed => e
112
+ raise ConnectionError, e
105
113
  end
114
+
106
115
  response = Response.new(response, :parse => opts[:parse])
107
116
 
108
117
  case response.status
@@ -115,7 +124,13 @@ module OAuth2
115
124
  verb = :get
116
125
  opts.delete(:body)
117
126
  end
118
- request(verb, response.headers['location'], opts)
127
+ location = response.headers['location']
128
+ if location
129
+ request(verb, location, opts)
130
+ else
131
+ error = Error.new(response)
132
+ raise(error, "Got #{response.status} status code, but no Location header was present")
133
+ end
119
134
  when 200..299, 300..399
120
135
  # on non-redirecting 3xx statuses, just return the response
121
136
  response
@@ -133,11 +148,11 @@ module OAuth2
133
148
 
134
149
  # Initializes an AccessToken by making a request to the token endpoint
135
150
  #
136
- # @param [Hash] params a Hash of params for the token endpoint
137
- # @param [Hash] access token options, to pass to the AccessToken object
138
- # @param [Class] class of access token for easier subclassing OAuth2::AccessToken
151
+ # @param params [Hash] a Hash of params for the token endpoint
152
+ # @param access_token_opts [Hash] access token options, to pass to the AccessToken object
153
+ # @param access_token_class [Class] class of access token for easier subclassing OAuth2::AccessToken
139
154
  # @return [AccessToken] the initialized AccessToken
140
- def get_token(params, access_token_opts = {}, extract_access_token = options[:extract_access_token]) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
155
+ def get_token(params, access_token_opts = {}, extract_access_token = options[:extract_access_token]) # # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity Metrics/AbcSize, Metrics/MethodLength
141
156
  params = params.map do |key, value|
142
157
  if RESERVED_PARAM_KEYS.include?(key)
143
158
  [key.to_sym, value]
@@ -147,7 +162,7 @@ module OAuth2
147
162
  end
148
163
  params = Hash[params]
149
164
 
150
- params = Authenticator.new(id, secret, options[:auth_scheme]).apply(params)
165
+ params = authenticator.apply(params)
151
166
  opts = {:raise_errors => options[:raise_errors], :parse => params.delete(:parse)}
152
167
  headers = params.delete(:headers) || {}
153
168
  if options[:token_method] == :post
@@ -157,8 +172,9 @@ module OAuth2
157
172
  opts[:params] = params
158
173
  opts[:headers] = {}
159
174
  end
160
- opts[:headers].merge!(headers)
161
- response = request(options[:token_method], token_url, opts)
175
+ opts[:headers] = opts[:headers].merge(headers)
176
+ http_method = options[:token_method]
177
+ response = request(http_method, token_url, opts)
162
178
 
163
179
  access_token = begin
164
180
  build_access_token(response, access_token_opts, extract_access_token)
@@ -166,37 +182,45 @@ module OAuth2
166
182
  nil
167
183
  end
168
184
 
169
- if options[:raise_errors] && !access_token
185
+ response_contains_token = access_token || (
186
+ response.parsed.is_a?(Hash) &&
187
+ (response.parsed['access_token'] || response.parsed['id_token'])
188
+ )
189
+
190
+ if options[:raise_errors] && !response_contains_token
170
191
  error = Error.new(response)
171
192
  raise(error)
193
+ elsif !response_contains_token
194
+ return nil
172
195
  end
196
+
173
197
  access_token
174
198
  end
175
199
 
176
200
  # The Authorization Code strategy
177
201
  #
178
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.1
202
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-15#section-4.1
179
203
  def auth_code
180
204
  @auth_code ||= OAuth2::Strategy::AuthCode.new(self)
181
205
  end
182
206
 
183
207
  # The Implicit strategy
184
208
  #
185
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-26#section-4.2
209
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-26#section-4.2
186
210
  def implicit
187
211
  @implicit ||= OAuth2::Strategy::Implicit.new(self)
188
212
  end
189
213
 
190
214
  # The Resource Owner Password Credentials strategy
191
215
  #
192
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.3
216
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-15#section-4.3
193
217
  def password
194
218
  @password ||= OAuth2::Strategy::Password.new(self)
195
219
  end
196
220
 
197
221
  # The Client Credentials strategy
198
222
  #
199
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.4
223
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-15#section-4.4
200
224
  def client_credentials
201
225
  @client_credentials ||= OAuth2::Strategy::ClientCredentials.new(self)
202
226
  end
@@ -216,10 +240,10 @@ module OAuth2
216
240
  #
217
241
  # @api semipublic
218
242
  #
219
- # @see https://tools.ietf.org/html/rfc6749#section-4.1
220
- # @see https://tools.ietf.org/html/rfc6749#section-4.1.3
221
- # @see https://tools.ietf.org/html/rfc6749#section-4.2.1
222
- # @see https://tools.ietf.org/html/rfc6749#section-10.6
243
+ # @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1
244
+ # @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.3
245
+ # @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.1
246
+ # @see https://datatracker.ietf.org/doc/html/rfc6749#section-10.6
223
247
  # @return [Hash] the params to add to a request or URL
224
248
  def redirection_params
225
249
  if options[:redirect_uri]
@@ -236,19 +260,33 @@ module OAuth2
236
260
 
237
261
  private
238
262
 
263
+ # Returns the authenticator object
264
+ #
265
+ # @return [Authenticator] the initialized Authenticator
266
+ def authenticator
267
+ Authenticator.new(id, secret, options[:auth_scheme])
268
+ end
269
+
270
+ # Builds the access token from the response of the HTTP call
271
+ #
272
+ # @return [AccessToken] the initialized AccessToken
239
273
  def build_access_token(response, access_token_opts, extract_access_token)
240
274
  parsed_response = response.parsed.dup
241
275
  return unless parsed_response.is_a?(Hash)
242
276
 
243
277
  hash = parsed_response.merge(access_token_opts)
244
278
 
245
- # Provide backwards compatibility for old AcessToken.form_hash pattern
246
- # Should be deprecated in 2.x
279
+ # Provide backwards compatibility for old AccessToken.form_hash pattern
280
+ # Will be deprecated in 2.x
247
281
  if extract_access_token.is_a?(Class) && extract_access_token.respond_to?(:from_hash)
248
282
  extract_access_token.from_hash(self, hash)
249
283
  else
250
284
  extract_access_token.call(self, hash)
251
285
  end
252
286
  end
287
+
288
+ def oauth_debug_logging(builder)
289
+ builder.response :logger, options[:logger], :bodies => true if ENV['OAUTH_DEBUG'] == 'true'
290
+ end
253
291
  end
254
292
  end
data/lib/oauth2/error.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  class Error < StandardError
3
5
  attr_reader :response, :code, :description
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
  require 'digest'
3
5
  require 'openssl'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'multi_json'
2
4
  require 'multi_xml'
3
5
  require 'rack'
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jwt'
2
4
 
3
5
  module OAuth2
4
6
  module Strategy
5
7
  # The Client Assertion Strategy
6
8
  #
7
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-4.1.3
9
+ # @see https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-10#section-4.1.3
8
10
  #
9
11
  # Sample usage:
10
12
  # client = OAuth2::Client.new(client_id, client_secret,
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  module Strategy
3
5
  # The Authorization Code Strategy
4
6
  #
5
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.1
7
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-15#section-4.1
6
8
  class AuthCode < Base
7
9
  # The required query parameters for the authorize URL
8
10
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  module Strategy
3
5
  class Base
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  module Strategy
3
5
  # The Client Credentials Strategy
4
6
  #
5
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.4
7
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-15#section-4.4
6
8
  class ClientCredentials < Base
7
9
  # Not used for this strategy
8
10
  #
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  module Strategy
3
5
  # The Implicit Strategy
4
6
  #
5
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-26#section-4.2
7
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-26#section-4.2
6
8
  class Implicit < Base
7
9
  # The required query parameters for the authorize URL
8
10
  #
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth2
2
4
  module Strategy
3
5
  # The Resource Owner Password Credentials Authorization Strategy
4
6
  #
5
- # @see http://tools.ietf.org/html/draft-ietf-oauth-v2-15#section-4.3
7
+ # @see http://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-15#section-4.3
6
8
  class Password < Base
7
9
  # Not used for this strategy
8
10
  #
@@ -24,7 +24,7 @@ module OAuth2
24
24
  #
25
25
  # @return [Integer]
26
26
  def patch
27
- 8
27
+ 9
28
28
  end
29
29
 
30
30
  # The pre-release version, if any
data/lib/oauth2.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'oauth2/error'
2
4
  require 'oauth2/authenticator'
3
5
  require 'oauth2/client'
@@ -0,0 +1,11 @@
1
+ # RS256
2
+
3
+ ## How keys were made
4
+
5
+ ```shell
6
+ # No passphrase
7
+ # Generates the public and private keys:
8
+ ssh-keygen -t rsa -b 4096 -m PEM -f jwtRS256.key
9
+ # Converts the key to PEM format
10
+ openssl rsa -in jwtRS256.key -pubout -outform PEM -out jwtRS256.key.pub
11
+ ```
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,14 @@
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5hdXV/4YSymY1T9VNvK2
3
+ bWRfulwIty1RnAPNINQmfh3aRRkV+PNrbC2Crji9G0AHmQwgW1bZ3kgkkpIm6RVn
4
+ 44fHvBvuXkZ9ABgXw0d2cLIHmwOFxSKmWAm/EW//GszUTLLLsMZUe2udtFJW0jxX
5
+ B2GRY0WVYuo6Oo58RCeP719lw3Ags0YF9/IobxKkGd4BautUPw6ZszAa3o+j0zR7
6
+ 4x7ouPxybZAOuPsMxqanyeYJeH4osJjLMYV9qem9uG2sj7GENJ8UszcpmGbqxBhe
7
+ xPEB7mgDeONIF0XJF23zdOf8ANE5mAU2h2v7M6moAfkdUzJ+j48+VT2omHAzAL5y
8
+ Ncmrl2xiWdyoxOw1Y1UmfEmJYV5VgGYyZ12JZRKY+szPT+vR+MDuYxbquF40O7kv
9
+ kFNBfL1yCpzfSQCLnEs4rX8qRzZXciLeyq4Ht5FLuRFgxjA//XI8LAmp0u7gk+Q7
10
+ FUH1UgW3kmJDTG0XaxQxYTBSIO7mcmyjDyBgKVuQmt5E1ycFeteOVdPD/CG/fPYh
11
+ thvc4UytEFwsMdNy3iD6/wuUH68tAKam28UZaOb0qK+00cQQD8fulY9rKtSL10Lv
12
+ JFWUOa/SJyLvk9vUmfvFn182il1nX6GpyxyMmE/FCnH4CT/DjrSZf08mOO8eL5of
13
+ YHMK/oiXr1eODqx+pOwClNsCAwEAAQ==
14
+ -----END PUBLIC KEY-----
data/spec/helper.rb CHANGED
@@ -1,12 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  DEBUG = ENV['DEBUG'] == 'true'
4
+ RUN_COVERAGE = ENV['CI_CODECOV'] || ENV['CI'].nil?
2
5
 
3
6
  ruby_version = Gem::Version.new(RUBY_VERSION)
4
7
  minimum_version = ->(version) { ruby_version >= Gem::Version.new(version) && RUBY_ENGINE == 'ruby' }
5
- coverage = minimum_version.call('2.7')
6
- debug = minimum_version.call('2.5')
8
+ coverage = minimum_version.call('2.7') && RUN_COVERAGE
9
+ debug = minimum_version.call('2.5') && DEBUG
7
10
 
8
11
  require 'simplecov' if coverage
9
- require 'byebug' if DEBUG && debug
12
+ require 'byebug' if debug
10
13
 
11
14
  require 'oauth2'
12
15
  require 'addressable/uri'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::AccessToken do
2
4
  subject { described_class.new(client, token) }
3
5
 
@@ -30,7 +32,7 @@ describe OAuth2::AccessToken do
30
32
  expect(target.params['foo']).to eq('bar')
31
33
  end
32
34
 
33
- def assert_initialized_token(target) # rubocop:disable Metrics/AbcSize
35
+ def assert_initialized_token(target)
34
36
  expect(target.token).to eq(token)
35
37
  expect(target).to be_expires
36
38
  expect(target.params.keys).to include('foo')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::Authenticator do
2
4
  subject do
3
5
  described_class.new(client_id, client_secret, mode)
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
- require 'helper'
4
4
  require 'nkf'
5
5
 
6
6
  describe OAuth2::Client do
7
7
  subject do
8
- described_class.new('abc', 'def', :site => 'https://api.example.com') do |builder|
8
+ described_class.new('abc', 'def', {:site => 'https://api.example.com'}.merge(options)) do |builder|
9
9
  builder.adapter :test do |stub|
10
10
  stub.get('/success') { |env| [200, {'Content-Type' => 'text/awesome'}, 'yay'] }
11
11
  stub.get('/reflect') { |env| [200, {}, env[:body]] }
@@ -13,6 +13,7 @@ describe OAuth2::Client do
13
13
  stub.get('/unauthorized') { |env| [401, {'Content-Type' => 'application/json'}, MultiJson.encode(:error => error_value, :error_description => error_description_value)] }
14
14
  stub.get('/conflict') { |env| [409, {'Content-Type' => 'text/plain'}, 'not authorized'] }
15
15
  stub.get('/redirect') { |env| [302, {'Content-Type' => 'text/plain', 'location' => '/success'}, ''] }
16
+ stub.get('/redirect_no_loc') { |_env| [302, {'Content-Type' => 'text/plain'}, ''] }
16
17
  stub.post('/redirect') { |env| [303, {'Content-Type' => 'text/plain', 'location' => '/reflect'}, ''] }
17
18
  stub.get('/error') { |env| [500, {'Content-Type' => 'text/plain'}, 'unknown error'] }
18
19
  stub.get('/empty_get') { |env| [204, {}, nil] }
@@ -24,6 +25,7 @@ describe OAuth2::Client do
24
25
 
25
26
  let!(:error_value) { 'invalid_token' }
26
27
  let!(:error_description_value) { 'bad bad token' }
28
+ let(:options) { {} }
27
29
 
28
30
  describe '#initialize' do
29
31
  it 'assigns id and secret' do
@@ -44,10 +46,10 @@ describe OAuth2::Client do
44
46
  end
45
47
 
46
48
  it 'is able to pass a block to configure the connection' do
47
- connection = double('connection')
48
49
  builder = double('builder')
50
+
49
51
  allow(Faraday).to receive(:new).and_yield(builder)
50
- allow(Faraday::Connection).to receive(:new).and_return(connection)
52
+ allow(builder).to receive(:response)
51
53
 
52
54
  expect(builder).to receive(:adapter).with(:test)
53
55
 
@@ -70,7 +72,7 @@ describe OAuth2::Client do
70
72
  it 'allows override of raise_errors option' do
71
73
  client = described_class.new('abc', 'def', :site => 'https://api.example.com', :raise_errors => true) do |builder|
72
74
  builder.adapter :test do |stub|
73
- stub.get('/notfound') { |env| [404, {}, nil] }
75
+ stub.get('/notfound') { |_env| [404, {}, nil] }
74
76
  end
75
77
  end
76
78
  expect(client.options[:raise_errors]).to be true
@@ -109,6 +111,30 @@ describe OAuth2::Client do
109
111
  subject.options[:"#{url_type}_url"] = 'https://api.foo.com/oauth/custom'
110
112
  expect(subject.send("#{url_type}_url")).to eq('https://api.foo.com/oauth/custom')
111
113
  end
114
+
115
+ context 'when a URL with path is used in the site' do
116
+ let(:options) do
117
+ {:site => 'https://example.com/blog'}
118
+ end
119
+
120
+ it 'generates an authorization URL relative to the site' do
121
+ expect(subject.send("#{url_type}_url")).to eq("https://example.com/blog/oauth/#{url_type}")
122
+ end
123
+ end
124
+
125
+ context 'when a URL with path is used in the site and urls overridden' do
126
+ let(:options) do
127
+ {
128
+ :site => 'https://example.com/blog',
129
+ :authorize_url => "oauth/#{url_type}/lampoon",
130
+ :token_url => "oauth/#{url_type}/lampoon",
131
+ }
132
+ end
133
+
134
+ it 'generates an authorization URL relative to the site' do
135
+ expect(subject.send("#{url_type}_url")).to eq("https://example.com/blog/oauth/#{url_type}/lampoon")
136
+ end
137
+ end
112
138
  end
113
139
  end
114
140
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::MACToken do
2
4
  subject { described_class.new(client, token, 'abc123') }
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::Response do
2
4
  describe '#initialize' do
3
5
  let(:status) { 200 }
@@ -75,6 +77,10 @@ describe OAuth2::Response do
75
77
  end
76
78
 
77
79
  context 'with xml parser registration' do
80
+ before do
81
+ MultiXml.parser = :rexml
82
+ end
83
+
78
84
  it 'tries to load multi_xml and use it' do
79
85
  expect(described_class.send(:class_variable_get, :@@parsers)[:xml]).not_to be_nil
80
86
  end
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+
1
5
  describe OAuth2::Strategy::Assertion do
2
- subject { client.assertion }
6
+ let(:client_assertion) { client.assertion }
3
7
 
4
8
  let(:client) do
5
9
  cli = OAuth2::Client.new('abc', 'def', :site => 'http://api.example.com')
@@ -28,31 +32,81 @@ describe OAuth2::Strategy::Assertion do
28
32
 
29
33
  describe '#authorize_url' do
30
34
  it 'raises NotImplementedError' do
31
- expect { subject.authorize_url }.to raise_error(NotImplementedError)
35
+ expect { client_assertion.authorize_url }.to raise_error(NotImplementedError)
32
36
  end
33
37
  end
34
38
 
35
39
  %w[json formencoded].each do |mode|
36
- describe "#get_token (#{mode})" do
37
- before do
38
- @mode = mode
39
- @access = subject.get_token(params)
40
- end
40
+ before { @mode = mode }
41
41
 
42
- it 'returns AccessToken with same Client' do
43
- expect(@access.client).to eq(client)
44
- end
42
+ shared_examples_for "get_token #{mode}" do
43
+ describe "#get_token (#{mode})" do
44
+ subject(:get_token) { client_assertion.get_token(params) }
45
+
46
+ it 'returns AccessToken with same Client' do
47
+ expect(get_token.client).to eq(client)
48
+ end
45
49
 
46
- it 'returns AccessToken with #token' do
47
- expect(@access.token).to eq('salmon')
50
+ it 'returns AccessToken with #token' do
51
+ expect(get_token.token).to eq('salmon')
52
+ end
53
+
54
+ it 'returns AccessToken with #expires_in' do
55
+ expect(get_token.expires_in).to eq(600)
56
+ end
57
+
58
+ it 'returns AccessToken with #expires_at' do
59
+ expect(get_token.expires_at).not_to be_nil
60
+ end
48
61
  end
62
+ end
63
+
64
+ it_behaves_like "get_token #{mode}"
65
+ describe "#build_assertion (#{mode})" do
66
+ context 'with hmac_secret' do
67
+ subject(:build_assertion) { client_assertion.build_assertion(params) }
68
+
69
+ let(:hmac_secret) { '1883be842495c3b58f68ca71fbf1397fbb9ed2fdf8990f8404a25d0a1b995943' }
70
+ let(:params) do
71
+ {
72
+ :iss => 2345,
73
+ :aud => 'too',
74
+ :prn => 'much',
75
+ :exp => 123_456_789,
76
+ :hmac_secret => hmac_secret,
77
+ }
78
+ end
79
+ let(:jwt) { 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOjIzNDUsImF1ZCI6InRvbyIsInBybiI6Im11Y2giLCJleHAiOjEyMzQ1Njc4OX0.GnZjgcdc5WSWKNW0p9S4GuhpBs3LJCEqjPm6turLG-c' }
80
+
81
+ it 'returns JWT' do
82
+ expect(build_assertion).to eq(jwt)
83
+ end
49
84
 
50
- it 'returns AccessToken with #expires_in' do
51
- expect(@access.expires_in).to eq(600)
85
+ it_behaves_like "get_token #{mode}"
52
86
  end
53
87
 
54
- it 'returns AccessToken with #expires_at' do
55
- expect(@access.expires_at).not_to be_nil
88
+ context 'with private_key' do
89
+ subject(:build_assertion) { client_assertion.build_assertion(params) }
90
+
91
+ let(:private_key_file) { 'spec/fixtures/RS256/jwtRS256.key' }
92
+ let(:password) { '' }
93
+ let(:private_key) { OpenSSL::PKey::RSA.new(File.read(private_key_file), password) }
94
+ let(:params) do
95
+ {
96
+ :iss => 2345,
97
+ :aud => 'too',
98
+ :prn => 'much',
99
+ :exp => 123_456_789,
100
+ :private_key => private_key,
101
+ }
102
+ end
103
+ let(:jwt) { 'eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOjIzNDUsImF1ZCI6InRvbyIsInBybiI6Im11Y2giLCJleHAiOjEyMzQ1Njc4OX0.vJ32OiPVMdJrlNkPw02Y9u6beiFY0Mfndhg_CkEDLtOYn8dscQIEpWoR4GzH8tiQVOQ1fOkqxE95tNIKOTjnIoskmYnfzhzIl9fnfQ_lsEuLC-nq45KhPzSM2wYgF2ZEIjDq51daK70bRPzTBr1Id45cTY-jJSito0lbKXj2nPa_Gs-_vyEU2MSxjiMaIxxccfY4Ow5zN3AUMTKp6LjrpDKFxag3fJ1nrb6iDATa504gyJHVLift3ovhAwYidkA81WnmEtISWBY904CKIcZD9Cx3ifS5bc3JaLAteIBKAAyD8o7D60vOKutsjCMHUCKL357BQ36bW7fmaEtW367Ri-xgOsCY0_HeWp991vrJ-DxhFPeuF-8hn_9KggBzKbA2eKEOOY4iDKSFwjWQUFOcRdvHw9RgbGt0IjY3wdo8CaJVlhynh54YlaLgOFhTBPeMgZdqQUHOztljaK9zubeVkrDGNnGuSuq0KR82KArb1x2z7XyZpxiV5ZatP9SNyhn-YIWk7UeQYXaS0UfsBX7L5T1y_FZj84r7Vl42lj1DfdR5DyGvHfZyHotTnejdIrDuQfDL_bGe24eHsilzuEFaajYmu10hxflZ6Apm-lekRRV47tbxTF1zI5we14XsTeklrTXqgDkSw6gyOoNUJm-cQkJpfdvBgUHYGInC1ttz7NU' }
104
+
105
+ it 'returns JWT' do
106
+ expect(build_assertion).to eq(jwt)
107
+ end
108
+
109
+ it_behaves_like "get_token #{mode}"
56
110
  end
57
111
  end
58
112
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  describe OAuth2::Strategy::AuthCode do
4
5
  subject { client.auth_code }
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::Strategy::Base do
2
4
  it 'initializes with a Client' do
3
5
  expect { described_class.new(OAuth2::Client.new('abc', 'def')) }.not_to raise_error
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::Strategy::ClientCredentials do
2
4
  subject { client.client_credentials }
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::Strategy::Implicit do
2
4
  subject { client.implicit }
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  describe OAuth2::Strategy::Password do
2
4
  subject { client.password }
3
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oauth2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.8
4
+ version: 1.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-02-18 00:00:00.000000000 Z
13
+ date: 2022-02-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: faraday
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '0.8'
21
+ version: 0.17.3
22
22
  - - "<"
23
23
  - !ruby/object:Gem::Version
24
24
  version: '3.0'
@@ -28,7 +28,7 @@ dependencies:
28
28
  requirements:
29
29
  - - ">="
30
30
  - !ruby/object:Gem::Version
31
- version: '0.8'
31
+ version: 0.17.3
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '3.0'
@@ -114,20 +114,6 @@ dependencies:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
116
  version: '2.3'
117
- - !ruby/object:Gem::Dependency
118
- name: backports
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '3.11'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '3.11'
131
117
  - !ruby/object:Gem::Dependency
132
118
  name: bundler
133
119
  requirement: !ruby/object:Gem::Requirement
@@ -157,25 +143,19 @@ dependencies:
157
143
  - !ruby/object:Gem::Version
158
144
  version: '12.3'
159
145
  - !ruby/object:Gem::Dependency
160
- name: rdoc
146
+ name: rexml
161
147
  requirement: !ruby/object:Gem::Requirement
162
148
  requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- version: '5.0'
166
- - - "<"
149
+ - - "~>"
167
150
  - !ruby/object:Gem::Version
168
- version: '7'
151
+ version: '3.2'
169
152
  type: :development
170
153
  prerelease: false
171
154
  version_requirements: !ruby/object:Gem::Requirement
172
155
  requirements:
173
- - - ">="
174
- - !ruby/object:Gem::Version
175
- version: '5.0'
176
- - - "<"
156
+ - - "~>"
177
157
  - !ruby/object:Gem::Version
178
- version: '7'
158
+ version: '3.2'
179
159
  - !ruby/object:Gem::Dependency
180
160
  name: rspec
181
161
  requirement: !ruby/object:Gem::Requirement
@@ -246,20 +226,6 @@ dependencies:
246
226
  - - ">="
247
227
  - !ruby/object:Gem::Version
248
228
  version: '0'
249
- - !ruby/object:Gem::Dependency
250
- name: wwtd
251
- requirement: !ruby/object:Gem::Requirement
252
- requirements:
253
- - - ">="
254
- - !ruby/object:Gem::Version
255
- version: '0'
256
- type: :development
257
- prerelease: false
258
- version_requirements: !ruby/object:Gem::Requirement
259
- requirements:
260
- - - ">="
261
- - !ruby/object:Gem::Version
262
- version: '0'
263
229
  description: A Ruby wrapper for the OAuth 2.0 protocol built with a similar style
264
230
  to the original OAuth spec.
265
231
  email:
@@ -286,6 +252,9 @@ files:
286
252
  - lib/oauth2/strategy/implicit.rb
287
253
  - lib/oauth2/strategy/password.rb
288
254
  - lib/oauth2/version.rb
255
+ - spec/fixtures/README.md
256
+ - spec/fixtures/RS256/jwtRS256.key
257
+ - spec/fixtures/RS256/jwtRS256.key.pub
289
258
  - spec/helper.rb
290
259
  - spec/oauth2/access_token_spec.rb
291
260
  - spec/oauth2/authenticator_spec.rb
@@ -304,9 +273,9 @@ licenses:
304
273
  - MIT
305
274
  metadata:
306
275
  bug_tracker_uri: https://github.com/oauth-xx/oauth2/issues
307
- changelog_uri: https://github.com/oauth-xx/oauth2/blob/v1.4.8/CHANGELOG.md
308
- documentation_uri: https://www.rubydoc.info/gems/oauth2/1.4.8
309
- source_code_uri: https://github.com/oauth-xx/oauth2/tree/v1.4.8
276
+ changelog_uri: https://github.com/oauth-xx/oauth2/blob/v1.4.9/CHANGELOG.md
277
+ documentation_uri: https://www.rubydoc.info/gems/oauth2/1.4.9
278
+ source_code_uri: https://github.com/oauth-xx/oauth2/tree/v1.4.9
310
279
  wiki_uri: https://github.com/oauth-xx/oauth2/wiki
311
280
  rubygems_mfa_required: 'true'
312
281
  post_install_message:
@@ -329,6 +298,9 @@ signing_key:
329
298
  specification_version: 4
330
299
  summary: A Ruby wrapper for the OAuth 2.0 protocol.
331
300
  test_files:
301
+ - spec/fixtures/README.md
302
+ - spec/fixtures/RS256/jwtRS256.key
303
+ - spec/fixtures/RS256/jwtRS256.key.pub
332
304
  - spec/helper.rb
333
305
  - spec/oauth2/access_token_spec.rb
334
306
  - spec/oauth2/authenticator_spec.rb