forked from kyledrake/geoloqi-ruby
-
Notifications
You must be signed in to change notification settings - Fork 4
/
session.rb
123 lines (100 loc) · 3.74 KB
/
session.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
module Geoloqi
class Session
attr_reader :auth
attr_accessor :config
def initialize(opts={})
opts[:config] = Geoloqi::Config.new opts[:config] if opts[:config].is_a? Hash
@config = opts[:config] || (Geoloqi.config || Geoloqi::Config.new)
self.auth = opts[:auth] || {}
self.auth[:access_token] = opts[:access_token] if opts[:access_token]
@connection = Faraday.new(:url => API_URL) do |builder|
builder.response :logger if @config.enable_logging
builder.adapter @config.adapter || :net_http
end
end
def auth=(hash)
@auth = hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
end
def access_token
@auth[:access_token]
end
def access_token?
!access_token.nil?
end
def authorize_url(redirect_uri)
Geoloqi.authorize_url @config.client_id, redirect_uri
end
def get(path)
run :get, path
end
def post(path, body=nil)
run :post, path, body
end
def run(meth, path, body=nil)
renew_access_token! if auth[:expires_at] && auth[:expires_at] <= Time.now
body = body.to_json if [Hash, Array].include? body.class
retry_attempt = 0
begin
response = @connection.send(meth) do |req|
req.url "/#{API_VERSION.to_s}/#{path.gsub(/^\//, '')}"
req.headers = headers
req.body = body if body
end
json = JSON.parse response.body
raise ApiError.new(json['error'], json['error_description']) if json.is_a?(Hash) && json['error']
rescue Geoloqi::ApiError
raise Error.new('Unable to procure fresh access token from API on second attempt') if retry_attempt > 0
if json['error'] == 'expired_token'
retry_attempt += 1
retry
else
fail
end
end
json
end
# TODO: DRY and refactor
def renew_access_token!
require 'client_id and client_secret are required to get access token' unless @config.client_id? && @config.client_secret?
args = {:client_id => @config.client_id,
:client_secret => @config.client_secret,
:grant_type => 'refresh_token',
:refresh_token => auth[:refresh_token]}
response = @connection.post do |req|
req.url "/#{API_VERSION.to_s}/oauth/token"
req.headers = headers false
req.body = args.to_json
end
auth = JSON.parse response.body
# expires_at is likely incorrect. I'm chopping 5 seconds
# off to allow for a more graceful failover.
auth['expires_at'] = (Time.now + @expires_in.to_i)-5
self.auth = JSON.parse response.body
self.auth
end
def get_auth(code, redirect_uri)
require 'client_id and client_secret are required to get access token' unless @config.client_id? && @config.client_secret?
args = {:client_id => @config.client_id,
:client_secret => @config.client_secret,
:code => code,
:grant_type => 'authorization_code',
:redirect_uri => redirect_uri}
response = @connection.post do |req|
req.url "/#{API_VERSION.to_s}/oauth/token"
req.headers = headers false
req.body = args.to_json
end
auth = JSON.parse response.body
# expires_at is likely incorrect. I'm chopping 5 seconds
# off to allow for a more graceful failover.
auth['expires_at'] = (Time.now + @expires_in.to_i)-5
self.auth = JSON.parse response.body
self.auth
end
def headers(with_oauth=true)
headers = {'Content-Type' => 'application/json', 'User-Agent' => "geoloqi-ruby #{Geoloqi::VERSION}", 'Accept' => 'application/json'}
headers['Authorization'] = "OAuth #{access_token}" if with_oauth
headers
end
end
end