omniauth-applicaster 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/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
|