rack-oauth2 1.20.0 → 1.21.2
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 +4 -4
- data/VERSION +1 -1
- data/lib/rack/oauth2/client.rb +74 -23
- data/spec/rack/oauth2/client_spec.rb +81 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bedb933d3946aef05d7ca583bd18b46941aebdf7fc0f8640be2f5909f9be4e9c
|
4
|
+
data.tar.gz: 8740a613173e5edd0c98d79d1079b933d3eaee89b56369ae109d10841d7b94d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 465ffccc2e5e41e396949947904f359a6d67d5637e6b0056a8bbca10f3b6755b14682fcad8092dddba7eabca72b66e1f66691b20a3351c79a7b1269abb478c07
|
7
|
+
data.tar.gz: c0b6d79ad4c019fa58034d446acaf7ee2d6ec5b9cf77e5b8548f924cbbc544e34d6c09d6a2433e9ed5dbca7915b27280602ce8a62dda12722a9b28a3c6c07bb8
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.21.2
|
data/lib/rack/oauth2/client.rb
CHANGED
@@ -69,7 +69,65 @@ module Rack
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def access_token!(*args)
|
72
|
-
headers, params =
|
72
|
+
headers, params, http_client, options = authenticated_context_from(*args)
|
73
|
+
params[:scope] = Array(options.delete(:scope)).join(' ') if options[:scope].present?
|
74
|
+
params.merge! @grant.as_json
|
75
|
+
params.merge! options
|
76
|
+
handle_response do
|
77
|
+
http_client.post(
|
78
|
+
absolute_uri_for(token_endpoint),
|
79
|
+
Util.compact_hash(params),
|
80
|
+
headers
|
81
|
+
)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def revoke!(*args)
|
86
|
+
headers, params, http_client, options = authenticated_context_from(*args)
|
87
|
+
|
88
|
+
params.merge! case
|
89
|
+
when access_token = options.delete(:access_token)
|
90
|
+
{
|
91
|
+
token: access_token,
|
92
|
+
token_type_hint: :access_token
|
93
|
+
}
|
94
|
+
when refresh_token = options.delete(:refresh_token)
|
95
|
+
{
|
96
|
+
token: refresh_token,
|
97
|
+
token_type_hint: :refresh_token
|
98
|
+
}
|
99
|
+
when @grant.is_a?(Grant::RefreshToken)
|
100
|
+
{
|
101
|
+
token: @grant.refresh_token,
|
102
|
+
token_type_hint: :refresh_token
|
103
|
+
}
|
104
|
+
when options[:token].blank?
|
105
|
+
raise ArgumentError, 'One of "token", "access_token" and "refresh_token" is required'
|
106
|
+
end
|
107
|
+
params.merge! options
|
108
|
+
|
109
|
+
handle_revocation_response do
|
110
|
+
http_client.post(
|
111
|
+
absolute_uri_for(revocation_endpoint),
|
112
|
+
Util.compact_hash(params),
|
113
|
+
headers
|
114
|
+
)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
def absolute_uri_for(endpoint)
|
121
|
+
_endpoint_ = Util.parse_uri endpoint
|
122
|
+
_endpoint_.scheme ||= self.scheme || 'https'
|
123
|
+
_endpoint_.host ||= self.host
|
124
|
+
_endpoint_.port ||= self.port
|
125
|
+
raise 'No Host Info' unless _endpoint_.host
|
126
|
+
_endpoint_.to_s
|
127
|
+
end
|
128
|
+
|
129
|
+
def authenticated_context_from(*args)
|
130
|
+
headers, params = {}, {}
|
73
131
|
http_client = Rack::OAuth2.http_client
|
74
132
|
|
75
133
|
# NOTE:
|
@@ -78,9 +136,6 @@ module Rack
|
|
78
136
|
options = args.extract_options!
|
79
137
|
client_auth_method = args.first || options.delete(:client_auth_method).try(:to_sym) || :basic
|
80
138
|
|
81
|
-
params[:scope] = Array(options.delete(:scope)).join(' ') if options[:scope].present?
|
82
|
-
params.merge! options
|
83
|
-
|
84
139
|
case client_auth_method
|
85
140
|
when :basic
|
86
141
|
cred = Base64.strict_encode64 [
|
@@ -100,9 +155,11 @@ module Rack
|
|
100
155
|
client_assertion_type: URN::ClientAssertionType::JWT_BEARER
|
101
156
|
)
|
102
157
|
# NOTE: optionally auto-generate client_assertion.
|
103
|
-
if
|
158
|
+
params[:client_assertion] = if options[:client_assertion].present?
|
159
|
+
options.delete(:client_assertion)
|
160
|
+
else
|
104
161
|
require 'json/jwt'
|
105
|
-
|
162
|
+
JSON::JWT.new(
|
106
163
|
iss: identifier,
|
107
164
|
sub: identifier,
|
108
165
|
aud: absolute_uri_for(token_endpoint),
|
@@ -127,24 +184,8 @@ module Rack
|
|
127
184
|
client_secret: secret
|
128
185
|
)
|
129
186
|
end
|
130
|
-
handle_response do
|
131
|
-
http_client.post(
|
132
|
-
absolute_uri_for(token_endpoint),
|
133
|
-
Util.compact_hash(params),
|
134
|
-
headers
|
135
|
-
)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
private
|
140
187
|
|
141
|
-
|
142
|
-
_endpoint_ = Util.parse_uri endpoint
|
143
|
-
_endpoint_.scheme ||= self.scheme || 'https'
|
144
|
-
_endpoint_.host ||= self.host
|
145
|
-
_endpoint_.port ||= self.port
|
146
|
-
raise 'No Host Info' unless _endpoint_.host
|
147
|
-
_endpoint_.to_s
|
188
|
+
[headers, params, http_client, options]
|
148
189
|
end
|
149
190
|
|
150
191
|
def handle_response
|
@@ -157,6 +198,16 @@ module Rack
|
|
157
198
|
end
|
158
199
|
end
|
159
200
|
|
201
|
+
def handle_revocation_response
|
202
|
+
response = yield
|
203
|
+
case response.status
|
204
|
+
when 200..201
|
205
|
+
:success
|
206
|
+
else
|
207
|
+
handle_error_response response
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
160
211
|
def handle_success_response(response)
|
161
212
|
token_hash = JSON.parse(response.body).with_indifferent_access
|
162
213
|
case (@forced_token_type || token_hash[:token_type]).try(:downcase)
|
@@ -448,12 +448,86 @@ describe Rack::OAuth2::Client do
|
|
448
448
|
end
|
449
449
|
end
|
450
450
|
|
451
|
+
describe '#revoke!' do
|
452
|
+
context 'when access_token given' do
|
453
|
+
before do
|
454
|
+
mock_response(
|
455
|
+
:post,
|
456
|
+
'https://server.example.com/oauth2/revoke',
|
457
|
+
'blank',
|
458
|
+
status: 200,
|
459
|
+
body: {
|
460
|
+
token: 'access_token',
|
461
|
+
token_type_hint: 'access_token'
|
462
|
+
}
|
463
|
+
)
|
464
|
+
end
|
465
|
+
it do
|
466
|
+
client.revoke!(access_token: 'access_token').should == :success
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
context 'when refresh_token given' do
|
471
|
+
before do
|
472
|
+
mock_response(
|
473
|
+
:post,
|
474
|
+
'https://server.example.com/oauth2/revoke',
|
475
|
+
'blank',
|
476
|
+
status: 200,
|
477
|
+
body: {
|
478
|
+
token: 'refresh_token',
|
479
|
+
token_type_hint: 'refresh_token'
|
480
|
+
}
|
481
|
+
)
|
482
|
+
end
|
483
|
+
|
484
|
+
context 'as argument' do
|
485
|
+
it do
|
486
|
+
client.revoke!(refresh_token: 'refresh_token').should == :success
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
context 'as grant' do
|
491
|
+
it do
|
492
|
+
client.refresh_token = 'refresh_token'
|
493
|
+
client.revoke!
|
494
|
+
end
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
context 'when error response given' do
|
499
|
+
before do
|
500
|
+
mock_response(
|
501
|
+
:post,
|
502
|
+
'https://server.example.com/oauth2/revoke',
|
503
|
+
'errors/invalid_request.json',
|
504
|
+
status: 400
|
505
|
+
)
|
506
|
+
end
|
507
|
+
|
508
|
+
it do
|
509
|
+
expect do
|
510
|
+
client.revoke! access_token: 'access_token'
|
511
|
+
end.to raise_error Rack::OAuth2::Client::Error
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
515
|
+
context 'when no token given' do
|
516
|
+
it do
|
517
|
+
expect do
|
518
|
+
client.revoke!
|
519
|
+
end.to raise_error ArgumentError
|
520
|
+
end
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
451
524
|
context 'when no host info' do
|
452
525
|
let :client do
|
453
526
|
Rack::OAuth2::Client.new(
|
454
527
|
identifier: 'client_id',
|
455
528
|
secret: 'client_secret',
|
456
|
-
redirect_uri: 'https://client.example.com/callback'
|
529
|
+
redirect_uri: 'https://client.example.com/callback',
|
530
|
+
revocation_endpoint: '/oauth2/revoke'
|
457
531
|
)
|
458
532
|
end
|
459
533
|
|
@@ -468,5 +542,11 @@ describe Rack::OAuth2::Client do
|
|
468
542
|
expect { client.access_token! }.to raise_error 'No Host Info'
|
469
543
|
end
|
470
544
|
end
|
545
|
+
|
546
|
+
describe '#revoke!' do
|
547
|
+
it do
|
548
|
+
expect { client.revoke! access_token: 'access_token' }.to raise_error 'No Host Info'
|
549
|
+
end
|
550
|
+
end
|
471
551
|
end
|
472
552
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-oauth2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.21.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nov matake
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-07-
|
11
|
+
date: 2022-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|