omniauth-applicaster 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -16
- data/lib/applicaster/accounts.rb +30 -37
- data/lib/applicaster/accounts/configuration.rb +32 -0
- data/lib/omniauth-applicaster/version.rb +2 -2
- data/lib/omniauth/strategies/applicaster.rb +1 -6
- data/omniauth-applicaster.gemspec +1 -1
- data/spec/lib/applicaster/accounts/configuration_spec.rb +39 -0
- data/spec/lib/applicaster/accounts_spec.rb +36 -51
- data/spec/support/env_variable_helper.rb +13 -0
- data/spec/support/set_test_configuration.rb +9 -0
- data/spec/support/webmock_stubs_helper.rb +7 -1
- metadata +8 -3
- data/spec/support/setup_env_vars.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c557d14bae9ae9c5e9f67d0008d5375ac694ccd1
|
4
|
+
data.tar.gz: a434435c67e5391ed860c91f7e654d110fc62755
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e1b369b1647364acf5c804a51c926abb9cd811ba6704e9580dc3c54aedac3a6bec9ec6072812adab7c2ee103680ab44f2a36e323a624474d2a1c35e3b977634
|
7
|
+
data.tar.gz: 5dffb8080ed50ced4bc38a107752ac7c0d09635a7e6d9593af295b054047cec3d1859329bd77d5c94a734629142a6d95bc9213bfa4ded7ca2c232ffbdbbfbbfc
|
data/README.md
CHANGED
@@ -13,29 +13,27 @@ gem 'omniauth-applicaster'
|
|
13
13
|
|
14
14
|
## Usage
|
15
15
|
|
16
|
-
###
|
17
|
-
|
18
|
-
The OAuth client ID and client secret are read from the environment variables
|
19
|
-
`ACCOUNTS_CLIENT_ID` and `ACCOUNTS_CLIENT_SECRET` respectivly.
|
16
|
+
### Omniauth strategy in Rails
|
20
17
|
|
21
|
-
|
22
|
-
default to change this set the `ACCOUNTS_BASE_URL` environment variable. This is
|
23
|
-
useful for example when running a local version of the accounts service
|
18
|
+
See [Omniauth](https://github.com/intridea/omniauth) for setting up omniauth.
|
24
19
|
|
25
|
-
|
20
|
+
```ruby
|
21
|
+
# config/initializers/applicaster.rb
|
26
22
|
|
27
|
-
|
23
|
+
Applicaster::Accounts.configure do |config|
|
24
|
+
config.client_id = "my-service-uid"
|
25
|
+
config.client_secret = "my-service-secret"
|
28
26
|
|
29
|
-
|
27
|
+
#use local accounts service with Pow when in development
|
28
|
+
config.base_url = "http://accounts2.dev/" if Rails.env.development?
|
29
|
+
end
|
30
|
+
```
|
30
31
|
|
31
32
|
```ruby
|
32
|
-
|
33
|
-
ENV["ACCOUNTS_CLIENT_SECRET"] = "my-service-secret"
|
33
|
+
# config/initializers/omniauth.rb
|
34
34
|
|
35
35
|
Rails.application.config.middleware.use OmniAuth::Builder do
|
36
|
-
provider :applicaster
|
37
|
-
ENV["ACCOUNTS_CLIENT_ID"],
|
38
|
-
ENV["ACCOUNTS_CLIENT_SECRET"]
|
36
|
+
provider :applicaster
|
39
37
|
end
|
40
38
|
```
|
41
39
|
|
@@ -67,6 +65,21 @@ MyApp::Application.routes.draw do
|
|
67
65
|
end
|
68
66
|
```
|
69
67
|
|
68
|
+
### Configuration
|
69
|
+
|
70
|
+
For the possible configuration options please see
|
71
|
+
[Applicaster::Accounts::Configuration](lib/applicaster/accounts/configuration.rb)
|
72
|
+
|
73
|
+
If not provided via the configuration block, the OAuth client ID and client
|
74
|
+
secret are read from the environment variables `ACCOUNTS_CLIENT_ID` and
|
75
|
+
`ACCOUNTS_CLIENT_SECRET` respectivly.
|
76
|
+
|
77
|
+
The gem uses `https://accounts2.applicaster.com` as the site's endpoint by
|
78
|
+
default to change this use the `base_url` config option or set the
|
79
|
+
`ACCOUNTS_BASE_URL` environment variable. This is useful for example when
|
80
|
+
running a local version of the accounts service
|
81
|
+
|
82
|
+
|
70
83
|
### Accounts SDK
|
71
84
|
|
72
85
|
#### List all available accounts
|
@@ -83,7 +96,7 @@ end
|
|
83
96
|
|
84
97
|
```ruby
|
85
98
|
user = Applicaster::Accounts.user_from_token(access_token)
|
86
|
-
# user is an Applicaster::Accounts::User
|
99
|
+
# user is an Applicaster::Accounts::User instance
|
87
100
|
```
|
88
101
|
|
89
102
|
## Contributing
|
data/lib/applicaster/accounts.rb
CHANGED
@@ -6,37 +6,33 @@ module Applicaster
|
|
6
6
|
class Accounts
|
7
7
|
autoload :Account, "applicaster/accounts/account"
|
8
8
|
autoload :User, "applicaster/accounts/user"
|
9
|
+
autoload :Configuration, "applicaster/accounts/configuration"
|
9
10
|
|
10
11
|
RETRYABLE_STATUS_CODES = [500, 503, 502]
|
11
|
-
FARADAY_TIMEOUT = 0.5
|
12
|
-
|
13
|
-
attr_accessor :client_id
|
14
|
-
attr_accessor :client_secret
|
15
12
|
|
16
13
|
class << self
|
17
|
-
def default_site
|
18
|
-
"https://accounts2.applicaster.com"
|
19
|
-
end
|
20
|
-
|
21
|
-
def site
|
22
|
-
URI.parse(ENV["ACCOUNTS_BASE_URL"] || default_site)
|
23
|
-
end
|
24
|
-
|
25
14
|
def connection(options = {})
|
26
|
-
|
15
|
+
conn_opts = {
|
16
|
+
url: config.base_url,
|
17
|
+
request: { timeout: config.timeout }
|
18
|
+
}
|
19
|
+
|
20
|
+
Faraday.new(conn_opts) do |conn|
|
27
21
|
if options[:token]
|
28
22
|
conn.request :oauth2, options[:token]
|
29
23
|
end
|
30
24
|
|
31
25
|
conn.request :json
|
32
26
|
conn.request :retry,
|
27
|
+
max: config.retries,
|
33
28
|
interval: 0.05,
|
34
29
|
backoff_factor: 2,
|
35
30
|
exceptions: [Faraday::ClientError, Faraday::TimeoutError],
|
36
31
|
methods: [],
|
37
32
|
retry_if: -> (env, exception) {
|
38
33
|
env[:method] == :get &&
|
39
|
-
|
34
|
+
(exception.is_a?(Faraday::TimeoutError) ||
|
35
|
+
RETRYABLE_STATUS_CODES.include?(env[:status]))
|
40
36
|
}
|
41
37
|
|
42
38
|
|
@@ -59,14 +55,26 @@ module Applicaster
|
|
59
55
|
if e.response[:status] == 401
|
60
56
|
nil
|
61
57
|
else
|
62
|
-
raise
|
58
|
+
raise
|
63
59
|
end
|
64
60
|
end
|
65
|
-
end
|
66
61
|
|
67
|
-
|
68
|
-
|
69
|
-
|
62
|
+
def config
|
63
|
+
@config ||= Configuration.new
|
64
|
+
end
|
65
|
+
|
66
|
+
def configure
|
67
|
+
yield config
|
68
|
+
end
|
69
|
+
|
70
|
+
def oauth_client(config = config)
|
71
|
+
::OAuth2::Client.new(
|
72
|
+
config.client_id,
|
73
|
+
config.client_secret,
|
74
|
+
site: config.base_url,
|
75
|
+
authorize_url: "/oauth/authorize",
|
76
|
+
)
|
77
|
+
end
|
70
78
|
end
|
71
79
|
|
72
80
|
def user_data_from_omniauth(omniauth_credentials)
|
@@ -87,24 +95,9 @@ module Applicaster
|
|
87
95
|
protected
|
88
96
|
|
89
97
|
def client_credentials_token
|
90
|
-
@client_credentials_token ||=
|
91
|
-
|
92
|
-
|
93
|
-
def client
|
94
|
-
@client ||= ::OAuth2::Client.new(
|
95
|
-
client_id,
|
96
|
-
client_secret,
|
97
|
-
site: Applicaster::Accounts.site,
|
98
|
-
authorize_url: "/oauth/authorize",
|
99
|
-
)
|
100
|
-
end
|
101
|
-
|
102
|
-
def access_token(omniauth_credentials)
|
103
|
-
@access_token ||= OAuth2::AccessToken.new(
|
104
|
-
client,
|
105
|
-
omniauth_credentials["token"],
|
106
|
-
omniauth_credentials.except("token", "expires"),
|
107
|
-
)
|
98
|
+
@client_credentials_token ||= self.class.oauth_client
|
99
|
+
.client_credentials
|
100
|
+
.get_token
|
108
101
|
end
|
109
102
|
end
|
110
103
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Applicaster
|
2
|
+
class Accounts
|
3
|
+
class Configuration
|
4
|
+
include Virtus.model
|
5
|
+
|
6
|
+
# The base URL of the accounts service
|
7
|
+
attribute :base_url, String,
|
8
|
+
default: :default_base_url
|
9
|
+
|
10
|
+
# OAuth2 provider client ID
|
11
|
+
attribute :client_id, String,
|
12
|
+
default: proc { ENV["ACCOUNTS_CLIENT_ID"] }
|
13
|
+
|
14
|
+
# OAuth2 provider client secret
|
15
|
+
attribute :client_secret, String,
|
16
|
+
default: proc { ENV["ACCOUNTS_CLIENT_SECRET"] }
|
17
|
+
|
18
|
+
# Number of times to retry safe requests
|
19
|
+
attribute :retries, Integer,
|
20
|
+
default: 2
|
21
|
+
|
22
|
+
# Number of seconds before a request will be timed out
|
23
|
+
attribute :timeout, Float,
|
24
|
+
default: 1
|
25
|
+
|
26
|
+
|
27
|
+
def default_base_url
|
28
|
+
ENV["ACCOUNTS_BASE_URL"] || "https://accounts2.applicaster.com/"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -24,12 +24,7 @@ module OmniAuth
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def client
|
27
|
-
::
|
28
|
-
options.client_id,
|
29
|
-
options.client_secret,
|
30
|
-
site: ::Applicaster::Accounts.site,
|
31
|
-
authorize_url: "/oauth/authorize",
|
32
|
-
)
|
27
|
+
::Applicaster::Accounts.oauth_client
|
33
28
|
end
|
34
29
|
end
|
35
30
|
end
|
@@ -5,7 +5,7 @@ require 'omniauth-applicaster/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "omniauth-applicaster"
|
8
|
-
spec.version =
|
8
|
+
spec.version = OmniAuth::Applicaster::VERSION
|
9
9
|
spec.authors = ["Neer Friedman"]
|
10
10
|
spec.email = ["neerfri@gmail.com"]
|
11
11
|
spec.summary = %q{Omniauth strategy for http://accounts.applicaster.com}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
RSpec.describe Applicaster::Accounts::Configuration do
|
2
|
+
let(:config) { described_class.new }
|
3
|
+
|
4
|
+
specify "defaults" do
|
5
|
+
expect(config.attributes).to eq({
|
6
|
+
base_url: "https://accounts2.applicaster.com/",
|
7
|
+
client_id: nil,
|
8
|
+
client_secret: nil,
|
9
|
+
retries: 2,
|
10
|
+
timeout: 1.0,
|
11
|
+
})
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#base_url" do
|
15
|
+
it "defaults to env var ACCOUNTS_BASE_URL" do
|
16
|
+
base_url = "http://example.com"
|
17
|
+
|
18
|
+
with_env_var("ACCOUNTS_BASE_URL", base_url) do
|
19
|
+
expect(config.base_url).to eq(base_url)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#client_id" do
|
25
|
+
it "defaults to env var ACCOUNTS_CLIENT_ID" do
|
26
|
+
with_env_var("ACCOUNTS_CLIENT_ID", "test-client-id") do
|
27
|
+
expect(config.client_id).to eq("test-client-id")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#client_secret" do
|
33
|
+
it "defaults to env var ACCOUNTS_CLIENT_SECRET" do
|
34
|
+
with_env_var("ACCOUNTS_CLIENT_SECRET", "test-client-secret") do
|
35
|
+
expect(config.client_secret).to eq("test-client-secret")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -7,32 +7,6 @@ RSpec.describe Applicaster::Accounts do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
describe ".site" do
|
11
|
-
it "returns a URI object" do
|
12
|
-
expect(return_value).to be_kind_of(URI)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "returns https://accounts2.applicaster.com" do
|
16
|
-
expect(return_value.to_s).to eq("https://accounts2.applicaster.com")
|
17
|
-
end
|
18
|
-
|
19
|
-
context "when ACCOUNTS_BASE_URL is set" do
|
20
|
-
around do |example|
|
21
|
-
with_base_url("http://example.com") do
|
22
|
-
example.run
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it "returns http://example.com" do
|
27
|
-
expect(return_value.to_s).to eq("http://example.com")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def return_value
|
32
|
-
Applicaster::Accounts.site
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
10
|
describe ".connection" do
|
37
11
|
let(:remote_url) { "https://accounts2.applicaster.com/test.json" }
|
38
12
|
let(:request_stub) { stub_request(:get, remote_url) }
|
@@ -63,22 +37,29 @@ RSpec.describe Applicaster::Accounts do
|
|
63
37
|
end
|
64
38
|
|
65
39
|
context "when server is not responding" do
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
example.run
|
70
|
-
WebMock.disable_net_connect!
|
71
|
-
end
|
72
|
-
end
|
40
|
+
let(:timeout) { 0.1 }
|
41
|
+
let(:retries) { 1 }
|
42
|
+
let(:max_exec_time) { 1 + timeout + (timeout + 0.05) * retries }
|
73
43
|
|
74
44
|
before do
|
75
45
|
@server = TCPServer.new(6969)
|
46
|
+
|
47
|
+
Applicaster::Accounts.configure do |config|
|
48
|
+
config.base_url = "http://localhost:6969"
|
49
|
+
config.timeout = timeout
|
50
|
+
config.retries = retries
|
51
|
+
end
|
76
52
|
end
|
77
53
|
|
78
|
-
it "times out after 0.
|
79
|
-
|
80
|
-
|
81
|
-
|
54
|
+
it "times out after 0.1 second with 1 retry" do
|
55
|
+
disable_webmock do
|
56
|
+
expect {
|
57
|
+
begin
|
58
|
+
connection.get("/test.json")
|
59
|
+
rescue Faraday::TimeoutError
|
60
|
+
end
|
61
|
+
}.to change { Time.now }.by(a_value < max_exec_time)
|
62
|
+
end
|
82
63
|
end
|
83
64
|
end
|
84
65
|
|
@@ -111,17 +92,27 @@ RSpec.describe Applicaster::Accounts do
|
|
111
92
|
end
|
112
93
|
end
|
113
94
|
|
114
|
-
describe "
|
115
|
-
it "
|
116
|
-
|
95
|
+
describe ".config" do
|
96
|
+
it "returns an Applicaster::Accounts::Configuration" do
|
97
|
+
expect(config).to be_kind_of(Applicaster::Accounts::Configuration)
|
98
|
+
end
|
117
99
|
|
118
|
-
|
119
|
-
|
100
|
+
def config
|
101
|
+
Applicaster::Accounts.config
|
120
102
|
end
|
103
|
+
end
|
121
104
|
|
122
|
-
|
123
|
-
|
124
|
-
expect(
|
105
|
+
describe ".configure" do
|
106
|
+
it "yields with Applicaster::Accounts.config" do
|
107
|
+
expect { |b| configure(&b) }.to yield_with_args(config)
|
108
|
+
end
|
109
|
+
|
110
|
+
def configure(&block)
|
111
|
+
Applicaster::Accounts.configure(&block)
|
112
|
+
end
|
113
|
+
|
114
|
+
def config
|
115
|
+
Applicaster::Accounts.config
|
125
116
|
end
|
126
117
|
end
|
127
118
|
|
@@ -160,10 +151,4 @@ RSpec.describe Applicaster::Accounts do
|
|
160
151
|
]
|
161
152
|
end
|
162
153
|
end
|
163
|
-
|
164
|
-
def with_base_url(url)
|
165
|
-
value_bofre, ENV["ACCOUNTS_BASE_URL"] = ENV["ACCOUNTS_BASE_URL"], url
|
166
|
-
yield
|
167
|
-
ENV["ACCOUNTS_BASE_URL"] = value_bofre
|
168
|
-
end
|
169
154
|
end
|
@@ -3,8 +3,14 @@ module WebmockStubsHelper
|
|
3
3
|
config.include self
|
4
4
|
end
|
5
5
|
|
6
|
+
def disable_webmock
|
7
|
+
WebMock.allow_net_connect!
|
8
|
+
yield
|
9
|
+
WebMock.disable_net_connect!
|
10
|
+
end
|
11
|
+
|
6
12
|
def stub_client_credentials_request
|
7
|
-
stub_request(:post, "https://
|
13
|
+
stub_request(:post, "https://client-id:client-secret@#{accounts_host}/oauth/token")
|
8
14
|
.with(:body => {"grant_type"=>"client_credentials"})
|
9
15
|
.to_return(successful_json_response(access_token: "client-credentials-token"))
|
10
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-applicaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neer Friedman
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- Rakefile
|
138
138
|
- lib/applicaster/accounts.rb
|
139
139
|
- lib/applicaster/accounts/account.rb
|
140
|
+
- lib/applicaster/accounts/configuration.rb
|
140
141
|
- lib/applicaster/accounts/user.rb
|
141
142
|
- lib/applicaster/auth_helpers.rb
|
142
143
|
- lib/applicaster/sessions_controller_mixin.rb
|
@@ -145,11 +146,13 @@ files:
|
|
145
146
|
- lib/omniauth/strategies/applicaster.rb
|
146
147
|
- omniauth-applicaster.gemspec
|
147
148
|
- spec/lib/applicaster/accounts/account_spec.rb
|
149
|
+
- spec/lib/applicaster/accounts/configuration_spec.rb
|
148
150
|
- spec/lib/applicaster/accounts_spec.rb
|
149
151
|
- spec/lib/applicaster/auth_helpers_spec.rb
|
150
152
|
- spec/spec_helper.rb
|
151
153
|
- spec/support/dummy_controller.rb
|
152
|
-
- spec/support/
|
154
|
+
- spec/support/env_variable_helper.rb
|
155
|
+
- spec/support/set_test_configuration.rb
|
153
156
|
- spec/support/webmock_stubs_helper.rb
|
154
157
|
homepage: ''
|
155
158
|
licenses:
|
@@ -177,9 +180,11 @@ specification_version: 4
|
|
177
180
|
summary: Omniauth strategy for http://accounts.applicaster.com
|
178
181
|
test_files:
|
179
182
|
- spec/lib/applicaster/accounts/account_spec.rb
|
183
|
+
- spec/lib/applicaster/accounts/configuration_spec.rb
|
180
184
|
- spec/lib/applicaster/accounts_spec.rb
|
181
185
|
- spec/lib/applicaster/auth_helpers_spec.rb
|
182
186
|
- spec/spec_helper.rb
|
183
187
|
- spec/support/dummy_controller.rb
|
184
|
-
- spec/support/
|
188
|
+
- spec/support/env_variable_helper.rb
|
189
|
+
- spec/support/set_test_configuration.rb
|
185
190
|
- spec/support/webmock_stubs_helper.rb
|