auth0 5.0.1 → 5.1.0
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/.circleci/config.yml +3 -5
- data/CHANGELOG.md +13 -0
- data/README.md +80 -1
- data/lib/auth0/api/authentication_endpoints.rb +16 -6
- data/lib/auth0/api/v2.rb +8 -4
- data/lib/auth0/api/v2/branding.rb +66 -0
- data/lib/auth0/api/v2/connections.rb +3 -0
- data/lib/auth0/api/v2/jobs.rb +3 -1
- data/lib/auth0/api/v2/organizations.rb +332 -0
- data/lib/auth0/api/v2/tickets.rb +14 -2
- data/lib/auth0/api/v2/users.rb +12 -0
- data/lib/auth0/exception.rb +2 -0
- data/lib/auth0/mixins/initializer.rb +3 -1
- data/lib/auth0/mixins/validation.rb +14 -0
- data/lib/auth0/version.rb +1 -1
- data/spec/lib/auth0/api/v2/branding_spec.rb +70 -0
- data/spec/lib/auth0/api/v2/connections_spec.rb +4 -0
- data/spec/lib/auth0/api/v2/jobs_spec.rb +11 -0
- data/spec/lib/auth0/api/v2/organizations_spec.rb +588 -0
- data/spec/lib/auth0/api/v2/tickets_spec.rb +55 -0
- data/spec/lib/auth0/api/v2/users_spec.rb +19 -0
- data/spec/lib/auth0/client_spec.rb +79 -9
- data/spec/lib/auth0/mixins/validation_spec.rb +32 -0
- metadata +9 -3
@@ -59,5 +59,60 @@ describe Auth0::Api::V2::Tickets do
|
|
59
59
|
new_password: nil)
|
60
60
|
expect {@instance.post_password_change}.not_to raise_error
|
61
61
|
end
|
62
|
+
|
63
|
+
it 'expect client to accept organization_id' do
|
64
|
+
expect(@instance).to receive(:post).with('/api/v2/tickets/password-change',
|
65
|
+
result_url: nil,
|
66
|
+
user_id: nil,
|
67
|
+
connection_id: nil,
|
68
|
+
email: nil,
|
69
|
+
ttl_sec: nil,
|
70
|
+
mark_email_as_verified: nil,
|
71
|
+
includeEmailInRedirect: nil,
|
72
|
+
new_password: nil,
|
73
|
+
client_id: '123',
|
74
|
+
organization_id: '999'
|
75
|
+
)
|
76
|
+
expect {
|
77
|
+
@instance.post_password_change(
|
78
|
+
result_url: nil,
|
79
|
+
user_id: nil,
|
80
|
+
connection_id: nil,
|
81
|
+
email: nil,
|
82
|
+
ttl_sec: nil,
|
83
|
+
mark_email_as_verified: nil,
|
84
|
+
includeEmailInRedirect: nil,
|
85
|
+
new_password: nil,
|
86
|
+
client_id: '123',
|
87
|
+
organization_id: '999')
|
88
|
+
}.not_to raise_error
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'expect client to accept client_id' do
|
92
|
+
expect(@instance).to receive(:post).with('/api/v2/tickets/password-change',
|
93
|
+
result_url: nil,
|
94
|
+
user_id: nil,
|
95
|
+
connection_id: nil,
|
96
|
+
email: nil,
|
97
|
+
ttl_sec: nil,
|
98
|
+
mark_email_as_verified: nil,
|
99
|
+
includeEmailInRedirect: nil,
|
100
|
+
new_password: nil,
|
101
|
+
client_id: '123'
|
102
|
+
)
|
103
|
+
expect {
|
104
|
+
@instance.post_password_change(
|
105
|
+
result_url: nil,
|
106
|
+
user_id: nil,
|
107
|
+
connection_id: nil,
|
108
|
+
email: nil,
|
109
|
+
ttl_sec: nil,
|
110
|
+
mark_email_as_verified: nil,
|
111
|
+
includeEmailInRedirect: nil,
|
112
|
+
new_password: nil,
|
113
|
+
client_id: '123'
|
114
|
+
)
|
115
|
+
}.not_to raise_error
|
116
|
+
end
|
62
117
|
end
|
63
118
|
end
|
@@ -549,4 +549,23 @@ describe Auth0::Api::V2::Users do
|
|
549
549
|
end.not_to raise_error
|
550
550
|
end
|
551
551
|
end
|
552
|
+
|
553
|
+
context '.get_user_organizations' do
|
554
|
+
it 'is expected to respond to a get_user_organizations method' do
|
555
|
+
expect(@instance).to respond_to(:get_user_organizations)
|
556
|
+
end
|
557
|
+
|
558
|
+
it 'is expected to raise an exception when the user ID is empty' do
|
559
|
+
expect { @instance.get_user_organizations(nil) }.to raise_exception(Auth0::MissingUserId)
|
560
|
+
end
|
561
|
+
|
562
|
+
it 'is expected to get users organizations' do
|
563
|
+
expect(@instance).to receive(:get).with(
|
564
|
+
'/api/v2/users/USER_ID/organizations'
|
565
|
+
)
|
566
|
+
expect do
|
567
|
+
@instance.get_user_organizations('USER_ID')
|
568
|
+
end.not_to raise_error
|
569
|
+
end
|
570
|
+
end
|
552
571
|
end
|
@@ -29,7 +29,7 @@ describe Auth0::Client do
|
|
29
29
|
let(:client_id) { '__test_client_id__' }
|
30
30
|
let(:client_secret) { '__test_client_secret__' }
|
31
31
|
let(:access_token) { '__test_access_token__' }
|
32
|
-
let(:
|
32
|
+
let(:organization) { '__test_organization__'}
|
33
33
|
|
34
34
|
describe 'V2 client with token' do
|
35
35
|
|
@@ -84,13 +84,12 @@ describe Auth0::Client do
|
|
84
84
|
it_should_behave_like 'Authentication API client'
|
85
85
|
end
|
86
86
|
|
87
|
-
context 'with token
|
87
|
+
context 'with token and client_secret' do
|
88
88
|
let(:subject) do
|
89
89
|
Auth0::Client.new(
|
90
90
|
token: access_token,
|
91
91
|
domain: domain,
|
92
92
|
client_secret: client_secret,
|
93
|
-
audience: audience
|
94
93
|
)
|
95
94
|
end
|
96
95
|
it_should_behave_like 'v2 API client'
|
@@ -99,19 +98,53 @@ describe Auth0::Client do
|
|
99
98
|
end
|
100
99
|
|
101
100
|
describe 'V2 client without token' do
|
101
|
+
context 'should try to get an API token' do
|
102
|
+
before do
|
103
|
+
stub_api_token
|
104
|
+
end
|
102
105
|
|
103
|
-
|
104
|
-
|
106
|
+
let(:subject) do
|
107
|
+
Auth0::Client.new(
|
108
|
+
domain: domain,
|
109
|
+
client_id: client_id,
|
110
|
+
client_secret: client_secret,
|
111
|
+
)
|
112
|
+
end
|
113
|
+
it_should_behave_like 'v2 API client'
|
114
|
+
it_should_behave_like 'Authentication API client'
|
105
115
|
end
|
106
116
|
|
107
|
-
context '
|
117
|
+
context 'when try to get an API tokenwith api_identifier' do
|
118
|
+
let(:api_identifier) { 'https://samples.api_identifier/api/v2/' }
|
119
|
+
|
120
|
+
before do
|
121
|
+
stub_api_token_with_api_identifier
|
122
|
+
end
|
108
123
|
|
109
124
|
let(:subject) do
|
110
125
|
Auth0::Client.new(
|
111
126
|
domain: domain,
|
112
127
|
client_id: client_id,
|
113
128
|
client_secret: client_secret,
|
114
|
-
|
129
|
+
api_identifier: api_identifier
|
130
|
+
)
|
131
|
+
end
|
132
|
+
|
133
|
+
it_should_behave_like 'v2 API client'
|
134
|
+
it_should_behave_like 'Authentication API client'
|
135
|
+
end
|
136
|
+
|
137
|
+
context 'when try to get an API tokenwith organization' do
|
138
|
+
before do
|
139
|
+
stub_api_token_with_organization
|
140
|
+
end
|
141
|
+
|
142
|
+
let(:subject) do
|
143
|
+
Auth0::Client.new(
|
144
|
+
domain: domain,
|
145
|
+
client_id: client_id,
|
146
|
+
client_secret: client_secret,
|
147
|
+
organization: organization
|
115
148
|
)
|
116
149
|
end
|
117
150
|
it_should_behave_like 'v2 API client'
|
@@ -125,7 +158,6 @@ describe Auth0::Client do
|
|
125
158
|
Auth0::Client.new(
|
126
159
|
domain: domain,
|
127
160
|
client_id: client_id,
|
128
|
-
audience: audience
|
129
161
|
)
|
130
162
|
end.to raise_error('Must supply a valid API token')
|
131
163
|
end
|
@@ -140,7 +172,45 @@ describe Auth0::Client do
|
|
140
172
|
grant_type: 'client_credentials',
|
141
173
|
client_id: client_id,
|
142
174
|
client_secret: client_secret,
|
143
|
-
audience:
|
175
|
+
audience: "https://#{domain}/api/v2/"
|
176
|
+
}
|
177
|
+
)
|
178
|
+
)
|
179
|
+
.to_return(
|
180
|
+
headers: { 'Content-Type' => 'application/json' },
|
181
|
+
body: '{"access_token":"__test_access_token__"}',
|
182
|
+
status: 200
|
183
|
+
)
|
184
|
+
end
|
185
|
+
|
186
|
+
def stub_api_token_with_api_identifier
|
187
|
+
stub_request(:post, "https://#{domain}/oauth/token")
|
188
|
+
.with(
|
189
|
+
body: hash_including(
|
190
|
+
{
|
191
|
+
grant_type: 'client_credentials',
|
192
|
+
client_id: client_id,
|
193
|
+
client_secret: client_secret,
|
194
|
+
audience: api_identifier
|
195
|
+
}
|
196
|
+
)
|
197
|
+
)
|
198
|
+
.to_return(
|
199
|
+
headers: { 'Content-Type' => 'application/json' },
|
200
|
+
body: '{"access_token":"__test_access_token__"}',
|
201
|
+
status: 200
|
202
|
+
)
|
203
|
+
end
|
204
|
+
|
205
|
+
def stub_api_token_with_organization
|
206
|
+
stub_request(:post, "https://#{domain}/oauth/token")
|
207
|
+
.with(
|
208
|
+
body: hash_including(
|
209
|
+
{
|
210
|
+
grant_type: 'client_credentials',
|
211
|
+
client_id: client_id,
|
212
|
+
client_secret: client_secret,
|
213
|
+
organization: organization
|
144
214
|
}
|
145
215
|
)
|
146
216
|
)
|
@@ -143,6 +143,12 @@ describe Auth0::Mixins::Validation::IdTokenValidator do
|
|
143
143
|
expect { instance.validate(token) }.to raise_exception('Must supply a valid nonce')
|
144
144
|
end
|
145
145
|
|
146
|
+
it 'is expected to raise an error with an empty organization' do
|
147
|
+
instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: '' }))
|
148
|
+
|
149
|
+
expect { instance.validate(token) }.to raise_exception('Must supply a valid organization')
|
150
|
+
end
|
151
|
+
|
146
152
|
it 'is expected to raise an error with an empty issuer' do
|
147
153
|
instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ issuer: '' }))
|
148
154
|
|
@@ -277,6 +283,32 @@ describe Auth0::Mixins::Validation::IdTokenValidator do
|
|
277
283
|
|
278
284
|
expect { instance.validate(token) }.to raise_exception("Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time \"#{clock}\" is after last auth at \"#{auth_time}\"")
|
279
285
|
end
|
286
|
+
|
287
|
+
it 'is expected not to raise an error when org_id exsist in the token, but not required' do
|
288
|
+
token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE3ODgxLCJpYXQiOjE2MTY0NDUwODEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTQ4MSwib3JnX2lkIjoidGVzdE9yZyJ9.AOafUKUNgaxUXpSRYFCeJERcwrQZ4q2NZlutwGXnh9I'
|
289
|
+
expect { @instance.validate(token) }.not_to raise_exception
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'is expected to raise an error with a missing but required organization' do
|
293
|
+
token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE4MTg1LCJpYXQiOjE2MTY0NDUzODUsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTc4NX0.UMo5pmgceXO9lIKzbk7X0ZhE5DOe0IP2LfMKdUj03zQ'
|
294
|
+
instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'a1b2c3d4e5' }))
|
295
|
+
|
296
|
+
expect { instance.validate(token) }.to raise_exception('Organization Id (org_id) claim must be a string present in the ID token')
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'is expected to raise an error with an invalid organization' do
|
300
|
+
token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE3ODgxLCJpYXQiOjE2MTY0NDUwODEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTQ4MSwib3JnX2lkIjoidGVzdE9yZyJ9.AOafUKUNgaxUXpSRYFCeJERcwrQZ4q2NZlutwGXnh9I'
|
301
|
+
instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'a1b2c3d4e5' }))
|
302
|
+
|
303
|
+
expect { instance.validate(token) }.to raise_exception('Organization Id (org_id) claim value mismatch in the ID token; expected "a1b2c3d4e5", found "testOrg"')
|
304
|
+
end
|
305
|
+
|
306
|
+
it 'is expected to NOT raise an error with a valid organization' do
|
307
|
+
token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNjE2NjE3ODgxLCJpYXQiOjE2MTY0NDUwODEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTYxNjUzMTQ4MSwib3JnX2lkIjoidGVzdE9yZyJ9.AOafUKUNgaxUXpSRYFCeJERcwrQZ4q2NZlutwGXnh9I'
|
308
|
+
instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'testOrg' }))
|
309
|
+
|
310
|
+
expect { instance.validate(token) }.not_to raise_exception
|
311
|
+
end
|
280
312
|
end
|
281
313
|
end
|
282
314
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auth0
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Auth0
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2021-
|
14
|
+
date: 2021-04-09 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rest-client
|
@@ -362,6 +362,7 @@ files:
|
|
362
362
|
- lib/auth0/api/v2.rb
|
363
363
|
- lib/auth0/api/v2/anomaly.rb
|
364
364
|
- lib/auth0/api/v2/blacklists.rb
|
365
|
+
- lib/auth0/api/v2/branding.rb
|
365
366
|
- lib/auth0/api/v2/client_grants.rb
|
366
367
|
- lib/auth0/api/v2/clients.rb
|
367
368
|
- lib/auth0/api/v2/connections.rb
|
@@ -371,6 +372,7 @@ files:
|
|
371
372
|
- lib/auth0/api/v2/jobs.rb
|
372
373
|
- lib/auth0/api/v2/log_streams.rb
|
373
374
|
- lib/auth0/api/v2/logs.rb
|
375
|
+
- lib/auth0/api/v2/organizations.rb
|
374
376
|
- lib/auth0/api/v2/prompts.rb
|
375
377
|
- lib/auth0/api/v2/resource_servers.rb
|
376
378
|
- lib/auth0/api/v2/roles.rb
|
@@ -583,6 +585,7 @@ files:
|
|
583
585
|
- spec/integration/lib/auth0/auth0_client_spec.rb
|
584
586
|
- spec/lib/auth0/api/v2/anomaly_spec.rb
|
585
587
|
- spec/lib/auth0/api/v2/blacklists_spec.rb
|
588
|
+
- spec/lib/auth0/api/v2/branding_spec.rb
|
586
589
|
- spec/lib/auth0/api/v2/client_grants_spec.rb
|
587
590
|
- spec/lib/auth0/api/v2/clients_spec.rb
|
588
591
|
- spec/lib/auth0/api/v2/connections_spec.rb
|
@@ -592,6 +595,7 @@ files:
|
|
592
595
|
- spec/lib/auth0/api/v2/jobs_spec.rb
|
593
596
|
- spec/lib/auth0/api/v2/log_streams_spec.rb
|
594
597
|
- spec/lib/auth0/api/v2/logs_spec.rb
|
598
|
+
- spec/lib/auth0/api/v2/organizations_spec.rb
|
595
599
|
- spec/lib/auth0/api/v2/prompts_spec.rb
|
596
600
|
- spec/lib/auth0/api/v2/resource_servers_spec.rb
|
597
601
|
- spec/lib/auth0/api/v2/roles_spec.rb
|
@@ -632,7 +636,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
632
636
|
- !ruby/object:Gem::Version
|
633
637
|
version: '0'
|
634
638
|
requirements: []
|
635
|
-
rubygems_version: 3.
|
639
|
+
rubygems_version: 3.1.4
|
636
640
|
signing_key:
|
637
641
|
specification_version: 4
|
638
642
|
summary: Auth0 API Client
|
@@ -826,6 +830,7 @@ test_files:
|
|
826
830
|
- spec/integration/lib/auth0/auth0_client_spec.rb
|
827
831
|
- spec/lib/auth0/api/v2/anomaly_spec.rb
|
828
832
|
- spec/lib/auth0/api/v2/blacklists_spec.rb
|
833
|
+
- spec/lib/auth0/api/v2/branding_spec.rb
|
829
834
|
- spec/lib/auth0/api/v2/client_grants_spec.rb
|
830
835
|
- spec/lib/auth0/api/v2/clients_spec.rb
|
831
836
|
- spec/lib/auth0/api/v2/connections_spec.rb
|
@@ -835,6 +840,7 @@ test_files:
|
|
835
840
|
- spec/lib/auth0/api/v2/jobs_spec.rb
|
836
841
|
- spec/lib/auth0/api/v2/log_streams_spec.rb
|
837
842
|
- spec/lib/auth0/api/v2/logs_spec.rb
|
843
|
+
- spec/lib/auth0/api/v2/organizations_spec.rb
|
838
844
|
- spec/lib/auth0/api/v2/prompts_spec.rb
|
839
845
|
- spec/lib/auth0/api/v2/resource_servers_spec.rb
|
840
846
|
- spec/lib/auth0/api/v2/roles_spec.rb
|