oauth2 1.4.7 → 1.4.11

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oauth2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.7
4
+ version: 1.4.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
8
- - Michael Bleigh
9
8
  - Erik Michaels-Ober
9
+ - Michael Bleigh
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-03-19 00:00:00.000000000 Z
13
+ date: 2022-09-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: faraday
@@ -18,20 +18,20 @@ 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
- version: '2.0'
24
+ version: '3.0'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
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
- version: '2.0'
34
+ version: '3.0'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: jwt
37
37
  requirement: !ruby/object:Gem::Requirement
@@ -89,7 +89,7 @@ dependencies:
89
89
  version: '1.2'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
- version: '3'
92
+ version: '4'
93
93
  type: :runtime
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
@@ -99,35 +99,21 @@ dependencies:
99
99
  version: '1.2'
100
100
  - - "<"
101
101
  - !ruby/object:Gem::Version
102
- version: '3'
102
+ version: '4'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: addressable
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '2.3'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '2.3'
117
- - !ruby/object:Gem::Dependency
118
- name: backports
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
107
+ - - ">="
122
108
  - !ruby/object:Gem::Version
123
- version: '3.11'
109
+ version: '2'
124
110
  type: :development
125
111
  prerelease: false
126
112
  version_requirements: !ruby/object:Gem::Requirement
127
113
  requirements:
128
- - - "~>"
114
+ - - ">="
129
115
  - !ruby/object:Gem::Version
130
- version: '3.11'
116
+ version: '2'
131
117
  - !ruby/object:Gem::Dependency
132
118
  name: bundler
133
119
  requirement: !ruby/object:Gem::Requirement
@@ -142,68 +128,48 @@ dependencies:
142
128
  - - ">="
143
129
  - !ruby/object:Gem::Version
144
130
  version: '1.16'
145
- - !ruby/object:Gem::Dependency
146
- name: coveralls
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '0.8'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '0.8'
159
131
  - !ruby/object:Gem::Dependency
160
132
  name: rake
161
133
  requirement: !ruby/object:Gem::Requirement
162
134
  requirements:
163
- - - "~>"
135
+ - - ">="
164
136
  - !ruby/object:Gem::Version
165
- version: '12.3'
137
+ version: '12'
166
138
  type: :development
167
139
  prerelease: false
168
140
  version_requirements: !ruby/object:Gem::Requirement
169
141
  requirements:
170
- - - "~>"
142
+ - - ">="
171
143
  - !ruby/object:Gem::Version
172
- version: '12.3'
144
+ version: '12'
173
145
  - !ruby/object:Gem::Dependency
174
- name: rdoc
146
+ name: rexml
175
147
  requirement: !ruby/object:Gem::Requirement
176
148
  requirements:
177
149
  - - ">="
178
150
  - !ruby/object:Gem::Version
179
- version: '5.0'
180
- - - "<"
181
- - !ruby/object:Gem::Version
182
- version: '7'
151
+ version: '3'
183
152
  type: :development
184
153
  prerelease: false
185
154
  version_requirements: !ruby/object:Gem::Requirement
186
155
  requirements:
187
156
  - - ">="
188
157
  - !ruby/object:Gem::Version
189
- version: '5.0'
190
- - - "<"
191
- - !ruby/object:Gem::Version
192
- version: '7'
158
+ version: '3'
193
159
  - !ruby/object:Gem::Dependency
194
160
  name: rspec
195
161
  requirement: !ruby/object:Gem::Requirement
196
162
  requirements:
197
- - - "~>"
163
+ - - ">="
198
164
  - !ruby/object:Gem::Version
199
- version: '3.0'
165
+ version: '3'
200
166
  type: :development
201
167
  prerelease: false
202
168
  version_requirements: !ruby/object:Gem::Requirement
203
169
  requirements:
204
- - - "~>"
170
+ - - ">="
205
171
  - !ruby/object:Gem::Version
206
- version: '3.0'
172
+ version: '3'
207
173
  - !ruby/object:Gem::Dependency
208
174
  name: rspec-block_is_expected
209
175
  requirement: !ruby/object:Gem::Requirement
@@ -247,21 +213,27 @@ dependencies:
247
213
  - !ruby/object:Gem::Version
248
214
  version: '0'
249
215
  - !ruby/object:Gem::Dependency
250
- name: silent_stream
216
+ name: rubocop-lts
251
217
  requirement: !ruby/object:Gem::Requirement
252
218
  requirements:
253
219
  - - ">="
254
220
  - !ruby/object:Gem::Version
255
- version: '0'
221
+ version: 2.0.3
222
+ - - "~>"
223
+ - !ruby/object:Gem::Version
224
+ version: '2.0'
256
225
  type: :development
257
226
  prerelease: false
258
227
  version_requirements: !ruby/object:Gem::Requirement
259
228
  requirements:
260
229
  - - ">="
261
230
  - !ruby/object:Gem::Version
262
- version: '0'
231
+ version: 2.0.3
232
+ - - "~>"
233
+ - !ruby/object:Gem::Version
234
+ version: '2.0'
263
235
  - !ruby/object:Gem::Dependency
264
- name: wwtd
236
+ name: silent_stream
265
237
  requirement: !ruby/object:Gem::Requirement
266
238
  requirements:
267
239
  - - ">="
@@ -284,8 +256,10 @@ extra_rdoc_files: []
284
256
  files:
285
257
  - CHANGELOG.md
286
258
  - CODE_OF_CONDUCT.md
259
+ - CONTRIBUTING.md
287
260
  - LICENSE
288
261
  - README.md
262
+ - SECURITY.md
289
263
  - lib/oauth2.rb
290
264
  - lib/oauth2/access_token.rb
291
265
  - lib/oauth2/authenticator.rb
@@ -300,29 +274,37 @@ files:
300
274
  - lib/oauth2/strategy/implicit.rb
301
275
  - lib/oauth2/strategy/password.rb
302
276
  - lib/oauth2/version.rb
303
- - spec/helper.rb
304
- - spec/oauth2/access_token_spec.rb
305
- - spec/oauth2/authenticator_spec.rb
306
- - spec/oauth2/client_spec.rb
307
- - spec/oauth2/mac_token_spec.rb
308
- - spec/oauth2/response_spec.rb
309
- - spec/oauth2/strategy/assertion_spec.rb
310
- - spec/oauth2/strategy/auth_code_spec.rb
311
- - spec/oauth2/strategy/base_spec.rb
312
- - spec/oauth2/strategy/client_credentials_spec.rb
313
- - spec/oauth2/strategy/implicit_spec.rb
314
- - spec/oauth2/strategy/password_spec.rb
315
- - spec/oauth2/version_spec.rb
316
- homepage: https://github.com/oauth-xx/oauth2
277
+ homepage: https://gitlab.com/oauth-xx/oauth2
317
278
  licenses:
318
279
  - MIT
319
280
  metadata:
320
- bug_tracker_uri: https://github.com/oauth-xx/oauth2/issues
321
- changelog_uri: https://github.com/oauth-xx/oauth2/blob/v1.4.7/CHANGELOG.md
322
- documentation_uri: https://www.rubydoc.info/gems/oauth2/1.4.7
323
- source_code_uri: https://github.com/oauth-xx/oauth2/tree/v1.4.7
324
- wiki_uri: https://github.com/oauth-xx/oauth2/wiki
325
- post_install_message:
281
+ homepage_uri: https://gitlab.com/oauth-xx/oauth2
282
+ source_code_uri: https://gitlab.com/oauth-xx/oauth2/-/tree/v1.4.11
283
+ changelog_uri: https://gitlab.com/oauth-xx/oauth2/-/blob/v1.4.11/CHANGELOG.md
284
+ bug_tracker_uri: https://gitlab.com/oauth-xx/oauth2/-/issues
285
+ documentation_uri: https://www.rubydoc.info/gems/oauth2/1.4.11
286
+ wiki_uri: https://gitlab.com/oauth-xx/oauth2/-/wiki
287
+ funding_uri: https://liberapay.com/pboling
288
+ rubygems_mfa_required: 'true'
289
+ post_install_message: |2+
290
+
291
+ You have installed oauth2 version 1.4.11, which is EOL.
292
+ No further support is anticipated for the 1.4.x series.
293
+
294
+ OAuth2 version 2 is released.
295
+ There are BREAKING changes, but most will not encounter them, and upgrading should be easy!
296
+
297
+ We have made two other major migrations:
298
+ 1. master branch renamed to main
299
+ 2. Github has been replaced with Gitlab
300
+
301
+ Please see:
302
+ • https://gitlab.com/oauth-xx/oauth2#what-is-new-for-v20
303
+ • https://gitlab.com/oauth-xx/oauth2/-/blob/main/CHANGELOG.md
304
+ • https://groups.google.com/g/oauth-ruby/c/QA_dtrXWXaE
305
+
306
+ Please upgrade, report issues, and support the project! Thanks, |7eter l-|. l3oling
307
+
326
308
  rdoc_options: []
327
309
  require_paths:
328
310
  - lib
@@ -335,23 +317,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
317
  requirements:
336
318
  - - ">="
337
319
  - !ruby/object:Gem::Version
338
- version: 1.3.5
320
+ version: '0'
339
321
  requirements: []
340
- rubygems_version: 3.2.9
322
+ rubygems_version: 3.3.21
341
323
  signing_key:
342
324
  specification_version: 4
343
325
  summary: A Ruby wrapper for the OAuth 2.0 protocol.
344
- test_files:
345
- - spec/helper.rb
346
- - spec/oauth2/client_spec.rb
347
- - spec/oauth2/version_spec.rb
348
- - spec/oauth2/authenticator_spec.rb
349
- - spec/oauth2/mac_token_spec.rb
350
- - spec/oauth2/access_token_spec.rb
351
- - spec/oauth2/response_spec.rb
352
- - spec/oauth2/strategy/password_spec.rb
353
- - spec/oauth2/strategy/client_credentials_spec.rb
354
- - spec/oauth2/strategy/assertion_spec.rb
355
- - spec/oauth2/strategy/implicit_spec.rb
356
- - spec/oauth2/strategy/auth_code_spec.rb
357
- - spec/oauth2/strategy/base_spec.rb
326
+ test_files: []
327
+ ...
data/spec/helper.rb DELETED
@@ -1,37 +0,0 @@
1
- DEBUG = ENV['DEBUG'] == 'true'
2
-
3
- ruby_version = Gem::Version.new(RUBY_VERSION)
4
-
5
- if ruby_version >= Gem::Version.new('2.7')
6
- require 'simplecov'
7
- require 'coveralls'
8
-
9
- SimpleCov.formatters = [SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter]
10
-
11
- SimpleCov.start do
12
- add_filter '/spec'
13
- minimum_coverage(95)
14
- end
15
- end
16
-
17
- require 'byebug' if DEBUG && ruby_version >= Gem::Version.new('2.4')
18
-
19
- require 'oauth2'
20
- require 'addressable/uri'
21
- require 'rspec'
22
- require 'rspec/stubbed_env'
23
- require 'silent_stream'
24
-
25
- RSpec.configure do |config|
26
- config.expect_with :rspec do |c|
27
- c.syntax = :expect
28
- end
29
- end
30
-
31
- Faraday.default_adapter = :test
32
-
33
- RSpec.configure do |conf|
34
- conf.include SilentStream
35
- end
36
-
37
- VERBS = [:get, :post, :put, :delete].freeze
@@ -1,216 +0,0 @@
1
- describe OAuth2::AccessToken do
2
- subject { described_class.new(client, token) }
3
-
4
- let(:token) { 'monkey' }
5
- let(:refresh_body) { MultiJson.encode(:access_token => 'refreshed_foo', :expires_in => 600, :refresh_token => 'refresh_bar') }
6
- let(:client) do
7
- OAuth2::Client.new('abc', 'def', :site => 'https://api.example.com') do |builder|
8
- builder.request :url_encoded
9
- builder.adapter :test do |stub|
10
- VERBS.each do |verb|
11
- stub.send(verb, '/token/header') { |env| [200, {}, env[:request_headers]['Authorization']] }
12
- stub.send(verb, "/token/query?access_token=#{token}") { |env| [200, {}, Addressable::URI.parse(env[:url]).query_values['access_token']] }
13
- stub.send(verb, '/token/query_string') { |env| [200, {}, CGI.unescape(Addressable::URI.parse(env[:url]).query)] }
14
- stub.send(verb, '/token/body') { |env| [200, {}, env[:body]] }
15
- end
16
- stub.post('/oauth/token') { |env| [200, {'Content-Type' => 'application/json'}, refresh_body] }
17
- end
18
- end
19
- end
20
-
21
- describe '#initialize' do
22
- it 'assigns client and token' do
23
- expect(subject.client).to eq(client)
24
- expect(subject.token).to eq(token)
25
- end
26
-
27
- it 'assigns extra params' do
28
- target = described_class.new(client, token, 'foo' => 'bar')
29
- expect(target.params).to include('foo')
30
- expect(target.params['foo']).to eq('bar')
31
- end
32
-
33
- def assert_initialized_token(target) # rubocop:disable Metrics/AbcSize
34
- expect(target.token).to eq(token)
35
- expect(target).to be_expires
36
- expect(target.params.keys).to include('foo')
37
- expect(target.params['foo']).to eq('bar')
38
- end
39
-
40
- it 'initializes with a Hash' do
41
- hash = {:access_token => token, :expires_at => Time.now.to_i + 200, 'foo' => 'bar'}
42
- target = described_class.from_hash(client, hash)
43
- assert_initialized_token(target)
44
- end
45
-
46
- it 'from_hash does not modify opts hash' do
47
- hash = {:access_token => token, :expires_at => Time.now.to_i}
48
- hash_before = hash.dup
49
- described_class.from_hash(client, hash)
50
- expect(hash).to eq(hash_before)
51
- end
52
-
53
- it 'initializes with a form-urlencoded key/value string' do
54
- kvform = "access_token=#{token}&expires_at=#{Time.now.to_i + 200}&foo=bar"
55
- target = described_class.from_kvform(client, kvform)
56
- assert_initialized_token(target)
57
- end
58
-
59
- it 'sets options' do
60
- target = described_class.new(client, token, :param_name => 'foo', :header_format => 'Bearer %', :mode => :body)
61
- expect(target.options[:param_name]).to eq('foo')
62
- expect(target.options[:header_format]).to eq('Bearer %')
63
- expect(target.options[:mode]).to eq(:body)
64
- end
65
-
66
- it 'does not modify opts hash' do
67
- opts = {:param_name => 'foo', :header_format => 'Bearer %', :mode => :body}
68
- opts_before = opts.dup
69
- described_class.new(client, token, opts)
70
- expect(opts).to eq(opts_before)
71
- end
72
-
73
- describe 'expires_at' do
74
- let(:expires_at) { 1_361_396_829 }
75
- let(:hash) do
76
- {
77
- :access_token => token,
78
- :expires_at => expires_at.to_s,
79
- 'foo' => 'bar',
80
- }
81
- end
82
-
83
- it 'initializes with an integer timestamp expires_at' do
84
- target = described_class.from_hash(client, hash.merge(:expires_at => expires_at))
85
- assert_initialized_token(target)
86
- expect(target.expires_at).to eql(expires_at)
87
- end
88
-
89
- it 'initializes with a string timestamp expires_at' do
90
- target = described_class.from_hash(client, hash)
91
- assert_initialized_token(target)
92
- expect(target.expires_at).to eql(expires_at)
93
- end
94
-
95
- it 'initializes with a string time expires_at' do
96
- target = described_class.from_hash(client, hash.merge(:expires_at => Time.at(expires_at).iso8601))
97
- assert_initialized_token(target)
98
- expect(target.expires_at).to eql(expires_at)
99
- end
100
- end
101
- end
102
-
103
- describe '#request' do
104
- context 'with :mode => :header' do
105
- before do
106
- subject.options[:mode] = :header
107
- end
108
-
109
- VERBS.each do |verb|
110
- it "sends the token in the Authorization header for a #{verb.to_s.upcase} request" do
111
- expect(subject.post('/token/header').body).to include(token)
112
- end
113
- end
114
- end
115
-
116
- context 'with :mode => :query' do
117
- before do
118
- subject.options[:mode] = :query
119
- end
120
-
121
- VERBS.each do |verb|
122
- it "sends the token in the Authorization header for a #{verb.to_s.upcase} request" do
123
- expect(subject.post('/token/query').body).to eq(token)
124
- end
125
-
126
- it "sends a #{verb.to_s.upcase} request and options[:param_name] include [number]." do
127
- subject.options[:param_name] = 'auth[1]'
128
- expect(subject.__send__(verb, '/token/query_string').body).to include("auth[1]=#{token}")
129
- end
130
- end
131
- end
132
-
133
- context 'with :mode => :body' do
134
- before do
135
- subject.options[:mode] = :body
136
- end
137
-
138
- VERBS.each do |verb|
139
- it "sends the token in the Authorization header for a #{verb.to_s.upcase} request" do
140
- expect(subject.post('/token/body').body.split('=').last).to eq(token)
141
- end
142
- end
143
- end
144
-
145
- context 'params include [number]' do
146
- VERBS.each do |verb|
147
- it "sends #{verb.to_s.upcase} correct query" do
148
- expect(subject.__send__(verb, '/token/query_string', :params => {'foo[bar][1]' => 'val'}).body).to include('foo[bar][1]=val')
149
- end
150
- end
151
- end
152
- end
153
-
154
- describe '#expires?' do
155
- it 'is false if there is no expires_at' do
156
- expect(described_class.new(client, token)).not_to be_expires
157
- end
158
-
159
- it 'is true if there is an expires_in' do
160
- expect(described_class.new(client, token, :refresh_token => 'abaca', :expires_in => 600)).to be_expires
161
- end
162
-
163
- it 'is true if there is an expires_at' do
164
- expect(described_class.new(client, token, :refresh_token => 'abaca', :expires_in => Time.now.getutc.to_i + 600)).to be_expires
165
- end
166
- end
167
-
168
- describe '#expired?' do
169
- it 'is false if there is no expires_in or expires_at' do
170
- expect(described_class.new(client, token)).not_to be_expired
171
- end
172
-
173
- it 'is false if expires_in is in the future' do
174
- expect(described_class.new(client, token, :refresh_token => 'abaca', :expires_in => 10_800)).not_to be_expired
175
- end
176
-
177
- it 'is true if expires_at is in the past' do
178
- access = described_class.new(client, token, :refresh_token => 'abaca', :expires_in => 600)
179
- @now = Time.now + 10_800
180
- allow(Time).to receive(:now).and_return(@now)
181
- expect(access).to be_expired
182
- end
183
- end
184
-
185
- describe '#refresh!' do
186
- let(:access) do
187
- described_class.new(client, token, :refresh_token => 'abaca',
188
- :expires_in => 600,
189
- :param_name => 'o_param')
190
- end
191
-
192
- it 'returns a refresh token with appropriate values carried over' do
193
- refreshed = access.refresh!
194
- expect(access.client).to eq(refreshed.client)
195
- expect(access.options[:param_name]).to eq(refreshed.options[:param_name])
196
- end
197
-
198
- context 'with a nil refresh_token in the response' do
199
- let(:refresh_body) { MultiJson.encode(:access_token => 'refreshed_foo', :expires_in => 600, :refresh_token => nil) }
200
-
201
- it 'copies the refresh_token from the original token' do
202
- refreshed = access.refresh!
203
-
204
- expect(refreshed.refresh_token).to eq(access.refresh_token)
205
- end
206
- end
207
- end
208
-
209
- describe '#to_hash' do
210
- it 'return a hash equals to the hash used to initialize access token' do
211
- hash = {:access_token => token, :refresh_token => 'foobar', :expires_at => Time.now.to_i + 200, 'foo' => 'bar'}
212
- access_token = described_class.from_hash(client, hash.clone)
213
- expect(access_token.to_hash).to eq(hash)
214
- end
215
- end
216
- end
@@ -1,84 +0,0 @@
1
- describe OAuth2::Authenticator do
2
- subject do
3
- described_class.new(client_id, client_secret, mode)
4
- end
5
-
6
- let(:client_id) { 'foo' }
7
- let(:client_secret) { 'bar' }
8
- let(:mode) { :undefined }
9
-
10
- it 'raises NotImplementedError for unknown authentication mode' do
11
- expect { subject.apply({}) }.to raise_error(NotImplementedError)
12
- end
13
-
14
- describe '#apply' do
15
- context 'with parameter-based authentication' do
16
- let(:mode) { :request_body }
17
-
18
- it 'adds client_id and client_secret to params' do
19
- output = subject.apply({})
20
- expect(output).to eq('client_id' => 'foo', 'client_secret' => 'bar')
21
- end
22
-
23
- it 'does not overwrite existing credentials' do
24
- input = {'client_secret' => 's3cr3t'}
25
- output = subject.apply(input)
26
- expect(output).to eq('client_id' => 'foo', 'client_secret' => 's3cr3t')
27
- end
28
-
29
- it 'preserves other parameters' do
30
- input = {'state' => '42', :headers => {'A' => 'b'}}
31
- output = subject.apply(input)
32
- expect(output).to eq(
33
- 'client_id' => 'foo',
34
- 'client_secret' => 'bar',
35
- 'state' => '42',
36
- :headers => {'A' => 'b'}
37
- )
38
- end
39
-
40
- context 'using tls client authentication' do
41
- let(:mode) { :tls_client_auth }
42
-
43
- it 'does not add client_secret' do
44
- output = subject.apply({})
45
- expect(output).to eq('client_id' => 'foo')
46
- end
47
- end
48
-
49
- context 'using private key jwt authentication' do
50
- let(:mode) { :private_key_jwt }
51
-
52
- it 'does not add client_secret or client_id' do
53
- output = subject.apply({})
54
- expect(output).to eq({})
55
- end
56
- end
57
- end
58
-
59
- context 'with Basic authentication' do
60
- let(:mode) { :basic_auth }
61
- let(:header) { 'Basic ' + Base64.encode64("#{client_id}:#{client_secret}").delete("\n") }
62
-
63
- it 'encodes credentials in headers' do
64
- output = subject.apply({})
65
- expect(output).to eq(:headers => {'Authorization' => header})
66
- end
67
-
68
- it 'does not overwrite existing credentials' do
69
- input = {:headers => {'Authorization' => 'Bearer abc123'}}
70
- output = subject.apply(input)
71
- expect(output).to eq(:headers => {'Authorization' => 'Bearer abc123'})
72
- end
73
-
74
- it 'does not overwrite existing params or headers' do
75
- input = {'state' => '42', :headers => {'A' => 'b'}}
76
- output = subject.apply(input)
77
- expect(output).to eq(
78
- 'state' => '42',
79
- :headers => {'A' => 'b', 'Authorization' => header}
80
- )
81
- end
82
- end
83
- end
84
- end