omniauth-auth0 2.0.0 → 3.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 +5 -5
- data/.circleci/config.yml +63 -0
- data/.devcontainer/devcontainer.json +18 -0
- data/.github/CODEOWNERS +1 -0
- data/.github/ISSUE_TEMPLATE/config.yml +8 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +39 -0
- data/.github/ISSUE_TEMPLATE/report_a_bug.md +55 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +32 -0
- data/.github/stale.yml +20 -0
- data/.github/workflows/semgrep.yml +24 -0
- data/.gitignore +5 -2
- data/.semgrepignore +4 -0
- data/.shiprc +7 -0
- data/.snyk +9 -0
- data/CHANGELOG.md +212 -4
- data/CONTRIBUTING.md +71 -0
- data/EXAMPLES.md +167 -0
- data/Gemfile +17 -17
- data/Gemfile.lock +180 -0
- data/README.md +117 -92
- data/Rakefile +2 -2
- data/codecov.yml +22 -0
- data/lib/omniauth/auth0/errors.rb +11 -0
- data/lib/omniauth/auth0/jwt_validator.rb +278 -0
- data/lib/omniauth/auth0/telemetry.rb +36 -0
- data/lib/omniauth/strategies/auth0.rb +89 -21
- data/lib/omniauth-auth0/version.rb +1 -1
- data/lib/omniauth-auth0.rb +1 -1
- data/omniauth-auth0.gemspec +6 -7
- data/opslevel.yml +6 -0
- data/spec/omniauth/auth0/jwt_validator_spec.rb +729 -0
- data/spec/omniauth/auth0/telemetry_spec.rb +28 -0
- data/spec/omniauth/strategies/auth0_spec.rb +160 -18
- data/spec/resources/jwks.json +28 -0
- data/spec/spec_helper.rb +12 -7
- metadata +54 -16
- data/.travis.yml +0 -6
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe OmniAuth::Auth0::Telemetry do
|
5
|
+
|
6
|
+
let(:test_class) { Class.new.extend(OmniAuth::Auth0::Telemetry) }
|
7
|
+
|
8
|
+
describe 'telemetry' do
|
9
|
+
|
10
|
+
it 'should have the correct SDK name' do
|
11
|
+
expect(test_class.telemetry).to have_key(:name)
|
12
|
+
expect(test_class.telemetry[:name]).to eq('omniauth-auth0')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have the correct SDK version' do
|
16
|
+
expect(test_class.telemetry).to have_key(:version)
|
17
|
+
expect(test_class.telemetry[:version]).to eq(OmniAuth::Auth0::VERSION)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should include the Ruby version' do
|
21
|
+
expect(test_class.telemetry).to have_key(:env)
|
22
|
+
expect(test_class.telemetry[:env]).to have_key(:ruby)
|
23
|
+
expect(test_class.telemetry[:env][:ruby]).to eq(RUBY_VERSION)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -1,4 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
4
|
+
require 'jwt'
|
5
|
+
require 'multi_json'
|
6
|
+
|
7
|
+
OmniAuth.config.allowed_request_methods = [:get, :post]
|
2
8
|
|
3
9
|
RSpec.shared_examples 'site has valid domain url' do |url|
|
4
10
|
it { expect(subject.site).to eq(url) }
|
@@ -23,7 +29,12 @@ describe OmniAuth::Strategies::Auth0 do
|
|
23
29
|
end
|
24
30
|
|
25
31
|
describe 'client_options' do
|
26
|
-
let(:subject) {
|
32
|
+
let(:subject) { OmniAuth::Strategies::Auth0.new(
|
33
|
+
application,
|
34
|
+
client_id,
|
35
|
+
client_secret,
|
36
|
+
domain_url
|
37
|
+
).client }
|
27
38
|
|
28
39
|
context 'domain with https' do
|
29
40
|
let(:domain_url) { 'https://samples.auth0.com' }
|
@@ -78,6 +89,127 @@ describe OmniAuth::Strategies::Auth0 do
|
|
78
89
|
expect(redirect_url).to have_query('state')
|
79
90
|
expect(redirect_url).to have_query('client_id')
|
80
91
|
expect(redirect_url).to have_query('redirect_uri')
|
92
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
93
|
+
expect(redirect_url).not_to have_query('connection')
|
94
|
+
expect(redirect_url).not_to have_query('connection_scope')
|
95
|
+
expect(redirect_url).not_to have_query('prompt')
|
96
|
+
expect(redirect_url).not_to have_query('screen_hint')
|
97
|
+
expect(redirect_url).not_to have_query('login_hint')
|
98
|
+
expect(redirect_url).not_to have_query('organization')
|
99
|
+
expect(redirect_url).not_to have_query('invitation')
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'redirects to hosted login page' do
|
103
|
+
get 'auth/auth0?connection=abcd'
|
104
|
+
expect(last_response.status).to eq(302)
|
105
|
+
redirect_url = last_response.headers['Location']
|
106
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
107
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
108
|
+
expect(redirect_url).to have_query('state')
|
109
|
+
expect(redirect_url).to have_query('client_id')
|
110
|
+
expect(redirect_url).to have_query('redirect_uri')
|
111
|
+
expect(redirect_url).to have_query('connection', 'abcd')
|
112
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
113
|
+
expect(redirect_url).not_to have_query('connection_scope')
|
114
|
+
expect(redirect_url).not_to have_query('prompt')
|
115
|
+
expect(redirect_url).not_to have_query('screen_hint')
|
116
|
+
expect(redirect_url).not_to have_query('login_hint')
|
117
|
+
expect(redirect_url).not_to have_query('organization')
|
118
|
+
expect(redirect_url).not_to have_query('invitation')
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'redirects to the hosted login page with connection_scope' do
|
122
|
+
get 'auth/auth0?connection_scope=identity_provider_scope'
|
123
|
+
expect(last_response.status).to eq(302)
|
124
|
+
redirect_url = last_response.headers['Location']
|
125
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
126
|
+
expect(redirect_url)
|
127
|
+
.to have_query('connection_scope', 'identity_provider_scope')
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'redirects to hosted login page with prompt=login' do
|
131
|
+
get 'auth/auth0?prompt=login'
|
132
|
+
expect(last_response.status).to eq(302)
|
133
|
+
redirect_url = last_response.headers['Location']
|
134
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
135
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
136
|
+
expect(redirect_url).to have_query('state')
|
137
|
+
expect(redirect_url).to have_query('client_id')
|
138
|
+
expect(redirect_url).to have_query('redirect_uri')
|
139
|
+
expect(redirect_url).to have_query('prompt', 'login')
|
140
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
141
|
+
expect(redirect_url).not_to have_query('connection')
|
142
|
+
expect(redirect_url).not_to have_query('login_hint')
|
143
|
+
expect(redirect_url).not_to have_query('organization')
|
144
|
+
expect(redirect_url).not_to have_query('invitation')
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'redirects to hosted login page with screen_hint=signup' do
|
148
|
+
get 'auth/auth0?screen_hint=signup'
|
149
|
+
expect(last_response.status).to eq(302)
|
150
|
+
redirect_url = last_response.headers['Location']
|
151
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
152
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
153
|
+
expect(redirect_url).to have_query('state')
|
154
|
+
expect(redirect_url).to have_query('client_id')
|
155
|
+
expect(redirect_url).to have_query('redirect_uri')
|
156
|
+
expect(redirect_url).to have_query('screen_hint', 'signup')
|
157
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
158
|
+
expect(redirect_url).not_to have_query('connection')
|
159
|
+
expect(redirect_url).not_to have_query('login_hint')
|
160
|
+
expect(redirect_url).not_to have_query('organization')
|
161
|
+
expect(redirect_url).not_to have_query('invitation')
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'redirects to hosted login page with organization=TestOrg and invitation=TestInvite' do
|
165
|
+
get 'auth/auth0?organization=TestOrg&invitation=TestInvite'
|
166
|
+
expect(last_response.status).to eq(302)
|
167
|
+
redirect_url = last_response.headers['Location']
|
168
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
169
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
170
|
+
expect(redirect_url).to have_query('state')
|
171
|
+
expect(redirect_url).to have_query('client_id')
|
172
|
+
expect(redirect_url).to have_query('redirect_uri')
|
173
|
+
expect(redirect_url).to have_query('organization', 'TestOrg')
|
174
|
+
expect(redirect_url).to have_query('invitation', 'TestInvite')
|
175
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
176
|
+
expect(redirect_url).not_to have_query('connection')
|
177
|
+
expect(redirect_url).not_to have_query('connection_scope')
|
178
|
+
expect(redirect_url).not_to have_query('prompt')
|
179
|
+
expect(redirect_url).not_to have_query('screen_hint')
|
180
|
+
expect(redirect_url).not_to have_query('login_hint')
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'redirects to hosted login page with login_hint=example@mail.com' do
|
184
|
+
get 'auth/auth0?login_hint=example@mail.com'
|
185
|
+
expect(last_response.status).to eq(302)
|
186
|
+
redirect_url = last_response.headers['Location']
|
187
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
188
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
189
|
+
expect(redirect_url).to have_query('state')
|
190
|
+
expect(redirect_url).to have_query('client_id')
|
191
|
+
expect(redirect_url).to have_query('redirect_uri')
|
192
|
+
expect(redirect_url).to have_query('login_hint', 'example@mail.com')
|
193
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
194
|
+
expect(redirect_url).not_to have_query('connection')
|
195
|
+
expect(redirect_url).not_to have_query('connection_scope')
|
196
|
+
expect(redirect_url).not_to have_query('prompt')
|
197
|
+
expect(redirect_url).not_to have_query('screen_hint')
|
198
|
+
expect(redirect_url).not_to have_query('organization')
|
199
|
+
expect(redirect_url).not_to have_query('invitation')
|
200
|
+
end
|
201
|
+
|
202
|
+
def session
|
203
|
+
session_cookie = last_response.cookies['rack.session'].first
|
204
|
+
session_data, _, _ = session_cookie.rpartition('--')
|
205
|
+
decoded_session_data = Base64.decode64(session_data)
|
206
|
+
Marshal.load(decoded_session_data)
|
207
|
+
end
|
208
|
+
|
209
|
+
it "stores session['authorize_params'] as a plain Ruby Hash" do
|
210
|
+
get '/auth/auth0'
|
211
|
+
|
212
|
+
expect(session['authorize_params'].class).to eq(::Hash)
|
81
213
|
end
|
82
214
|
|
83
215
|
describe 'callback' do
|
@@ -85,7 +217,7 @@ describe OmniAuth::Strategies::Auth0 do
|
|
85
217
|
let(:expires_in) { 2000 }
|
86
218
|
let(:token_type) { 'bearer' }
|
87
219
|
let(:refresh_token) { 'refresh token' }
|
88
|
-
let(:
|
220
|
+
let(:telemetry_value) { Class.new.extend(OmniAuth::Auth0::Telemetry).telemetry_encoded }
|
89
221
|
|
90
222
|
let(:user_id) { 'user identifier' }
|
91
223
|
let(:state) { SecureRandom.hex(8) }
|
@@ -95,6 +227,20 @@ describe OmniAuth::Strategies::Auth0 do
|
|
95
227
|
let(:email) { 'mail@mail.com' }
|
96
228
|
let(:email_verified) { true }
|
97
229
|
|
230
|
+
let(:id_token) do
|
231
|
+
payload = {}
|
232
|
+
payload['sub'] = user_id
|
233
|
+
payload['iss'] = "#{domain_url}/"
|
234
|
+
payload['aud'] = client_id
|
235
|
+
payload['name'] = name
|
236
|
+
payload['nickname'] = nickname
|
237
|
+
payload['picture'] = picture
|
238
|
+
payload['email'] = email
|
239
|
+
payload['email_verified'] = email_verified
|
240
|
+
|
241
|
+
JWT.encode payload, client_secret, 'HS256'
|
242
|
+
end
|
243
|
+
|
98
244
|
let(:oauth_response) do
|
99
245
|
{
|
100
246
|
access_token: access_token,
|
@@ -112,20 +258,11 @@ describe OmniAuth::Strategies::Auth0 do
|
|
112
258
|
}
|
113
259
|
end
|
114
260
|
|
115
|
-
let(:basic_user_info) { { sub
|
116
|
-
let(:oidc_user_info) do
|
117
|
-
{
|
118
|
-
sub: user_id,
|
119
|
-
name: name,
|
120
|
-
nickname: nickname,
|
121
|
-
email: email,
|
122
|
-
picture: picture,
|
123
|
-
email_verified: email_verified
|
124
|
-
}
|
125
|
-
end
|
261
|
+
let(:basic_user_info) { { "sub" => user_id, "name" => name } }
|
126
262
|
|
127
263
|
def stub_auth(body)
|
128
264
|
stub_request(:post, 'https://samples.auth0.com/oauth/token')
|
265
|
+
.with(headers: { 'Auth0-Client' => telemetry_value })
|
129
266
|
.to_return(
|
130
267
|
headers: { 'Content-Type' => 'application/json' },
|
131
268
|
body: MultiJson.encode(body)
|
@@ -149,7 +286,9 @@ describe OmniAuth::Strategies::Auth0 do
|
|
149
286
|
WebMock.reset!
|
150
287
|
end
|
151
288
|
|
152
|
-
let(:subject)
|
289
|
+
let(:subject) do
|
290
|
+
MultiJson.decode(last_response.body)
|
291
|
+
end
|
153
292
|
|
154
293
|
context 'basic oauth' do
|
155
294
|
before do
|
@@ -168,10 +307,14 @@ describe OmniAuth::Strategies::Auth0 do
|
|
168
307
|
expect(subject['credentials']['expires_at']).to_not be_nil
|
169
308
|
end
|
170
309
|
|
171
|
-
it 'has basic values'
|
310
|
+
it 'has basic values' do
|
172
311
|
expect(subject['provider']).to eq('auth0')
|
173
312
|
expect(subject['uid']).to eq(user_id)
|
174
|
-
expect(subject['info']['name']).to eq(
|
313
|
+
expect(subject['info']['name']).to eq(name)
|
314
|
+
end
|
315
|
+
|
316
|
+
it 'should use the user info endpoint' do
|
317
|
+
expect(subject['extra']['raw_info']).to eq(basic_user_info)
|
175
318
|
end
|
176
319
|
end
|
177
320
|
|
@@ -197,7 +340,6 @@ describe OmniAuth::Strategies::Auth0 do
|
|
197
340
|
context 'oidc' do
|
198
341
|
before do
|
199
342
|
stub_auth(oidc_response)
|
200
|
-
stub_userinfo(oidc_user_info)
|
201
343
|
trigger_callback
|
202
344
|
end
|
203
345
|
|
@@ -273,7 +415,7 @@ RSpec::Matchers.define :have_query do |key, value|
|
|
273
415
|
uri = redirect_uri(actual)
|
274
416
|
query = query(uri)
|
275
417
|
if value.nil?
|
276
|
-
query
|
418
|
+
query.key?(key)
|
277
419
|
else
|
278
420
|
query[key] == [value]
|
279
421
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
{
|
2
|
+
"keys": [
|
3
|
+
{
|
4
|
+
"alg": "RS256",
|
5
|
+
"kty": "RSA",
|
6
|
+
"use": "sig",
|
7
|
+
"x5c": [
|
8
|
+
"MIIDCzCCAfOgAwIBAgIJAJP6qydiMpsuMA0GCSqGSIb3DQEBBQUAMBwxGjAYBgNVBAMMEXNhbXBsZXMuYXV0aDAuY29tMB4XDTE0MDUyNjIyMDA1MFoXDTI4MDIwMjIyMDA1MFowHDEaMBgGA1UEAwwRc2FtcGxlcy5hdXRoMC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCkH4CFGSJ4s3mwCBzaGGwxa9Jxzfb1ia4nUumxbsuaB7PClZZgrNQiOR3MXVNV9W6F1D+wjT6oFHOo7TOkVI22I/ff3XZTE0F35UUHGWRtiQ4LdZxwOPTed2Lax3F2DEyl3Y0CguUKbq2sSghvHYcggM6aj3N53VBsnBh/kdrURDLx1RYqBIL6Fvkhb/V/v/u9UKhZM0CDQRef9FZ7R8q9ie9cnbDOj1dT9d64kiJIYtTraG0gOrs4LI+4KK0EZu5R7Uo053IK7kfNasWhDkl8yxNYkDxwfcIuAcDmLgLnAI4tfW5beJuw+/w75PO/EwzwsnvppXaAz7e3Wf8g1yWFAgMBAAGjUDBOMB0GA1UdDgQWBBTsmytFLNox+NUZdTNlCUL3hHrngTAfBgNVHSMEGDAWgBTsmytFLNox+NUZdTNlCUL3hHrngTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAodbRX/34LnWB70l8dpDF1neDoG29F0XdpE9ICWHeWB1gb/FvJ5UMy9/pnL0DI3mPwkTDDob+16Zc68o6dT6sH3vEUP1iRreJlFADEmJZjrH9P4Y7ttx3G2Uw2RU5uucXIqiyMDBrQo4vx4Lnghl+b/WYbZJgzLfZLgkOEjcznS0Yi5Wdz6MvaL3FehSfweHyrjmxz0e8elHq7VY8OqRA+4PmUBce9BgDCk9fZFjgj8l0m9Vc5pPKSY9LMmTyrYkeDr/KppqdXKOCHmv7AIGb6rMCtbkIL/CM7Bh9Hx78/UKAz87Sl9A1yXVNjKbZwOEW60ORIwJmd8Tv46gJF+/rV"
|
9
|
+
],
|
10
|
+
"n": "pB-AhRkieLN5sAgc2hhsMWvScc329YmuJ1LpsW7LmgezwpWWYKzUIjkdzF1TVfVuhdQ_sI0-qBRzqO0zpFSNtiP33912UxNBd-VFBxlkbYkOC3WccDj03ndi2sdxdgxMpd2NAoLlCm6trEoIbx2HIIDOmo9zed1QbJwYf5Ha1EQy8dUWKgSC-hb5IW_1f7_7vVCoWTNAg0EXn_RWe0fKvYnvXJ2wzo9XU_XeuJIiSGLU62htIDq7OCyPuCitBGbuUe1KNOdyCu5HzWrFoQ5JfMsTWJA8cH3CLgHA5i4C5wCOLX1uW3ibsPv8O-TzvxMM8LJ76aV2gM-3t1n_INclhQ",
|
11
|
+
"e": "AQAB",
|
12
|
+
"kid": "NkJCQzIyQzRBMEU4NjhGNUU4MzU4RkY0M0ZDQzkwOUQ0Q0VGNUMwQg",
|
13
|
+
"x5t": "NkJCQzIyQzRBMEU4NjhGNUU4MzU4RkY0M0ZDQzkwOUQ0Q0VGNUMwQg"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"alg": "RS256",
|
17
|
+
"kty": "RSA",
|
18
|
+
"use": "sig",
|
19
|
+
"x5c": [
|
20
|
+
"MIIC8DCCAdigAwIBAgIJ4pL5sRgcIYGZMA0GCSqGSIb3DQEBBQUAMB8xHTAbBgNVBAMTFGxiYWxtYWNlZGEuYXV0aDAuY29tMB4XDTE1MTIxMjE5MDczM1oXDTI5MDgyMDE5MDczM1owHzEdMBsGA1UEAxMUbGJhbG1hY2VkYS5hdXRoMC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPoo5DA/X8suAZujdmD2D88Ggtu8G/kuLUdEuj1W3+wzmFcEqQpE532rg8L0uppWKAbmLWzkuwyioNDhWwCtXnug3BFQf5Lrc6nTxjk4ZQt/HdsYWCGSSZueMUG/3I+2PSql3atD2nedjY6Z9hWU8kzOjF9wzkLMgPf/OYpuz9A+6d+/K8jApRPfsQ1LDVWDG8YRtj+IyHhSvXS+cK03iuD7yVLKkIZuoS8ymMJpnZONHGds/3P9pHY29KqliSYW0eGEX3BIarZG06gRJ+88WUbRi9+rfVAoGLq++S+bc021txK+qYS3nknhY0uv/ODBb4eeycuDjjdyLBCShVvbXFAgMBAAGjLzAtMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFG38TTjyzhRmpK7MXfvBXDcBtYJ3MA0GCSqGSIb3DQEBBQUAA4IBAQCLNW+rA25tjHs6Sa9VPgBfMMLd1PIEgMpQhET9JqpGYUgB+0q1leXw1cwh14x/6PF2oo3jPOMW+wCDA7KAVKYewYSr/Enph+zNFPaq2YQL9dCsVFcBsnEGznwZaqHrqxQDX9S2Ek6E9jNsuBCSpAPcTsfbn2TXz77V+HZ/4tbwRvYEX1S5agiZFyjZzJMiZU1KQzP5PhfzD6RPl5KTK2PYRhVdXwyuFxOdJzCzOC9E/Uw30Zd6+9oHmoNfvJr8BRy67YWjXaQAh2m8e+zv/dEzPimgvaLmI1yz4W+93dJy3NdMuCvObOqA534tviv5PkV57ewXAnWPbxyBHr57HdQ1"
|
21
|
+
],
|
22
|
+
"n": "z6KOQwP1_LLgGbo3Zg9g_PBoLbvBv5Li1HRLo9Vt_sM5hXBKkKROd9q4PC9LqaVigG5i1s5LsMoqDQ4VsArV57oNwRUH-S63Op08Y5OGULfx3bGFghkkmbnjFBv9yPtj0qpd2rQ9p3nY2OmfYVlPJMzoxfcM5CzID3_zmKbs_QPunfvyvIwKUT37ENSw1VgxvGEbY_iMh4Ur10vnCtN4rg-8lSypCGbqEvMpjCaZ2TjRxnbP9z_aR2NvSqpYkmFtHhhF9wSGq2RtOoESfvPFlG0Yvfq31QKBi6vvkvm3NNtbcSvqmEt55J4WNLr_zgwW-HnsnLg443ciwQkoVb21xQ",
|
23
|
+
"e": "AQAB",
|
24
|
+
"kid": "RUVBOTVEMEZBMTA5NDAzNEQzNTZGNzMyMTI4MzU1RkNFQzhCQTM0Mg",
|
25
|
+
"x5t": "RUVBOTVEMEZBMTA5NDAzNEQzNTZGNzMyMTI4MzU1RkNFQzhCQTM0Mg"
|
26
|
+
}
|
27
|
+
]
|
28
|
+
}
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path(
|
2
|
-
$LOAD_PATH.unshift File.expand_path('
|
1
|
+
$LOAD_PATH.unshift File.expand_path(__dir__)
|
2
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __dir__)
|
3
3
|
|
4
|
+
require 'multi_json'
|
4
5
|
require 'simplecov'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
SimpleCov.start
|
7
|
+
|
8
|
+
if ENV['CI'] == 'true'
|
9
|
+
require 'simplecov-cobertura'
|
10
|
+
SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
|
9
11
|
end
|
12
|
+
|
10
13
|
require 'rspec'
|
11
14
|
require 'rack/test'
|
12
15
|
require 'webmock/rspec'
|
@@ -20,6 +23,8 @@ RSpec.configure do |config|
|
|
20
23
|
config.include WebMock::API
|
21
24
|
config.include Rack::Test::Methods
|
22
25
|
config.extend OmniAuth::Test::StrategyMacros, type: :strategy
|
26
|
+
config.filter_run focus: true
|
27
|
+
config.run_all_when_everything_filtered = true
|
23
28
|
|
24
29
|
def app
|
25
30
|
@app || make_application
|
@@ -37,7 +42,7 @@ RSpec.configure do |config|
|
|
37
42
|
configure do
|
38
43
|
enable :sessions
|
39
44
|
set :show_exceptions, false
|
40
|
-
set :session_secret, '
|
45
|
+
set :session_secret, '9771aff2c634257053c62ba072c54754bd2cc92739b37e81c3eda505da48c2ec'
|
41
46
|
end
|
42
47
|
|
43
48
|
use OmniAuth::Builder do
|
metadata
CHANGED
@@ -1,79 +1,115 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-auth0
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Auth0
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: omniauth
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: omniauth-oauth2
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
33
|
+
version: '1'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
40
|
+
version: '1'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- - "
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
47
|
+
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- - "
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
54
|
+
version: '0'
|
41
55
|
description: |
|
42
56
|
Auth0 is an authentication broker that supports social identity providers as well as enterprise identity providers such as Active Directory, LDAP, Google Apps, Salesforce.
|
43
57
|
|
44
58
|
OmniAuth is a library that standardizes multi-provider authentication for web applications. It was created to be powerful, flexible, and do as little as possible.
|
45
59
|
|
46
|
-
omniauth-auth0 is the
|
60
|
+
omniauth-auth0 is the OmniAuth strategy for Auth0.
|
47
61
|
email:
|
48
62
|
- info@auth0.com
|
49
63
|
executables: []
|
50
64
|
extensions: []
|
51
65
|
extra_rdoc_files: []
|
52
66
|
files:
|
67
|
+
- ".circleci/config.yml"
|
68
|
+
- ".devcontainer/devcontainer.json"
|
53
69
|
- ".gemrelease"
|
70
|
+
- ".github/CODEOWNERS"
|
71
|
+
- ".github/ISSUE_TEMPLATE/config.yml"
|
72
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
73
|
+
- ".github/ISSUE_TEMPLATE/report_a_bug.md"
|
74
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
75
|
+
- ".github/stale.yml"
|
76
|
+
- ".github/workflows/semgrep.yml"
|
54
77
|
- ".gitignore"
|
55
78
|
- ".rspec"
|
56
79
|
- ".rubocop.yml"
|
57
|
-
- ".
|
80
|
+
- ".semgrepignore"
|
81
|
+
- ".shiprc"
|
82
|
+
- ".snyk"
|
58
83
|
- CHANGELOG.md
|
84
|
+
- CONTRIBUTING.md
|
85
|
+
- EXAMPLES.md
|
59
86
|
- Gemfile
|
87
|
+
- Gemfile.lock
|
60
88
|
- Guardfile
|
61
89
|
- LICENSE
|
62
90
|
- README.md
|
63
91
|
- Rakefile
|
92
|
+
- codecov.yml
|
64
93
|
- examples/sinatra/app.rb
|
65
94
|
- examples/sinatra/config.ru
|
66
95
|
- lib/omniauth-auth0.rb
|
67
96
|
- lib/omniauth-auth0/version.rb
|
97
|
+
- lib/omniauth/auth0/errors.rb
|
98
|
+
- lib/omniauth/auth0/jwt_validator.rb
|
99
|
+
- lib/omniauth/auth0/telemetry.rb
|
68
100
|
- lib/omniauth/strategies/auth0.rb
|
69
101
|
- omniauth-auth0.gemspec
|
102
|
+
- opslevel.yml
|
103
|
+
- spec/omniauth/auth0/jwt_validator_spec.rb
|
104
|
+
- spec/omniauth/auth0/telemetry_spec.rb
|
70
105
|
- spec/omniauth/strategies/auth0_spec.rb
|
106
|
+
- spec/resources/jwks.json
|
71
107
|
- spec/spec_helper.rb
|
72
108
|
homepage: https://github.com/auth0/omniauth-auth0
|
73
109
|
licenses:
|
74
110
|
- MIT
|
75
111
|
metadata: {}
|
76
|
-
post_install_message:
|
112
|
+
post_install_message:
|
77
113
|
rdoc_options: []
|
78
114
|
require_paths:
|
79
115
|
- lib
|
@@ -88,11 +124,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
124
|
- !ruby/object:Gem::Version
|
89
125
|
version: '0'
|
90
126
|
requirements: []
|
91
|
-
|
92
|
-
|
93
|
-
signing_key:
|
127
|
+
rubygems_version: 3.2.22
|
128
|
+
signing_key:
|
94
129
|
specification_version: 4
|
95
|
-
summary:
|
130
|
+
summary: OmniAuth OAuth2 strategy for the Auth0 platform.
|
96
131
|
test_files:
|
132
|
+
- spec/omniauth/auth0/jwt_validator_spec.rb
|
133
|
+
- spec/omniauth/auth0/telemetry_spec.rb
|
97
134
|
- spec/omniauth/strategies/auth0_spec.rb
|
135
|
+
- spec/resources/jwks.json
|
98
136
|
- spec/spec_helper.rb
|