flexmls_api 0.7.3 → 0.7.5
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/flexmls_api/authentication/oauth2.rb +16 -3
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_base.rb +3 -1
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_code.rb +3 -2
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_password.rb +1 -1
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_refresh.rb +1 -1
- data/lib/flexmls_api/authentication/oauth2_impl/middleware.rb +3 -3
- data/spec/unit/flexmls_api/authentication/oauth2_spec.rb +17 -1
- data/spec/unit/flexmls_api/configuration/yaml_spec.rb +1 -1
- metadata +5 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.5
|
@@ -87,19 +87,32 @@ module FlexmlsApi
|
|
87
87
|
|
88
88
|
# Representation of a session with the api using oauth2
|
89
89
|
class OAuthSession
|
90
|
-
|
90
|
+
SESSION_ATTRIBUTES = [:access_token, :expires_in, :scope, :refresh_token, :refresh_timeout, :start_time]
|
91
|
+
attr_accessor *SESSION_ATTRIBUTES
|
91
92
|
def initialize(options={})
|
92
93
|
@access_token = options["access_token"]
|
93
94
|
@expires_in = options["expires_in"]
|
94
95
|
@scope = options["scope"]
|
95
96
|
@refresh_token = options["refresh_token"]
|
96
|
-
@start_time = DateTime.now
|
97
|
-
@refresh_timeout = 3600
|
97
|
+
@start_time = options.fetch("start_time", DateTime.now)
|
98
|
+
@refresh_timeout = options.fetch("refresh_timeout",3600)
|
99
|
+
if @start_time.is_a? String
|
100
|
+
@start_time = DateTime.parse(@start_time)
|
101
|
+
end
|
98
102
|
end
|
99
103
|
# Is the user session token expired?
|
100
104
|
def expired?
|
101
105
|
@start_time + Rational(@expires_in - @refresh_timeout, 86400) < DateTime.now
|
102
106
|
end
|
107
|
+
|
108
|
+
def to_json(*a)
|
109
|
+
hash = {}
|
110
|
+
SESSION_ATTRIBUTES.each do |k|
|
111
|
+
value = self.send(k)
|
112
|
+
hash[k.to_s] = value unless value.nil?
|
113
|
+
end
|
114
|
+
hash.to_json(*a)
|
115
|
+
end
|
103
116
|
end
|
104
117
|
|
105
118
|
#=OAuth2 configuration provider for applications
|
@@ -17,6 +17,7 @@ module FlexmlsApi
|
|
17
17
|
else
|
18
18
|
raise ClientError, "Unsupported grant type [#{provider.grant_type}]"
|
19
19
|
end
|
20
|
+
FlexmlsApi.logger.debug("[oauth2] setup #{granter.class.name}")
|
20
21
|
granter
|
21
22
|
end
|
22
23
|
|
@@ -37,11 +38,12 @@ module FlexmlsApi
|
|
37
38
|
protected
|
38
39
|
|
39
40
|
def create_session(token_params)
|
40
|
-
FlexmlsApi.logger.debug("
|
41
|
+
FlexmlsApi.logger.debug("[oauth2] create_session to #{provider.access_uri} params #{token_params}")
|
41
42
|
uri = URI.parse(provider.access_uri)
|
42
43
|
request_path = "#{uri.path}"
|
43
44
|
response = oauth_access_connection("#{uri.scheme}://#{uri.host}").post(request_path, "#{token_params}").body
|
44
45
|
response.expires_in = provider.session_timeout if response.expires_in.nil?
|
46
|
+
FlexmlsApi.logger.debug("[oauth2] New session created #{response}")
|
45
47
|
response
|
46
48
|
end
|
47
49
|
|
@@ -11,7 +11,7 @@ module FlexmlsApi
|
|
11
11
|
end
|
12
12
|
def authenticate
|
13
13
|
if(provider.code.nil?)
|
14
|
-
FlexmlsApi.logger.debug("
|
14
|
+
FlexmlsApi.logger.debug("[oauth2] No authoriztion code present. Redirecting to #{authorization_url}.")
|
15
15
|
provider.redirect(authorization_url)
|
16
16
|
end
|
17
17
|
if needs_refreshing?
|
@@ -22,11 +22,12 @@ module FlexmlsApi
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def refresh()
|
25
|
+
FlexmlsApi.logger.debug("[oauth2] Refresh oauth session.")
|
25
26
|
refresher = GrantTypeRefresh.new(client,provider,session)
|
26
27
|
refresher.params = {"redirect_uri" => @provider.redirect_uri}
|
27
28
|
refresher.authenticate
|
28
29
|
rescue ClientError => e
|
29
|
-
FlexmlsApi.logger.info("Refreshing token failed, the library will try and authenticate from scratch: #{e.message}")
|
30
|
+
FlexmlsApi.logger.info("[oauth2] Refreshing token failed, the library will try and authenticate from scratch: #{e.message}")
|
30
31
|
nil
|
31
32
|
end
|
32
33
|
|
@@ -21,7 +21,7 @@ module FlexmlsApi
|
|
21
21
|
def refresh()
|
22
22
|
GrantTypeRefresh.new(client,provider,session).authenticate
|
23
23
|
rescue ClientError => e
|
24
|
-
FlexmlsApi.logger.info("Refreshing token failed, the library will try and authenticate from scratch: #{e.message}")
|
24
|
+
FlexmlsApi.logger.info("[oauth2] Refreshing token failed, the library will try and authenticate from scratch: #{e.message}")
|
25
25
|
nil
|
26
26
|
end
|
27
27
|
|
@@ -13,7 +13,7 @@ module FlexmlsApi
|
|
13
13
|
def authenticate
|
14
14
|
new_session = nil
|
15
15
|
unless @session.refresh_token.nil?
|
16
|
-
FlexmlsApi.logger.debug("Refreshing authentication to #{provider.access_uri} using [#{session.refresh_token}]")
|
16
|
+
FlexmlsApi.logger.debug("[oauth2] Refreshing authentication to #{provider.access_uri} using [#{session.refresh_token}]")
|
17
17
|
new_session = create_session(token_params)
|
18
18
|
end
|
19
19
|
new_session
|
@@ -10,13 +10,13 @@ module FlexmlsApi
|
|
10
10
|
class Middleware < Faraday::Response::ParseJson
|
11
11
|
def on_complete(finished_env)
|
12
12
|
body = parse(finished_env[:body])
|
13
|
-
FlexmlsApi.logger.debug("Response Body: #{body.inspect}")
|
13
|
+
FlexmlsApi.logger.debug("[oauth2] Response Body: #{body.inspect}")
|
14
14
|
unless body.is_a?(Hash)
|
15
15
|
raise InvalidResponse, "The server response could not be understood"
|
16
16
|
end
|
17
17
|
case finished_env[:status]
|
18
18
|
when 200..299
|
19
|
-
FlexmlsApi.logger.debug("Success!")
|
19
|
+
FlexmlsApi.logger.debug("[oauth2] Success!")
|
20
20
|
session = OAuthSession.new(body)
|
21
21
|
else
|
22
22
|
# Handle the WWW-Authenticate Response Header Field if present. This can be returned by
|
@@ -25,7 +25,7 @@ module FlexmlsApi
|
|
25
25
|
FlexmlsApi.logger.warn("Authentication error #{auth_header_error}") unless auth_header_error.nil?
|
26
26
|
raise ClientError, {:message => body["error"], :code =>0, :status => finished_env[:status]}
|
27
27
|
end
|
28
|
-
FlexmlsApi.logger.debug("Session
|
28
|
+
FlexmlsApi.logger.debug("[oauth2] Session=#{session.inspect}")
|
29
29
|
finished_env[:body] = session
|
30
30
|
end
|
31
31
|
|
@@ -186,4 +186,20 @@ describe FlexmlsApi::Authentication::OAuth2Impl do
|
|
186
186
|
expect{FlexmlsApi::Authentication::OAuth2Impl.load_provider(bad_example,{}).class.to_s.should eq(bad_example)}.to raise_error(ArgumentError)
|
187
187
|
end
|
188
188
|
|
189
|
-
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe FlexmlsApi::Authentication::OAuthSession do
|
192
|
+
it "should serialize to json" do
|
193
|
+
args = {
|
194
|
+
"access_token" => "abc",
|
195
|
+
"expires_in" => 3600,
|
196
|
+
"refresh_token" => "123",
|
197
|
+
"refresh_timeout" => 10000,
|
198
|
+
"start_time" => "2012-01-01T00:00:00+00:00"
|
199
|
+
}
|
200
|
+
session = FlexmlsApi::Authentication::OAuthSession.new(args)
|
201
|
+
session.start_time.should eq(DateTime.parse(args["start_time"]))
|
202
|
+
JSON.parse(session.to_json).should eq(args)
|
203
|
+
|
204
|
+
end
|
205
|
+
end
|
@@ -46,7 +46,7 @@ describe FlexmlsApi::Configuration::YamlConfig, "Yaml Config" do
|
|
46
46
|
subject.endpoint.should eq("http://api.dev.flexmls.com")
|
47
47
|
subject.oauth2_provider.should eq("FlexmlsApi::TestOAuth2Provider")
|
48
48
|
subject.name.should eq("test_oauth")
|
49
|
-
subject.client_keys.keys.should
|
49
|
+
subject.client_keys.keys.should =~ [:endpoint, :oauth2_provider]
|
50
50
|
subject.oauth2_keys.keys.should =~ [:authorization_uri, :client_id, :access_uri, :client_secret, :redirect_uri]
|
51
51
|
end
|
52
52
|
it "should load a configured api key for production" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flexmls_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
9
|
+
- 5
|
10
|
+
version: 0.7.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Brandon Hornseth
|
@@ -72,12 +72,11 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
hash:
|
75
|
+
hash: 5
|
76
76
|
segments:
|
77
77
|
- 1
|
78
78
|
- 5
|
79
|
-
|
80
|
-
version: 1.5.1
|
79
|
+
version: "1.5"
|
81
80
|
requirement: *id004
|
82
81
|
prerelease: false
|
83
82
|
name: json
|