oauth2 1.4.8 → 1.4.9

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: 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