config_server_agent 0.3.3 → 0.3.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 344ef40b40e8878b43c97010628fdc601e7cf743486105211c3ccf04d4a06c08
4
- data.tar.gz: 24fcc8fd7e0316ce8bada8f5e7b51f5726fc38ea6ea953f900b38bc5b510d4e0
3
+ metadata.gz: 14de15ba41b3745d5e2bb54a29534d0a47aa58af4d5c029b2b9b611eec62865f
4
+ data.tar.gz: 9f45eb09fa4ee9d0b3b4c9d12e374b42e65350502cf5d4c27cbcbe95fff92cdd
5
5
  SHA512:
6
- metadata.gz: 9b1eb8afd72531182a10cdd6db766ba94373fc0480283496a4575509e76cc42345d3c79d55f88eee83ac94a9cad25a329812d4e651b2e6c76a2ac57c273a289b
7
- data.tar.gz: abf76b59135ce2368366c0a817741b22f8876451b19d7800eba97178cd90e39496c2ad1ae9cfe854ff2e88782b4a3a4c29513870ebea9b7415c0f9b68a03d8c5
6
+ metadata.gz: d5c12f02a2b353c43b38a62823c08b9f94ad138346544b660d127d5ec5bb1b40024c0e2e1ba8b9d942ff0ad95da85992605847cd1ed0a8ca73581dccccb56327
7
+ data.tar.gz: 9d47199e4a9df1f295bfd29c598cd9fc8c5f4d8b701251378744198107e6dbd4a34a12d47406bc37142c7415b97659413e5afae2762172ad7ae7fdb9a5165dd2
data/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 0.3.4 - 2019-06-12
8
+ ### Changed
9
+ - Added optional token caching
10
+
7
11
  ## 0.3.3 - 2019-06-03
8
12
  ### Changed
9
13
  - Added get_selected_config helper method
@@ -44,6 +44,8 @@ Gem::Specification.new do |spec|
44
44
 
45
45
  spec.required_ruby_version = '>= 2.3.0'
46
46
 
47
+ spec.add_dependency 'lockfile', '~> 2.1'
48
+
47
49
  spec.add_development_dependency 'bundler', '~> 1.17'
48
50
  spec.add_development_dependency 'rake', '~> 10.0'
49
51
  spec.add_development_dependency 'minitest', '~> 5.0'
@@ -1,3 +1,3 @@
1
1
  class ConfigServerAgent
2
- VERSION = "0.3.3"
2
+ VERSION = '0.3.4'
3
3
  end
@@ -3,6 +3,8 @@
3
3
  require 'config_server_agent/version'
4
4
  require 'net/http'
5
5
  require 'json'
6
+ require 'digest/sha1'
7
+ require 'lockfile'
6
8
 
7
9
  class ConfigServerAgent
8
10
  class Error < StandardError; end
@@ -16,7 +18,9 @@ class ConfigServerAgent
16
18
  config_server_host: ENV['CONFIG_SERVER_HOST'],
17
19
  user_agent: "ConfigServerAgent/#{ConfigServerAgent::VERSION}",
18
20
  user_agent_comment: nil,
19
- token_ttl: 60 * 60 * 24
21
+ token_ttl: nil,
22
+ use_cache: false,
23
+ cache_file: nil
20
24
  )
21
25
  @auth0_client_id = auth0_client_id or raise ArgumentError, 'Missing auth0_client_id parameter'
22
26
  @auth0_client_secret = auth0_client_secret or raise ArgumentError, 'Missing auth0_client_secret parameter'
@@ -30,9 +34,13 @@ class ConfigServerAgent
30
34
  @user_agent = user_agent
31
35
  @user_agent += " (#{user_agent_comment})" if user_agent_comment
32
36
 
33
- @token_birthday = nil
34
- @token = nil
35
- @token_ttl = token_ttl
37
+ @token_expires = nil
38
+ @token = nil
39
+ @token_ttl = token_ttl
40
+ @token_buffer = 10
41
+
42
+ @use_cache = use_cache
43
+ @cache_file = cache_file || '/tmp/' + Digest::SHA1.hexdigest("#{auth0_client_id}/#{ConfigServerAgent::VERSION}") + '.json'
36
44
  end
37
45
 
38
46
  def get_config
@@ -107,30 +115,62 @@ class ConfigServerAgent
107
115
  end
108
116
 
109
117
  def get_token
110
- if @token.nil? or @token_timestamp.nil? or @token_timestamp <= Time.now.to_i
111
- url = URI "https://#{@auth0_host}/oauth/token"
112
- http = Net::HTTP.new url.host, url.port
113
- http.use_ssl = url.scheme == 'https'
114
-
115
- request = Net::HTTP::Post.new url
116
- request['user-agent'] = @user_agent
117
- request['content-type'] = 'application/json'
118
- request.body = {
119
- client_id: @auth0_client_id,
120
- client_secret: @auth0_client_secret,
121
- audience: @config_server_audience,
122
- grant_type: 'client_credentials',
123
- }.to_json
124
-
125
- response = http.request request
126
- @token = JSON.parse(response.read_body)["access_token"] or raise Error, "No token from #{@auth0_host}"
127
- @token_timestamp = Time.now.to_i + @token_ttl
118
+ if @token.nil? and @use_cache
119
+ read_token_cache
120
+ end
121
+
122
+ if @token.nil? or (@token_expires and @token_expires < Time.now.to_i)
123
+ request_new_token
124
+ write_token_cache if @use_cache
128
125
  end
129
126
 
127
+ @token
128
+ end
129
+
130
+ def request_new_token
131
+ url = URI "https://#{@auth0_host}/oauth/token"
132
+ http = Net::HTTP.new url.host, url.port
133
+ http.use_ssl = url.scheme == 'https'
134
+
135
+ request = Net::HTTP::Post.new url
136
+ request['user-agent'] = @user_agent
137
+ request['content-type'] = 'application/json'
138
+ request.body = {
139
+ client_id: @auth0_client_id,
140
+ client_secret: @auth0_client_secret,
141
+ audience: @config_server_audience,
142
+ grant_type: 'client_credentials',
143
+ }.to_json
144
+
145
+ response = JSON.parse http.request(request).read_body
146
+ @token = response['access_token'] or raise Error, "No token from #{@auth0_host}"
147
+ @token_expires = Time.now.to_i + (@token_ttl || response['expires_in']) - @token_buffer
148
+
130
149
  @token
131
150
 
132
151
  rescue JSON::ParserError
133
152
  raise Error, "Invalid response from #{@auth0_host}"
134
153
  end
135
154
 
155
+ def read_token_cache
156
+ with_lock do
157
+ @token, @token_expires = JSON.parse(File.read @cache_file).values_at 'token', 'token_expires'
158
+ end if File.file? @cache_file
159
+ end
160
+
161
+ def write_token_cache
162
+ with_lock do
163
+ File.write(@cache_file, {
164
+ 'token' => @token,
165
+ 'token_expires' => @token_expires
166
+ }.to_json)
167
+ end
168
+ end
169
+
170
+ def with_lock
171
+ Lockfile.new("/var/lock/config_server_agent.rb.lock", retries: 3, poll_retries: 3) do
172
+ yield
173
+ end
174
+ end
175
+
136
176
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_server_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aidan Samuel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-03 00:00:00.000000000 Z
11
+ date: 2019-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lockfile
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement