omniauth-auth0 2.4.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +27 -5
- data/.github/CODEOWNERS +1 -1
- 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/.gitignore +2 -0
- data/CHANGELOG.md +70 -0
- data/Gemfile +1 -1
- data/README.md +99 -2
- data/lib/omniauth-auth0/version.rb +1 -1
- data/lib/omniauth/auth0/jwt_validator.rb +63 -13
- data/lib/omniauth/strategies/auth0.rb +17 -7
- data/omniauth-auth0.gemspec +3 -2
- data/spec/omniauth/auth0/jwt_validator_spec.rb +261 -33
- data/spec/omniauth/strategies/auth0_spec.rb +74 -17
- metadata +26 -11
- data/.github/ISSUE_TEMPLATE.md +0 -39
- data/Gemfile.lock +0 -167
@@ -3,6 +3,8 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require 'jwt'
|
5
5
|
|
6
|
+
OmniAuth.config.allowed_request_methods = [:get, :post]
|
7
|
+
|
6
8
|
RSpec.shared_examples 'site has valid domain url' do |url|
|
7
9
|
it { expect(subject.site).to eq(url) }
|
8
10
|
end
|
@@ -26,7 +28,12 @@ describe OmniAuth::Strategies::Auth0 do
|
|
26
28
|
end
|
27
29
|
|
28
30
|
describe 'client_options' do
|
29
|
-
let(:subject) {
|
31
|
+
let(:subject) { OmniAuth::Strategies::Auth0.new(
|
32
|
+
application,
|
33
|
+
client_id,
|
34
|
+
client_secret,
|
35
|
+
domain_url
|
36
|
+
).client }
|
30
37
|
|
31
38
|
context 'domain with https' do
|
32
39
|
let(:domain_url) { 'https://samples.auth0.com' }
|
@@ -86,6 +93,9 @@ describe OmniAuth::Strategies::Auth0 do
|
|
86
93
|
expect(redirect_url).not_to have_query('connection_scope')
|
87
94
|
expect(redirect_url).not_to have_query('prompt')
|
88
95
|
expect(redirect_url).not_to have_query('screen_hint')
|
96
|
+
expect(redirect_url).not_to have_query('login_hint')
|
97
|
+
expect(redirect_url).not_to have_query('organization')
|
98
|
+
expect(redirect_url).not_to have_query('invitation')
|
89
99
|
end
|
90
100
|
|
91
101
|
it 'redirects to hosted login page' do
|
@@ -102,6 +112,9 @@ describe OmniAuth::Strategies::Auth0 do
|
|
102
112
|
expect(redirect_url).not_to have_query('connection_scope')
|
103
113
|
expect(redirect_url).not_to have_query('prompt')
|
104
114
|
expect(redirect_url).not_to have_query('screen_hint')
|
115
|
+
expect(redirect_url).not_to have_query('login_hint')
|
116
|
+
expect(redirect_url).not_to have_query('organization')
|
117
|
+
expect(redirect_url).not_to have_query('invitation')
|
105
118
|
end
|
106
119
|
|
107
120
|
it 'redirects to the hosted login page with connection_scope' do
|
@@ -125,6 +138,9 @@ describe OmniAuth::Strategies::Auth0 do
|
|
125
138
|
expect(redirect_url).to have_query('prompt', 'login')
|
126
139
|
expect(redirect_url).not_to have_query('auth0Client')
|
127
140
|
expect(redirect_url).not_to have_query('connection')
|
141
|
+
expect(redirect_url).not_to have_query('login_hint')
|
142
|
+
expect(redirect_url).not_to have_query('organization')
|
143
|
+
expect(redirect_url).not_to have_query('invitation')
|
128
144
|
end
|
129
145
|
|
130
146
|
it 'redirects to hosted login page with screen_hint=signup' do
|
@@ -139,6 +155,47 @@ describe OmniAuth::Strategies::Auth0 do
|
|
139
155
|
expect(redirect_url).to have_query('screen_hint', 'signup')
|
140
156
|
expect(redirect_url).not_to have_query('auth0Client')
|
141
157
|
expect(redirect_url).not_to have_query('connection')
|
158
|
+
expect(redirect_url).not_to have_query('login_hint')
|
159
|
+
expect(redirect_url).not_to have_query('organization')
|
160
|
+
expect(redirect_url).not_to have_query('invitation')
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'redirects to hosted login page with organization=TestOrg and invitation=TestInvite' do
|
164
|
+
get 'auth/auth0?organization=TestOrg&invitation=TestInvite'
|
165
|
+
expect(last_response.status).to eq(302)
|
166
|
+
redirect_url = last_response.headers['Location']
|
167
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
168
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
169
|
+
expect(redirect_url).to have_query('state')
|
170
|
+
expect(redirect_url).to have_query('client_id')
|
171
|
+
expect(redirect_url).to have_query('redirect_uri')
|
172
|
+
expect(redirect_url).to have_query('organization', 'TestOrg')
|
173
|
+
expect(redirect_url).to have_query('invitation', 'TestInvite')
|
174
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
175
|
+
expect(redirect_url).not_to have_query('connection')
|
176
|
+
expect(redirect_url).not_to have_query('connection_scope')
|
177
|
+
expect(redirect_url).not_to have_query('prompt')
|
178
|
+
expect(redirect_url).not_to have_query('screen_hint')
|
179
|
+
expect(redirect_url).not_to have_query('login_hint')
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'redirects to hosted login page with login_hint=example@mail.com' do
|
183
|
+
get 'auth/auth0?login_hint=example@mail.com'
|
184
|
+
expect(last_response.status).to eq(302)
|
185
|
+
redirect_url = last_response.headers['Location']
|
186
|
+
expect(redirect_url).to start_with('https://samples.auth0.com/authorize')
|
187
|
+
expect(redirect_url).to have_query('response_type', 'code')
|
188
|
+
expect(redirect_url).to have_query('state')
|
189
|
+
expect(redirect_url).to have_query('client_id')
|
190
|
+
expect(redirect_url).to have_query('redirect_uri')
|
191
|
+
expect(redirect_url).to have_query('login_hint', 'example@mail.com')
|
192
|
+
expect(redirect_url).not_to have_query('auth0Client')
|
193
|
+
expect(redirect_url).not_to have_query('connection')
|
194
|
+
expect(redirect_url).not_to have_query('connection_scope')
|
195
|
+
expect(redirect_url).not_to have_query('prompt')
|
196
|
+
expect(redirect_url).not_to have_query('screen_hint')
|
197
|
+
expect(redirect_url).not_to have_query('organization')
|
198
|
+
expect(redirect_url).not_to have_query('invitation')
|
142
199
|
end
|
143
200
|
|
144
201
|
describe 'callback' do
|
@@ -161,12 +218,17 @@ describe OmniAuth::Strategies::Auth0 do
|
|
161
218
|
payload['sub'] = user_id
|
162
219
|
payload['iss'] = "#{domain_url}/"
|
163
220
|
payload['aud'] = client_id
|
221
|
+
payload['name'] = name
|
222
|
+
payload['nickname'] = nickname
|
223
|
+
payload['picture'] = picture
|
224
|
+
payload['email'] = email
|
225
|
+
payload['email_verified'] = email_verified
|
226
|
+
|
164
227
|
JWT.encode payload, client_secret, 'HS256'
|
165
228
|
end
|
166
229
|
|
167
230
|
let(:oauth_response) do
|
168
231
|
{
|
169
|
-
id_token: id_token,
|
170
232
|
access_token: access_token,
|
171
233
|
expires_in: expires_in,
|
172
234
|
token_type: token_type
|
@@ -182,17 +244,7 @@ describe OmniAuth::Strategies::Auth0 do
|
|
182
244
|
}
|
183
245
|
end
|
184
246
|
|
185
|
-
let(:basic_user_info) { { sub
|
186
|
-
let(:oidc_user_info) do
|
187
|
-
{
|
188
|
-
sub: user_id,
|
189
|
-
name: name,
|
190
|
-
nickname: nickname,
|
191
|
-
email: email,
|
192
|
-
picture: picture,
|
193
|
-
email_verified: email_verified
|
194
|
-
}
|
195
|
-
end
|
247
|
+
let(:basic_user_info) { { "sub" => user_id, "name" => name } }
|
196
248
|
|
197
249
|
def stub_auth(body)
|
198
250
|
stub_request(:post, 'https://samples.auth0.com/oauth/token')
|
@@ -220,7 +272,9 @@ describe OmniAuth::Strategies::Auth0 do
|
|
220
272
|
WebMock.reset!
|
221
273
|
end
|
222
274
|
|
223
|
-
let(:subject)
|
275
|
+
let(:subject) do
|
276
|
+
MultiJson.decode(last_response.body)
|
277
|
+
end
|
224
278
|
|
225
279
|
context 'basic oauth' do
|
226
280
|
before do
|
@@ -239,10 +293,14 @@ describe OmniAuth::Strategies::Auth0 do
|
|
239
293
|
expect(subject['credentials']['expires_at']).to_not be_nil
|
240
294
|
end
|
241
295
|
|
242
|
-
it 'has basic values'
|
296
|
+
it 'has basic values' do
|
243
297
|
expect(subject['provider']).to eq('auth0')
|
244
298
|
expect(subject['uid']).to eq(user_id)
|
245
|
-
expect(subject['info']['name']).to eq(
|
299
|
+
expect(subject['info']['name']).to eq(name)
|
300
|
+
end
|
301
|
+
|
302
|
+
it 'should use the user info endpoint' do
|
303
|
+
expect(subject['extra']['raw_info']).to eq(basic_user_info)
|
246
304
|
end
|
247
305
|
end
|
248
306
|
|
@@ -268,7 +326,6 @@ describe OmniAuth::Strategies::Auth0 do
|
|
268
326
|
context 'oidc' do
|
269
327
|
before do
|
270
328
|
stub_auth(oidc_response)
|
271
|
-
stub_userinfo(oidc_user_info)
|
272
329
|
trigger_callback
|
273
330
|
end
|
274
331
|
|
metadata
CHANGED
@@ -1,43 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-auth0
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Auth0
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-19 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.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
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.7'
|
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.7'
|
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
|
|
@@ -53,7 +67,9 @@ files:
|
|
53
67
|
- ".circleci/config.yml"
|
54
68
|
- ".gemrelease"
|
55
69
|
- ".github/CODEOWNERS"
|
56
|
-
- ".github/ISSUE_TEMPLATE.
|
70
|
+
- ".github/ISSUE_TEMPLATE/config.yml"
|
71
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
72
|
+
- ".github/ISSUE_TEMPLATE/report_a_bug.md"
|
57
73
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
58
74
|
- ".github/stale.yml"
|
59
75
|
- ".gitignore"
|
@@ -64,7 +80,6 @@ files:
|
|
64
80
|
- CODE_OF_CONDUCT.md
|
65
81
|
- CONTRIBUTING.md
|
66
82
|
- Gemfile
|
67
|
-
- Gemfile.lock
|
68
83
|
- Guardfile
|
69
84
|
- LICENSE
|
70
85
|
- README.md
|
@@ -103,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
118
|
- !ruby/object:Gem::Version
|
104
119
|
version: '0'
|
105
120
|
requirements: []
|
106
|
-
rubygems_version: 3.
|
121
|
+
rubygems_version: 3.2.16
|
107
122
|
signing_key:
|
108
123
|
specification_version: 4
|
109
124
|
summary: OmniAuth OAuth2 strategy for the Auth0 platform.
|
data/.github/ISSUE_TEMPLATE.md
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
In order to efficiently and accurately address your issue or feature request, please read through the template below and answer all relevant questions. Your additional work here is greatly appreciated and will help us respond as quickly as possible. Please delete any sections or questions below that do not pertain to this request.
|
2
|
-
|
3
|
-
For general support or usage questions, please use the [Auth0 Community](https://community.auth0.com/) or [Auth0 Support](https://support.auth0.com.).
|
4
|
-
|
5
|
-
### Description
|
6
|
-
|
7
|
-
Description of the bug or feature request and why it's a problem. Consider including:
|
8
|
-
|
9
|
-
- The use case or overall problem you're trying to solve
|
10
|
-
- Information about when the problem started
|
11
|
-
|
12
|
-
### Prerequisites
|
13
|
-
|
14
|
-
* [ ] I have read the [Auth0 contribution guidelines](https://github.com/auth0/open-source-template/blob/master/GENERAL-CONTRIBUTING.md)
|
15
|
-
* [ ] I have read the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md)
|
16
|
-
* [ ] Did you check the [documentation](https://auth0.com/docs/quickstart/webapp/rails)?
|
17
|
-
* [ ] Did you check [Auth0 Community](https://community.auth0.com/tags/rails)?
|
18
|
-
* [ ] Are you reporting this to the correct repository? This strategy relies on [OmniAuth](https://github.com/omniauth/omniauth) and the [OmniAuth OAuth2](https://github.com/omniauth/omniauth-oauth2) strategy.
|
19
|
-
* [ ] Are there any related or duplicate [Issues](https://github.com/auth0/omniauth-auth0/issues) or [PRs](https://github.com/auth0/omniauth-auth0/pulls) for this issue?
|
20
|
-
|
21
|
-
### Environment
|
22
|
-
|
23
|
-
Please provide the following:
|
24
|
-
|
25
|
-
* OmniAuth-Auth0 version:
|
26
|
-
* Ruby version:
|
27
|
-
* Rails veresion:
|
28
|
-
* Browser version, if applicable:
|
29
|
-
* Additional gems that might be affecting your instance:
|
30
|
-
|
31
|
-
### Reproduction
|
32
|
-
|
33
|
-
Detail the steps taken to reproduce this error and note if this issue can be reproduced consistently or if it is intermittent.
|
34
|
-
|
35
|
-
Please include:
|
36
|
-
|
37
|
-
- Log files (redact/remove sensitive information)
|
38
|
-
- Application settings (redact/remove sensitive information)
|
39
|
-
- Screenshots, if helpful
|
data/Gemfile.lock
DELETED
@@ -1,167 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
omniauth-auth0 (2.4.0)
|
5
|
-
omniauth-oauth2 (~> 1.5)
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: https://rubygems.org/
|
9
|
-
specs:
|
10
|
-
addressable (2.7.0)
|
11
|
-
public_suffix (>= 2.0.2, < 5.0)
|
12
|
-
ast (2.4.1)
|
13
|
-
codecov (0.2.11)
|
14
|
-
json
|
15
|
-
simplecov
|
16
|
-
coderay (1.1.3)
|
17
|
-
crack (0.4.4)
|
18
|
-
daemons (1.3.1)
|
19
|
-
diff-lcs (1.4.4)
|
20
|
-
docile (1.3.2)
|
21
|
-
dotenv (2.7.6)
|
22
|
-
eventmachine (1.2.7)
|
23
|
-
faraday (1.0.1)
|
24
|
-
multipart-post (>= 1.2, < 3)
|
25
|
-
ffi (1.13.1)
|
26
|
-
formatador (0.2.5)
|
27
|
-
gem-release (2.1.1)
|
28
|
-
guard (2.16.2)
|
29
|
-
formatador (>= 0.2.4)
|
30
|
-
listen (>= 2.7, < 4.0)
|
31
|
-
lumberjack (>= 1.0.12, < 2.0)
|
32
|
-
nenv (~> 0.1)
|
33
|
-
notiffany (~> 0.0)
|
34
|
-
pry (>= 0.9.12)
|
35
|
-
shellany (~> 0.0)
|
36
|
-
thor (>= 0.18.1)
|
37
|
-
guard-compat (1.2.1)
|
38
|
-
guard-rspec (4.7.3)
|
39
|
-
guard (~> 2.1)
|
40
|
-
guard-compat (~> 1.1)
|
41
|
-
rspec (>= 2.99.0, < 4.0)
|
42
|
-
hashdiff (1.0.1)
|
43
|
-
hashie (4.1.0)
|
44
|
-
json (2.3.1)
|
45
|
-
jwt (2.2.2)
|
46
|
-
listen (3.1.5)
|
47
|
-
rb-fsevent (~> 0.9, >= 0.9.4)
|
48
|
-
rb-inotify (~> 0.9, >= 0.9.7)
|
49
|
-
ruby_dep (~> 1.2)
|
50
|
-
lumberjack (1.2.8)
|
51
|
-
method_source (1.0.0)
|
52
|
-
multi_json (1.15.0)
|
53
|
-
multi_xml (0.6.0)
|
54
|
-
multipart-post (2.1.1)
|
55
|
-
mustermann (1.1.1)
|
56
|
-
ruby2_keywords (~> 0.0.1)
|
57
|
-
nenv (0.3.0)
|
58
|
-
notiffany (0.1.3)
|
59
|
-
nenv (~> 0.1)
|
60
|
-
shellany (~> 0.0)
|
61
|
-
oauth2 (1.4.4)
|
62
|
-
faraday (>= 0.8, < 2.0)
|
63
|
-
jwt (>= 1.0, < 3.0)
|
64
|
-
multi_json (~> 1.3)
|
65
|
-
multi_xml (~> 0.5)
|
66
|
-
rack (>= 1.2, < 3)
|
67
|
-
omniauth (1.9.1)
|
68
|
-
hashie (>= 3.4.6)
|
69
|
-
rack (>= 1.6.2, < 3)
|
70
|
-
omniauth-oauth2 (1.7.0)
|
71
|
-
oauth2 (~> 1.4)
|
72
|
-
omniauth (~> 1.9)
|
73
|
-
parallel (1.19.2)
|
74
|
-
parser (2.7.1.4)
|
75
|
-
ast (~> 2.4.1)
|
76
|
-
pry (0.13.1)
|
77
|
-
coderay (~> 1.1)
|
78
|
-
method_source (~> 1.0)
|
79
|
-
public_suffix (4.0.6)
|
80
|
-
rack (2.2.3)
|
81
|
-
rack-protection (2.1.0)
|
82
|
-
rack
|
83
|
-
rack-test (1.1.0)
|
84
|
-
rack (>= 1.0, < 3)
|
85
|
-
rainbow (3.0.0)
|
86
|
-
rake (13.0.1)
|
87
|
-
rb-fsevent (0.10.4)
|
88
|
-
rb-inotify (0.10.1)
|
89
|
-
ffi (~> 1.0)
|
90
|
-
regexp_parser (1.8.0)
|
91
|
-
rexml (3.2.4)
|
92
|
-
rspec (3.9.0)
|
93
|
-
rspec-core (~> 3.9.0)
|
94
|
-
rspec-expectations (~> 3.9.0)
|
95
|
-
rspec-mocks (~> 3.9.0)
|
96
|
-
rspec-core (3.9.2)
|
97
|
-
rspec-support (~> 3.9.3)
|
98
|
-
rspec-expectations (3.9.2)
|
99
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
100
|
-
rspec-support (~> 3.9.0)
|
101
|
-
rspec-mocks (3.9.1)
|
102
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
103
|
-
rspec-support (~> 3.9.0)
|
104
|
-
rspec-support (3.9.3)
|
105
|
-
rubocop (0.91.0)
|
106
|
-
parallel (~> 1.10)
|
107
|
-
parser (>= 2.7.1.1)
|
108
|
-
rainbow (>= 2.2.2, < 4.0)
|
109
|
-
regexp_parser (>= 1.7)
|
110
|
-
rexml
|
111
|
-
rubocop-ast (>= 0.4.0, < 1.0)
|
112
|
-
ruby-progressbar (~> 1.7)
|
113
|
-
unicode-display_width (>= 1.4.0, < 2.0)
|
114
|
-
rubocop-ast (0.4.2)
|
115
|
-
parser (>= 2.7.1.4)
|
116
|
-
ruby-progressbar (1.10.1)
|
117
|
-
ruby2_keywords (0.0.2)
|
118
|
-
ruby_dep (1.5.0)
|
119
|
-
shellany (0.0.1)
|
120
|
-
shotgun (0.9.2)
|
121
|
-
rack (>= 1.0)
|
122
|
-
simplecov (0.19.0)
|
123
|
-
docile (~> 1.1)
|
124
|
-
simplecov-html (~> 0.11)
|
125
|
-
simplecov-html (0.12.2)
|
126
|
-
sinatra (2.1.0)
|
127
|
-
mustermann (~> 1.0)
|
128
|
-
rack (~> 2.2)
|
129
|
-
rack-protection (= 2.1.0)
|
130
|
-
tilt (~> 2.0)
|
131
|
-
thin (1.7.2)
|
132
|
-
daemons (~> 1.0, >= 1.0.9)
|
133
|
-
eventmachine (~> 1.0, >= 1.0.4)
|
134
|
-
rack (>= 1, < 3)
|
135
|
-
thor (1.0.1)
|
136
|
-
tilt (2.0.10)
|
137
|
-
unicode-display_width (1.7.0)
|
138
|
-
webmock (3.9.1)
|
139
|
-
addressable (>= 2.3.6)
|
140
|
-
crack (>= 0.3.2)
|
141
|
-
hashdiff (>= 0.4.0, < 2.0.0)
|
142
|
-
|
143
|
-
PLATFORMS
|
144
|
-
ruby
|
145
|
-
|
146
|
-
DEPENDENCIES
|
147
|
-
bundler (~> 1.9)
|
148
|
-
codecov
|
149
|
-
dotenv
|
150
|
-
gem-release
|
151
|
-
guard-rspec
|
152
|
-
jwt
|
153
|
-
listen (~> 3.1.5)
|
154
|
-
omniauth-auth0!
|
155
|
-
pry
|
156
|
-
rack-test
|
157
|
-
rake
|
158
|
-
rspec (~> 3.5)
|
159
|
-
rubocop
|
160
|
-
shotgun
|
161
|
-
simplecov
|
162
|
-
sinatra
|
163
|
-
thin
|
164
|
-
webmock
|
165
|
-
|
166
|
-
BUNDLED WITH
|
167
|
-
1.17.3
|