osso 0.0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.buildkite/hooks/environment +9 -0
- data/.buildkite/hooks/pre-command +7 -0
- data/.buildkite/pipeline.yml +3 -0
- data/.buildkite/template.yml +5 -0
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/.rubocop.yml +82 -0
- data/CODE_OF_CONDUCT.md +130 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +174 -0
- data/LICENSE +111 -0
- data/README.md +2 -0
- data/Rakefile +14 -0
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/config/database.yml +14 -0
- data/lib/.DS_Store +0 -0
- data/lib/osso/Rakefile +13 -0
- data/lib/osso/db/migrate/20190909230109_enable_uuid.rb +7 -0
- data/lib/osso/db/migrate/20200328135750_create_users.rb +12 -0
- data/lib/osso/db/migrate/20200328143303_create_oauth_tables.rb +57 -0
- data/lib/osso/db/migrate/20200411144528_create_saml_providers.rb +13 -0
- data/lib/osso/db/migrate/20200411184535_add_provider_id_to_users.rb +7 -0
- data/lib/osso/db/migrate/20200411192645_create_enterprise_accounts.rb +15 -0
- data/lib/osso/db/migrate/20200413132407_add_oauth_clients.rb +13 -0
- data/lib/osso/db/migrate/20200413142511_create_authorization_codes.rb +15 -0
- data/lib/osso/db/migrate/20200413153029_add_oauth_client_reference_to_saml_providers.rb +5 -0
- data/lib/osso/db/migrate/20200413163451_create_access_tokens.rb +13 -0
- data/lib/osso/db/migrate/20200501203026_drop_null_constraints_from_saml_provider.rb +7 -0
- data/lib/osso/db/migrate/20200501204047_drop_acs_url.rb +5 -0
- data/lib/osso/db/migrate/20200502120616_create_redirect_uris_and_drop_from_oauth_clients.rb +13 -0
- data/lib/osso/db/migrate/20200502135008_add_oauth_client_id_to_enterprise_account.rb +5 -0
- data/lib/osso/db/migrate/20200601131227_drop_null_constraint_from_saml_providers_provider.rb +7 -0
- data/lib/osso/db/schema.rb +132 -0
- data/lib/osso/helpers/auth.rb +67 -0
- data/lib/osso/helpers/helpers.rb +6 -0
- data/lib/osso/lib/app_config.rb +20 -0
- data/lib/osso/lib/oauth2_token.rb +38 -0
- data/lib/osso/models/access_token.rb +29 -0
- data/lib/osso/models/authorization_code.rb +14 -0
- data/lib/osso/models/enterprise_account.rb +28 -0
- data/lib/osso/models/models.rb +16 -0
- data/lib/osso/models/oauth_client.rb +32 -0
- data/lib/osso/models/redirect_uri.rb +20 -0
- data/lib/osso/models/saml_provider.rb +52 -0
- data/lib/osso/models/saml_providers/azure_saml_provider.rb +22 -0
- data/lib/osso/models/saml_providers/okta_saml_provider.rb +23 -0
- data/lib/osso/models/user.rb +24 -0
- data/lib/osso/rake.rb +4 -0
- data/lib/osso/routes/admin.rb +42 -0
- data/lib/osso/routes/auth.rb +64 -0
- data/lib/osso/routes/oauth.rb +57 -0
- data/lib/osso/routes/routes.rb +10 -0
- data/lib/osso/routes/views/error.erb +1 -0
- data/lib/osso/routes/views/multiple_providers.erb +1 -0
- data/lib/osso/version.rb +5 -0
- data/lib/osso.rb +9 -0
- data/lib/tasks/bootstrap.rake +17 -0
- data/osso-rb.gemspec +40 -0
- data/spec/factories/authorization_code.rb +10 -0
- data/spec/factories/enterprise_account.rb +45 -0
- data/spec/factories/oauth_client.rb +12 -0
- data/spec/factories/redirect_uri.rb +14 -0
- data/spec/factories/saml_providers.rb +46 -0
- data/spec/factories/user.rb +18 -0
- data/spec/models/azure_saml_provider_spec.rb +19 -0
- data/spec/models/okta_saml_provider_spec.rb +20 -0
- data/spec/models/saml_provider_spec.rb +31 -0
- data/spec/routes/admin_spec.rb +57 -0
- data/spec/routes/app_spec.rb +6 -0
- data/spec/routes/auth_spec.rb +112 -0
- data/spec/routes/oauth_spec.rb +134 -0
- data/spec/spec_helper.rb +65 -0
- data/spec/support/vcr_cassettes/okta_saml_callback.yml +59 -0
- metadata +302 -0
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Osso::Auth do
|
6
|
+
describe 'post /auth/saml/:uuid/callback' do
|
7
|
+
describe 'for an Okta SAML provider' do
|
8
|
+
let(:enterprise) { create(:enterprise_with_okta) }
|
9
|
+
let(:okta_provider) { enterprise.saml_providers.first }
|
10
|
+
|
11
|
+
describe "on the user's first authentication" do
|
12
|
+
it 'creates a user' do
|
13
|
+
mock_saml_omniauth
|
14
|
+
|
15
|
+
expect do
|
16
|
+
post(
|
17
|
+
"/auth/saml/#{okta_provider.id}/callback",
|
18
|
+
nil,
|
19
|
+
{
|
20
|
+
'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
|
21
|
+
'saml_provider' => okta_provider,
|
22
|
+
},
|
23
|
+
)
|
24
|
+
end.to change { Osso::Models::User.count }.by(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'creates an authorization_code' do
|
28
|
+
mock_saml_omniauth
|
29
|
+
|
30
|
+
expect do
|
31
|
+
post(
|
32
|
+
"/auth/saml/#{okta_provider.id}/callback",
|
33
|
+
nil,
|
34
|
+
{
|
35
|
+
'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
|
36
|
+
'saml_provider' => okta_provider,
|
37
|
+
},
|
38
|
+
)
|
39
|
+
end.to change { Osso::Models::AuthorizationCode.count }.by(1)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'on subsequent authentications' do
|
44
|
+
let!(:enterprise) { create(:enterprise_with_okta) }
|
45
|
+
let!(:okta_provider) { enterprise.saml_providers.first }
|
46
|
+
let(:user) { create(:user, saml_provider_id: okta_provider.id) }
|
47
|
+
|
48
|
+
before do
|
49
|
+
mock_saml_omniauth(email: user.email, id: user.idp_id)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'creates a user' do
|
53
|
+
expect do
|
54
|
+
post(
|
55
|
+
"/auth/saml/#{okta_provider.id}/callback",
|
56
|
+
nil,
|
57
|
+
{
|
58
|
+
'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
|
59
|
+
'saml_provider' => okta_provider,
|
60
|
+
},
|
61
|
+
)
|
62
|
+
end.to_not(change { Osso::Models::User.count })
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'for an (Azure) ADFS SAML provider' do
|
68
|
+
let(:enterprise) { create(:enterprise_with_azure) }
|
69
|
+
let(:azure_provider) { enterprise.provider }
|
70
|
+
|
71
|
+
describe "on the user's first authentication" do
|
72
|
+
it 'creates a user' do
|
73
|
+
mock_saml_omniauth
|
74
|
+
|
75
|
+
expect do
|
76
|
+
post(
|
77
|
+
"/auth/saml/#{azure_provider.id}/callback",
|
78
|
+
nil,
|
79
|
+
{
|
80
|
+
'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
|
81
|
+
'saml_provider' => azure_provider,
|
82
|
+
},
|
83
|
+
)
|
84
|
+
end.to change { Osso::Models::User.count }.by(1)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'on subsequent authentications' do
|
89
|
+
let!(:enterprise) { create(:enterprise_with_azure) }
|
90
|
+
let!(:azure_provider) { enterprise.provider }
|
91
|
+
let(:user) { create(:user, saml_provider_id: azure_provider.id) }
|
92
|
+
|
93
|
+
before do
|
94
|
+
mock_saml_omniauth(email: user.email, id: user.idp_id)
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'creates a user' do
|
98
|
+
expect do
|
99
|
+
post(
|
100
|
+
"/auth/saml/#{azure_provider.id}/callback",
|
101
|
+
nil,
|
102
|
+
{
|
103
|
+
'omniauth.auth' => OmniAuth.config.mock_auth[:saml],
|
104
|
+
'saml_provider' => azure_provider,
|
105
|
+
},
|
106
|
+
)
|
107
|
+
end.to_not(change { Osso::Models::User.count })
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Osso::Oauth do
|
6
|
+
let(:client) { create(:oauth_client) }
|
7
|
+
|
8
|
+
describe 'get /oauth/authorize' do
|
9
|
+
describe 'with a valid client ID and redirect URI' do
|
10
|
+
describe 'for a domain that does not belong to an enterprise' do
|
11
|
+
it '404s' do
|
12
|
+
create(:enterprise_with_okta, domain: 'foo.com')
|
13
|
+
|
14
|
+
get(
|
15
|
+
'/oauth/authorize',
|
16
|
+
domain: 'bar.org',
|
17
|
+
client_id: client.identifier,
|
18
|
+
response_type: 'code',
|
19
|
+
redirect_uri: client.redirect_uri_values.sample,
|
20
|
+
)
|
21
|
+
|
22
|
+
expect(last_response.status).to eq(404)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'for an enterprise domain with one SAML provider' do
|
27
|
+
it 'redirects to /auth/saml/:provider_id' do
|
28
|
+
enterprise = create(:enterprise_with_okta, oauth_client: client)
|
29
|
+
|
30
|
+
get(
|
31
|
+
'/oauth/authorize',
|
32
|
+
domain: enterprise.domain,
|
33
|
+
client_id: client.identifier,
|
34
|
+
response_type: 'code',
|
35
|
+
redirect_uri: client.redirect_uri_values.sample,
|
36
|
+
)
|
37
|
+
|
38
|
+
provider_id = enterprise.saml_providers.first.id
|
39
|
+
|
40
|
+
expect(last_response).to be_redirect
|
41
|
+
follow_redirect!
|
42
|
+
expect(last_request.url).to match("auth/saml/#{provider_id}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'for an enterprise domain with multiple SAML providers' do
|
47
|
+
it 'renders the multiple providers screen' do
|
48
|
+
enterprise = create(:enterprise_with_multiple_providers)
|
49
|
+
|
50
|
+
get(
|
51
|
+
'/oauth/authorize',
|
52
|
+
domain: enterprise.domain,
|
53
|
+
client_id: client.identifier,
|
54
|
+
response_type: 'code',
|
55
|
+
redirect_uri: client.redirect_uri_values.sample,
|
56
|
+
)
|
57
|
+
|
58
|
+
expect(last_response).to be_ok
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'post /oauth/token' do
|
65
|
+
describe 'with a valid unexpired code, client secret, client ID and redirect URI' do
|
66
|
+
it 'returns an access token' do
|
67
|
+
user = create(:user)
|
68
|
+
code = user.authorization_codes.valid.first
|
69
|
+
|
70
|
+
post(
|
71
|
+
'/oauth/token',
|
72
|
+
client_id: client.identifier,
|
73
|
+
client_secret: client.secret,
|
74
|
+
grant_type: 'authorization_code',
|
75
|
+
redirect_uri: code.redirect_uri,
|
76
|
+
code: code.token,
|
77
|
+
)
|
78
|
+
|
79
|
+
expect(last_response.status).to eq(200)
|
80
|
+
expect(last_json_response.to_h).to match(
|
81
|
+
access_token: a_string_matching(/\w{64}/),
|
82
|
+
expires_in: an_instance_of(Integer),
|
83
|
+
token_type: 'bearer',
|
84
|
+
)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe 'get /oauth/me' do
|
90
|
+
describe 'with a valid unexpired access token' do
|
91
|
+
it 'returns the user' do
|
92
|
+
user = create(:user)
|
93
|
+
code = user.authorization_codes.valid.first
|
94
|
+
|
95
|
+
get(
|
96
|
+
'/oauth/me',
|
97
|
+
access_token: code.access_token.to_bearer_token,
|
98
|
+
)
|
99
|
+
|
100
|
+
expect(last_response.status).to eq(200)
|
101
|
+
expect(last_json_response).to eq(
|
102
|
+
email: user.email,
|
103
|
+
id: user.id,
|
104
|
+
idp: 'Okta',
|
105
|
+
)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'with an expired access token' do
|
110
|
+
it 'returns 404' do
|
111
|
+
code = create(:authorization_code)
|
112
|
+
code.access_token.expired!
|
113
|
+
|
114
|
+
get(
|
115
|
+
'/oauth/me',
|
116
|
+
access_token: code.access_token.to_bearer_token,
|
117
|
+
)
|
118
|
+
|
119
|
+
expect(last_response.status).to eq(404)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe 'with an invalid access token' do
|
124
|
+
it 'returns 404' do
|
125
|
+
get(
|
126
|
+
'/oauth/me',
|
127
|
+
access_token: SecureRandom.hex(32),
|
128
|
+
)
|
129
|
+
|
130
|
+
expect(last_response.status).to eq(404)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'database_cleaner/active_record'
|
4
|
+
require 'factory_bot'
|
5
|
+
require 'faker'
|
6
|
+
require 'omniauth'
|
7
|
+
require 'pry'
|
8
|
+
require 'rack/test'
|
9
|
+
require 'rspec'
|
10
|
+
require 'webmock/rspec'
|
11
|
+
|
12
|
+
ENV['RACK_ENV'] = 'test'
|
13
|
+
ENV['SESSION_SECRET'] = 'supersecret'
|
14
|
+
|
15
|
+
require File.expand_path '../lib/osso.rb', __dir__
|
16
|
+
|
17
|
+
module RSpecMixin
|
18
|
+
include Rack::Test::Methods
|
19
|
+
|
20
|
+
def app
|
21
|
+
Rack::URLMap.new(
|
22
|
+
'/admin' => Osso::Admin,
|
23
|
+
'/auth' => Osso::Auth,
|
24
|
+
'/oauth' => Osso::Oauth,
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def mock_saml_omniauth(email: 'user@enterprise.com', id: SecureRandom.uuid)
|
29
|
+
OmniAuth.config.add_mock(:saml,
|
30
|
+
extra: {
|
31
|
+
response_object: {
|
32
|
+
attributes: {
|
33
|
+
'id': id,
|
34
|
+
'email': email,
|
35
|
+
},
|
36
|
+
},
|
37
|
+
})
|
38
|
+
end
|
39
|
+
|
40
|
+
def last_json_response
|
41
|
+
JSON.parse(last_response.body, symbolize_names: true)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
RSpec.configure do |config|
|
46
|
+
config.include RSpecMixin
|
47
|
+
config.include FactoryBot::Syntax::Methods
|
48
|
+
|
49
|
+
config.before(:suite) do
|
50
|
+
ActiveRecord::Base.establish_connection
|
51
|
+
FactoryBot.find_definitions
|
52
|
+
DatabaseCleaner.strategy = :transaction
|
53
|
+
DatabaseCleaner.clean_with(:truncation)
|
54
|
+
end
|
55
|
+
|
56
|
+
config.around(:each) do |example|
|
57
|
+
DatabaseCleaner.cleaning do
|
58
|
+
example.run
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
OmniAuth.config.test_mode = true
|
63
|
+
OmniAuth.config.logger = Logger.new('/dev/null')
|
64
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
65
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://localhost:9292/auth/saml/:uuid/callback
|
6
|
+
body:
|
7
|
+
encoding: ASCII-8BIT
|
8
|
+
string: SAMLResponse=PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2FtbDJwOlJlc3BvbnNlIERlc3RpbmF0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkyOTIvYXV0aC9zYW1sLzY4ZTkwNTdjLTQ2MmYtNDM3Zi04NDRkLTk4NzI0ZmVmOWQ0My9jYWxsYmFjayIgSUQ9ImlkMTgyOTI5NzEwODgzMjU2OTIyMDE3Nzc0NDUyIiBJblJlc3BvbnNlVG89Il81NGM0ZjE5MS0xYmY3LTRiMDItOTZlYS0zNGQ4NTU1YWVjYWEiIElzc3VlSW5zdGFudD0iMjAyMC0wNC0xMVQxNjozMjoxOC40MjRaIiBWZXJzaW9uPSIyLjAiIHhtbG5zOnNhbWwycD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPjxzYW1sMjpJc3N1ZXIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj5odHRwOi8vd3d3Lm9rdGEuY29tL2V4azUxMzI2YjNVMTk0MUhmNHg2PC9zYW1sMjpJc3N1ZXI%2BPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI%2BPGRzOlNpZ25lZEluZm8%2BPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjcnNhLXNoYTI1NiIvPjxkczpSZWZlcmVuY2UgVVJJPSIjaWQxODI5Mjk3MTA4ODMyNTY5MjIwMTc3NzQ0NTIiPjxkczpUcmFuc2Zvcm1zPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPjxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIFByZWZpeExpc3Q9InhzIiB4bWxuczplYz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8%2BPC9kczpUcmFuc2Zvcm0%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiLz48ZHM6RGlnZXN0VmFsdWU%2BZEpWb0Z6Y01zTjV3TmNJRWtJWkxqb1JjWDRpMzVYekI3RGg4ZE0wU1pMZz08L2RzOkRpZ2VzdFZhbHVlPjwvZHM6UmVmZXJlbmNlPjwvZHM6U2lnbmVkSW5mbz48ZHM6U2lnbmF0dXJlVmFsdWU%2BdnFES0RhVk8vYlRkRW5hNlMwNHdQV0hicXdNQ1JHdStjRVRxOE9FR2pzK1drTUVBQVYzeEFnNitUZTB2Z0haSjlTWnhwSW9iWEdadVQvVFFnbnAyczNMM1FvaUx5UVFwOExXQnl0b1A0UWhSV1dNY1N3UHlUYWI5TmRUT1RWeXJBckJxZHFFVXN0M0Z5cVpLSVFlbUpocWU4ckk4cmJwQTI2YUFqc2xNZkRIZHNMTFlFMjUwTXpPdG9wdVppNHpvdDZDSTl1NFVRK2dsOWdqSUJyai9sZ3BQME5mZ3RXM01QNVRQOGxsaEpmVXJ4MjhLWGZjSHpOa1RDU1BxVTRwLzZCRTV5dm5QcmJVTE1EWWZQWG5aV0t5d0JpRkNyaTgydmNOdElXVHUvcmkrejNRT0p6dFRiTkdKU0ZjWHdkWHpheG8xdS9SN3ZUQlJPOCtuZEFsL1VBPT08L2RzOlNpZ25hdHVyZVZhbHVlPjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSURwRENDQW95Z0F3SUJBZ0lHQVhFaUQ0TGxNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR1NNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUcKQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVTJGdUlFWnlZVzVqYVhOamJ6RU5NQXNHQTFVRUNnd0VUMnQwWVRFVQpNQklHQTFVRUN3d0xVMU5QVUhKdmRtbGtaWEl4RXpBUkJnTlZCQU1NQ21SbGRpMHhOakl3TWpReEhEQWFCZ2txaGtpRzl3MEJDUUVXCkRXbHVabTlBYjJ0MFlTNWpiMjB3SGhjTk1qQXdNekk0TVRZMU1UVTBXaGNOTXpBd016STRNVFkxTWpVMFdqQ0JrakVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RmpBVUJnTlZCQWNNRFZOaGJpQkdjbUZ1WTJselkyOHhEVEFMQmdOVgpCQW9NQkU5cmRHRXhGREFTQmdOVkJBc01DMU5UVDFCeWIzWnBaR1Z5TVJNd0VRWURWUVFEREFwa1pYWXRNVFl5TURJME1Sd3dHZ1lKCktvWklodmNOQVFrQkZnMXBibVp2UUc5cmRHRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEKd3NuUDRVVGZ2M2J4UjVKaDBhdDUxRHFqaitmS3hGem56RlczWEE1TmJGMlNsUkxqZVljdmozKzQ3VEMwZVA2eE9zTFdmbnZkbng0dgpkZDlVZm43akRDbzVwTDNKeWtNVkVoMkkwc3pGM1JMQythNTMyQXJjd2dVOVB4NDgrcldWd1BrQVNTN2w0TkhBTTQrZ09CSEpNUXQyCkFNb2hQVDBrVTQxUDhCRVB6ZndoTnlpRVhSNjZKTlpJSlVFOGZNM1ZwZ254bS9WU3dZekpmME5mT3lmeHY4SmN6RjB6a0RicEU3VGsKM1d3L1BGRkxvTXhXemFuV0dKUStibG5odjZVVjZINGZjZkFiY3dBcGxPZElWSGpTMmdoWUJ2WU5HYWh1RnhqaWEwKzZjc3laR3J0OApINFhtUjVEcitqWFk1SzFiMVZPQTBrMTkvRkNuSEhOL3NtbjI1d0lEQVFBQk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQmdEOU5FCjRPQ3VSMSt2dWNWOFMxVDZYWElMMmhCN2JYQkFaRVZIWjFhRXJSemt0Z1hBTWdWd0cyNjd2SWtENVZPWEJpVHk5eU5VNUxLNkczazIKemV3VTE5MHNMMWRNZnlQbm9WWnluOTRudndlOUErb24wdG1aZG1rMDB4aXJLazNGSmRhY25aTkU5RGwvYWZJcmNOZjZ4QW0wV3NVOQprYk1pUnd3dmpPNFRBaXlnRFF6YnJSQzhaZm1UM2hwQmEzYVRVekFjY3J2RVFjZ2FyTGs0cjdValhQN2EybUNOM1VJSWgrc25OMk1zCnZYSEwwcjZmTTN4Ym5peis1bGxlV3RQRnc3M3l5U0JjOHpua1daNFRuOExoMHI2bzVuQ1JZYnIyUkVVQjdaSWZpSXlCYlp4SXA0a3YKYStoYWJiblFERmlOVnpFZDhPUFhIaDRFcUx4T1BEUlc8L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L2RzOlNpZ25hdHVyZT48c2FtbDJwOlN0YXR1cyB4bWxuczpzYW1sMnA9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCI%2BPHNhbWwycDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWwycDpTdGF0dXM%2BPHNhbWwyOkFzc2VydGlvbiBJRD0iaWQxODI5Mjk3MTA4ODQyMDg3MzY4MzU5Njg1MiIgSXNzdWVJbnN0YW50PSIyMDIwLTA0LTExVDE2OjMyOjE4LjQyNFoiIFZlcnNpb249IjIuMCIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI%2BPHNhbWwyOklzc3VlciBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OmVudGl0eSIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPmh0dHA6Ly93d3cub2t0YS5jb20vZXhrNTEzMjZiM1UxOTQxSGY0eDY8L3NhbWwyOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8%2BPGRzOlJlZmVyZW5jZSBVUkk9IiNpZDE4MjkyOTcxMDg4NDIwODczNjgzNTk2ODUyIj48ZHM6VHJhbnNmb3Jtcz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIj48ZWM6SW5jbHVzaXZlTmFtZXNwYWNlcyBQcmVmaXhMaXN0PSJ4cyIgeG1sbnM6ZWM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3JtPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8%2BPGRzOkRpZ2VzdFZhbHVlPjJ0ekZZTktpNTRBVTV0L3R1UUZJS0Q2aHdlWlRqc1FYSTFzWmFreUE3Y0k9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8%2BPGRzOlNpZ25hdHVyZVZhbHVlPkxJakdOK0RRRExldUE4clF4Q0Yvblp2c3ZCM0VLWjFaUHA3cUU4ZXZZVGY3R01lWGlVa3hXaTkvbGQ1d2p2YWFjaG5ZOXBMV0FObStFRGo4aUhGcnI1a1dINWJZZUI3b0JybVY1NDlTMmpJWW5pbmJBT055T2d3TVRpWXJUQkZ3czg1dHVYb2h0N3JBcVRrWVBjY2FnanJyQW5sYnNyK3BVb3FZYzZMOHZUczR3d2x0MzJiVXF0TThCOG5XS1NmWFBMTEo3VlVGeFhFQm1iV1JsbjJBcjgyN2dhT1dGemoyQXcxWGw2bUZFTllscDVib3hoSlVkRHJDMHNkaW01YXZmQU5jSXFrMjJFQkc5aFRZNUdnbzlrTjBSYkgvYm15MTc5K0lDaWo5R2hlZ2xmWGVpV3pVaWlLUkF1WS8zbEVLZnBYQ2lpaVRVbGdUcHFxdzhnNjNvZz09PC9kczpTaWduYXR1cmVWYWx1ZT48ZHM6S2V5SW5mbz48ZHM6WDUwOURhdGE%2BPGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlEcERDQ0FveWdBd0lCQWdJR0FYRWlENExsTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdTTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHCkExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlUyRnVJRVp5WVc1amFYTmpiekVOTUFzR0ExVUVDZ3dFVDJ0MFlURVUKTUJJR0ExVUVDd3dMVTFOUFVISnZkbWxrWlhJeEV6QVJCZ05WQkFNTUNtUmxkaTB4TmpJd01qUXhIREFhQmdrcWhraUc5dzBCQ1FFVwpEV2x1Wm05QWIydDBZUzVqYjIwd0hoY05NakF3TXpJNE1UWTFNVFUwV2hjTk16QXdNekk0TVRZMU1qVTBXakNCa2pFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdNQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjTURWTmhiaUJHY21GdVkybHpZMjh4RFRBTEJnTlYKQkFvTUJFOXJkR0V4RkRBU0JnTlZCQXNNQzFOVFQxQnliM1pwWkdWeU1STXdFUVlEVlFRRERBcGtaWFl0TVRZeU1ESTBNUnd3R2dZSgpLb1pJaHZjTkFRa0JGZzFwYm1adlFHOXJkR0V1WTI5dE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCndzblA0VVRmdjNieFI1SmgwYXQ1MURxamorZkt4RnpuekZXM1hBNU5iRjJTbFJMamVZY3ZqMys0N1RDMGVQNnhPc0xXZm52ZG54NHYKZGQ5VWZuN2pEQ281cEwzSnlrTVZFaDJJMHN6RjNSTEMrYTUzMkFyY3dnVTlQeDQ4K3JXVndQa0FTUzdsNE5IQU00K2dPQkhKTVF0MgpBTW9oUFQwa1U0MVA4QkVQemZ3aE55aUVYUjY2Sk5aSUpVRThmTTNWcGdueG0vVlN3WXpKZjBOZk95Znh2OEpjekYwemtEYnBFN1RrCjNXdy9QRkZMb014V3phbldHSlErYmxuaHY2VVY2SDRmY2ZBYmN3QXBsT2RJVkhqUzJnaFlCdllOR2FodUZ4amlhMCs2Y3N5WkdydDgKSDRYbVI1RHIralhZNUsxYjFWT0EwazE5L0ZDbkhITi9zbW4yNXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJnRDlORQo0T0N1UjErdnVjVjhTMVQ2WFhJTDJoQjdiWEJBWkVWSFoxYUVyUnprdGdYQU1nVndHMjY3dklrRDVWT1hCaVR5OXlOVTVMSzZHM2syCnpld1UxOTBzTDFkTWZ5UG5vVlp5bjk0bnZ3ZTlBK29uMHRtWmRtazAweGlyS2szRkpkYWNuWk5FOURsL2FmSXJjTmY2eEFtMFdzVTkKa2JNaVJ3d3ZqTzRUQWl5Z0RRemJyUkM4WmZtVDNocEJhM2FUVXpBY2NydkVRY2dhckxrNHI3VWpYUDdhMm1DTjNVSUloK3NuTjJNcwp2WEhMMHI2Zk0zeGJuaXorNWxsZVd0UEZ3NzN5eVNCYzh6bmtXWjRUbjhMaDByNm81bkNSWWJyMlJFVUI3WklmaUl5QmJaeElwNGt2CmEraGFiYm5RREZpTlZ6RWQ4T1BYSGg0RXFMeE9QRFJXPC9kczpYNTA5Q2VydGlmaWNhdGU%2BPC9kczpYNTA5RGF0YT48L2RzOktleUluZm8%2BPC9kczpTaWduYXR1cmU%2BPHNhbWwyOlN1YmplY3QgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPjxzYW1sMjpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDp1bnNwZWNpZmllZCI%2Bc2FtQHZjYXJkbWUuY29tPC9zYW1sMjpOYW1lSUQ%2BPHNhbWwyOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj48c2FtbDI6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgSW5SZXNwb25zZVRvPSJfNTRjNGYxOTEtMWJmNy00YjAyLTk2ZWEtMzRkODU1NWFlY2FhIiBOb3RPbk9yQWZ0ZXI9IjIwMjAtMDQtMTFUMTY6Mzc6MTguNDI0WiIgUmVjaXBpZW50PSJodHRwOi8vbG9jYWxob3N0OjkyOTIvYXV0aC9zYW1sLzY4ZTkwNTdjLTQ2MmYtNDM3Zi04NDRkLTk4NzI0ZmVmOWQ0My9jYWxsYmFjayIvPjwvc2FtbDI6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWwyOlN1YmplY3Q%2BPHNhbWwyOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDIwLTA0LTExVDE2OjI3OjE4LjQyNFoiIE5vdE9uT3JBZnRlcj0iMjAyMC0wNC0xMVQxNjozNzoxOC40MjRaIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI%2BPHNhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24%2BPHNhbWwyOkF1ZGllbmNlPjY4ZTkwNTdjLTQ2MmYtNDM3Zi04NDRkLTk4NzI0ZmVmOWQ0Mzwvc2FtbDI6QXVkaWVuY2U%2BPC9zYW1sMjpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDI6Q29uZGl0aW9ucz48c2FtbDI6QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDIwLTA0LTExVDE2OjMyOjE4LjQyNFoiIFNlc3Npb25JbmRleD0iXzU0YzRmMTkxLTFiZjctNGIwMi05NmVhLTM0ZDg1NTVhZWNhYSIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPjxzYW1sMjpBdXRobkNvbnRleHQ%2BPHNhbWwyOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9zYW1sMjpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWwyOkF1dGhuQ29udGV4dD48L3NhbWwyOkF1dGhuU3RhdGVtZW50PjxzYW1sMjpBdHRyaWJ1dGVTdGF0ZW1lbnQgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPjxzYW1sMjpBdHRyaWJ1dGUgTmFtZT0iZW1haWwiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6dW5zcGVjaWZpZWQiPjxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnNhbUB2Y2FyZG1lLmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU%2BPC9zYW1sMjpBdHRyaWJ1dGU%2BPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJpZCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1bnNwZWNpZmllZCI%2BPHNhbWwyOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI%2BMDB1NTEwd2pwNDRmdDNEUm80eDY8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDI6QXR0cmlidXRlPjwvc2FtbDI6QXR0cmlidXRlU3RhdGVtZW50Pjwvc2FtbDI6QXNzZXJ0aW9uPjwvc2FtbDJwOlJlc3BvbnNlPg%3D%3D&RelayState=
|
9
|
+
headers:
|
10
|
+
Host:
|
11
|
+
- localhost:9292
|
12
|
+
Connection:
|
13
|
+
- keep-alive
|
14
|
+
Cache-Control:
|
15
|
+
- max-age=0
|
16
|
+
Upgrade-Insecure-Requests:
|
17
|
+
- '1'
|
18
|
+
Origin:
|
19
|
+
- 'null'
|
20
|
+
User-Agent:
|
21
|
+
- Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML,
|
22
|
+
like Gecko) Chrome/80.0.3987.163 Safari/537.36
|
23
|
+
Sec-Fetch-Dest:
|
24
|
+
- document
|
25
|
+
Accept:
|
26
|
+
- text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
27
|
+
Sec-Fetch-Site:
|
28
|
+
- cross-site
|
29
|
+
Sec-Fetch-Mode:
|
30
|
+
- navigate
|
31
|
+
Accept-Encoding:
|
32
|
+
- gzip, deflate, br
|
33
|
+
Accept-Language:
|
34
|
+
- en-US,en;q=0.9,fr;q=0.8
|
35
|
+
Cookie:
|
36
|
+
- _vcardme-api_session=YmdCdkxYdTlLWkhhWWNnZTQ5Yjdxc0gweWJjKys4TUtSWWVBd3c1U2tUT2E1b2t0MFQxd3lZQTJwSVcyZVFCOHZxaHRtTVZjVGYyay9ReVc0WElxR0hlVGM0MW5qQUxVZE8zYytTaXBlcDZraWRLSllkYjlvYUNMVkx6S3Aremh4ODB5eVBzMmFwS3dHOHNZaFFBYnJnPT0tLVRKUEdSMFV1SGRCZSt1LzNiYjRSZnc9PQ%3D%3D--4e212108b448172e97b0e205f75976780e843bd7;
|
37
|
+
mp_321622acf650be9cac3978565e73be1a_mixpanel=%7B%22distinct_id%22%3A%20%2217122c6e1421dd-0fd311181d4582-396f7f07-384000-17122c6e14935d%22%2C%22%24device_id%22%3A%20%2217122c6e1421dd-0fd311181d4582-396f7f07-384000-17122c6e14935d%22%2C%22%24initial_referrer%22%3A%20%22%24direct%22%2C%22%24initial_referring_domain%22%3A%20%22%24direct%22%7D;
|
38
|
+
rack.session=BAh7CUkiD3Nlc3Npb25faWQGOgZFVEkiRTdkYWNhMWRhNjc3MTY4OTY0ZWVj%0AZjg2YmIyOTM1M2EzOTcxZWIzN2ZjMzAxZGUxNmIyZGNiNDdhMGU0ZDdiMmQG%0AOwBGSSINc2FtbF91aWQGOwBUSSIUc2FtQHZjYXJkbWUuY29tBjsAVEkiF3Nh%0AbWxfc2Vzc2lvbl9pbmRleAY7AFRJIipfOTBjYjc4NjItYTc5My00M2ZjLWFh%0AOWItZDdiMjY0ZWE4NmM2BjsAVEkiFG9tbmlhdXRoLnBhcmFtcwY7AFR7AA%3D%3D%0A--429d063c69188264011d1384cbf24a4b486d2d3a
|
39
|
+
Version:
|
40
|
+
- HTTP/1.1
|
41
|
+
Content-Type:
|
42
|
+
- application/x-www-form-urlencoded
|
43
|
+
Content-Length:
|
44
|
+
- '10749'
|
45
|
+
response:
|
46
|
+
status:
|
47
|
+
code: 200
|
48
|
+
message: null
|
49
|
+
headers:
|
50
|
+
Content-Type:
|
51
|
+
- application/json
|
52
|
+
Content-Length:
|
53
|
+
- '112'
|
54
|
+
body:
|
55
|
+
encoding: UTF-8
|
56
|
+
string: '{"user":{"id":"2077ee4f-9e7d-46c2-bbf3-98c49c312281","email":"sam@vcardme.com","idp_id":"00u510wjp44ft3DRo4x6"}}'
|
57
|
+
http_version: null
|
58
|
+
recorded_at: Sat, 11 Apr 2020 16:32:18 GMT
|
59
|
+
recorded_with: VCR 5.1.0
|
metadata
ADDED
@@ -0,0 +1,302 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: osso
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sam Bauch
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.0.3.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.0.3.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jwt
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: omniauth-multi-provider
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: omniauth-saml
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.1.4
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.1.4
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rack-contrib
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rack-oauth2
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: sinatra
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: sinatra-activerecord
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: sinatra-contrib
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: bundler
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '2.1'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '2.1'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: pry
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
description: This gem includes the main functionality for Osso apps,
|
196
|
+
email:
|
197
|
+
- sbauch@gmail.com
|
198
|
+
executables:
|
199
|
+
- console
|
200
|
+
- setup
|
201
|
+
extensions: []
|
202
|
+
extra_rdoc_files: []
|
203
|
+
files:
|
204
|
+
- ".DS_Store"
|
205
|
+
- ".buildkite/hooks/environment"
|
206
|
+
- ".buildkite/hooks/pre-command"
|
207
|
+
- ".buildkite/pipeline.yml"
|
208
|
+
- ".buildkite/template.yml"
|
209
|
+
- ".gitignore"
|
210
|
+
- ".rspec"
|
211
|
+
- ".rubocop.yml"
|
212
|
+
- CODE_OF_CONDUCT.md
|
213
|
+
- Gemfile
|
214
|
+
- Gemfile.lock
|
215
|
+
- LICENSE
|
216
|
+
- README.md
|
217
|
+
- Rakefile
|
218
|
+
- bin/console
|
219
|
+
- bin/setup
|
220
|
+
- config/database.yml
|
221
|
+
- lib/.DS_Store
|
222
|
+
- lib/osso.rb
|
223
|
+
- lib/osso/Rakefile
|
224
|
+
- lib/osso/db/migrate/20190909230109_enable_uuid.rb
|
225
|
+
- lib/osso/db/migrate/20200328135750_create_users.rb
|
226
|
+
- lib/osso/db/migrate/20200328143303_create_oauth_tables.rb
|
227
|
+
- lib/osso/db/migrate/20200411144528_create_saml_providers.rb
|
228
|
+
- lib/osso/db/migrate/20200411184535_add_provider_id_to_users.rb
|
229
|
+
- lib/osso/db/migrate/20200411192645_create_enterprise_accounts.rb
|
230
|
+
- lib/osso/db/migrate/20200413132407_add_oauth_clients.rb
|
231
|
+
- lib/osso/db/migrate/20200413142511_create_authorization_codes.rb
|
232
|
+
- lib/osso/db/migrate/20200413153029_add_oauth_client_reference_to_saml_providers.rb
|
233
|
+
- lib/osso/db/migrate/20200413163451_create_access_tokens.rb
|
234
|
+
- lib/osso/db/migrate/20200501203026_drop_null_constraints_from_saml_provider.rb
|
235
|
+
- lib/osso/db/migrate/20200501204047_drop_acs_url.rb
|
236
|
+
- lib/osso/db/migrate/20200502120616_create_redirect_uris_and_drop_from_oauth_clients.rb
|
237
|
+
- lib/osso/db/migrate/20200502135008_add_oauth_client_id_to_enterprise_account.rb
|
238
|
+
- lib/osso/db/migrate/20200601131227_drop_null_constraint_from_saml_providers_provider.rb
|
239
|
+
- lib/osso/db/schema.rb
|
240
|
+
- lib/osso/helpers/auth.rb
|
241
|
+
- lib/osso/helpers/helpers.rb
|
242
|
+
- lib/osso/lib/app_config.rb
|
243
|
+
- lib/osso/lib/oauth2_token.rb
|
244
|
+
- lib/osso/models/access_token.rb
|
245
|
+
- lib/osso/models/authorization_code.rb
|
246
|
+
- lib/osso/models/enterprise_account.rb
|
247
|
+
- lib/osso/models/models.rb
|
248
|
+
- lib/osso/models/oauth_client.rb
|
249
|
+
- lib/osso/models/redirect_uri.rb
|
250
|
+
- lib/osso/models/saml_provider.rb
|
251
|
+
- lib/osso/models/saml_providers/azure_saml_provider.rb
|
252
|
+
- lib/osso/models/saml_providers/okta_saml_provider.rb
|
253
|
+
- lib/osso/models/user.rb
|
254
|
+
- lib/osso/rake.rb
|
255
|
+
- lib/osso/routes/admin.rb
|
256
|
+
- lib/osso/routes/auth.rb
|
257
|
+
- lib/osso/routes/oauth.rb
|
258
|
+
- lib/osso/routes/routes.rb
|
259
|
+
- lib/osso/routes/views/error.erb
|
260
|
+
- lib/osso/routes/views/multiple_providers.erb
|
261
|
+
- lib/osso/version.rb
|
262
|
+
- lib/tasks/bootstrap.rake
|
263
|
+
- osso-rb.gemspec
|
264
|
+
- spec/factories/authorization_code.rb
|
265
|
+
- spec/factories/enterprise_account.rb
|
266
|
+
- spec/factories/oauth_client.rb
|
267
|
+
- spec/factories/redirect_uri.rb
|
268
|
+
- spec/factories/saml_providers.rb
|
269
|
+
- spec/factories/user.rb
|
270
|
+
- spec/models/azure_saml_provider_spec.rb
|
271
|
+
- spec/models/okta_saml_provider_spec.rb
|
272
|
+
- spec/models/saml_provider_spec.rb
|
273
|
+
- spec/routes/admin_spec.rb
|
274
|
+
- spec/routes/app_spec.rb
|
275
|
+
- spec/routes/auth_spec.rb
|
276
|
+
- spec/routes/oauth_spec.rb
|
277
|
+
- spec/spec_helper.rb
|
278
|
+
- spec/support/vcr_cassettes/okta_saml_callback.yml
|
279
|
+
homepage: https://github.com/enterprise-oss/osso-rb
|
280
|
+
licenses:
|
281
|
+
- MIT
|
282
|
+
metadata: {}
|
283
|
+
post_install_message:
|
284
|
+
rdoc_options: []
|
285
|
+
require_paths:
|
286
|
+
- lib
|
287
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
288
|
+
requirements:
|
289
|
+
- - ">="
|
290
|
+
- !ruby/object:Gem::Version
|
291
|
+
version: 2.3.0
|
292
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
293
|
+
requirements:
|
294
|
+
- - ">="
|
295
|
+
- !ruby/object:Gem::Version
|
296
|
+
version: '0'
|
297
|
+
requirements: []
|
298
|
+
rubygems_version: 3.0.3
|
299
|
+
signing_key:
|
300
|
+
specification_version: 4
|
301
|
+
summary: Main functionality for Osso
|
302
|
+
test_files: []
|