mauth-client 4.0.1

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.
@@ -0,0 +1,23 @@
1
+ require 'mauth/core_ext'
2
+ module MAuth
3
+ # base class for middleware, common to both Faraday and Rack
4
+ class Middleware
5
+ def initialize(app, config = {})
6
+ @app = app
7
+ # stringify symbol keys
8
+ @config = config.stringify_symbol_keys
9
+ end
10
+
11
+ # returns a MAuth::Client - if one was given as 'mauth_client' when initializing the
12
+ # middleware, then that one; otherwise the configurationg given to initialize the
13
+ # middleware is passed along to make a new MAuth::Client.
14
+ #
15
+ # this method may be overloaded to provide more flexibility in providing a MAuth::Client
16
+ def mauth_client
17
+ require 'mauth/client'
18
+ # @_mauth_client ivar only used here for caching; should not be used by other methods, in
19
+ # order that overloading #mauth_client will work
20
+ @_mauth_client ||= @config['mauth_client'] || MAuth::Client.new(@config)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,77 @@
1
+ require 'mauth/client'
2
+ require 'faraday'
3
+ require 'rack'
4
+
5
+ module MAuth
6
+ # MAuth::Proxy is a simple Rack application to take incoming requests, sign them with MAuth, and
7
+ # proxy them to a target URI. the responses from the target may be authenticated, with MAuth
8
+ # (and are by default).
9
+ class Proxy
10
+ # target_uri is the base relative to which requests are made.
11
+ #
12
+ # options:
13
+ # - :authenticate_responses - boolean, default true. whether responses will be authenticated.
14
+ # if this is true and an inauthentic response is encountered, then MAuth::InauthenticError
15
+ # will be raised.
16
+ # - :mauth_config - configuration passed to MAuth::Client.new (see its doc). default is
17
+ # MAuth::Client.default_config
18
+ def initialize(target_uri, options = {})
19
+ @target_uris = target_uri
20
+ @browser_proxy = options.delete(:browser_proxy)
21
+ @options = options
22
+ options = { authenticate_responses: true }.merge(options)
23
+ options[:mauth_config] ||= MAuth::Client.default_config
24
+ if @browser_proxy # Browser proxy mode
25
+ @signer_connection = ::Faraday.new do |builder|
26
+ builder.use MAuth::Faraday::RequestSigner, options[:mauth_config]
27
+ builder.use MAuth::Faraday::ResponseAuthenticator, options[:mauth_config] if options[:authenticate_responses]
28
+ builder.adapter ::Faraday.default_adapter
29
+ end
30
+ @unsigned_connection = ::Faraday.new do |builder|
31
+ builder.adapter ::Faraday.default_adapter
32
+ end
33
+ else # hard-wired mode
34
+ @connection = ::Faraday.new(target_uri) do |builder|
35
+ builder.use MAuth::Faraday::RequestSigner, options[:mauth_config]
36
+ builder.use MAuth::Faraday::ResponseAuthenticator, options[:mauth_config] if options[:authenticate_responses]
37
+ builder.adapter ::Faraday.default_adapter
38
+ end
39
+ end
40
+ @persistent_headers = {}
41
+ if options[:headers]
42
+ options[:headers].each do |cur|
43
+ raise "Headers must be in the format of [key]:[value]" unless cur.include?(':')
44
+ key, throw_away, value = cur.partition(':')
45
+ @persistent_headers[key.strip] = value.strip
46
+ end
47
+ end
48
+ end
49
+
50
+ def call(request_env)
51
+ request = ::Rack::Request.new(request_env)
52
+ request_method = request_env['REQUEST_METHOD'].downcase.to_sym
53
+ request_env['rack.input'].rewind
54
+ request_body = request_env['rack.input'].read
55
+ request_env['rack.input'].rewind
56
+ request_headers = {}
57
+ request_env.each do |k, v|
58
+ if k.start_with?('HTTP_') && !%w(HTTP_HOST).include?(k)
59
+ name = $'
60
+ request_headers[name] = v
61
+ end
62
+ end
63
+ request_headers.merge!(@persistent_headers)
64
+ if @browser_proxy
65
+ target_uri = request_env["REQUEST_URI"]
66
+ connection = @target_uris.any? { |u| target_uri.start_with? u } ? @signer_connection : @unsigned_connection
67
+ response = connection.run_request(request_method, target_uri, request_body, request_headers)
68
+ else
69
+ response = @connection.run_request(request_method, request.fullpath, request_body, request_headers)
70
+ end
71
+ response_headers = response.headers.reject do |name, _value|
72
+ %w(Content-Length Transfer-Encoding).map(&:downcase).include?(name.downcase)
73
+ end
74
+ [response.status, response_headers, [response.body || '']]
75
+ end
76
+ end
77
+ end
data/lib/mauth/rack.rb ADDED
@@ -0,0 +1,137 @@
1
+ require 'mauth/middleware'
2
+ require 'mauth/request_and_response'
3
+ require 'rack/utils'
4
+
5
+ module MAuth
6
+ module Rack
7
+ # middleware which will check that a request is authentically signed.
8
+ #
9
+ # if the request is checked and is not authentic, 401 Unauthorized is returned
10
+ # and the app is not called.
11
+ #
12
+ # options accepted (key may be string or symbol)
13
+ # - should_authenticate_check: a proc which should accept a rack env as an argument,
14
+ # and return true if the request should be authenticated; false if not. if the result
15
+ # from this is false, the request is passed to the app with no authentication performed.
16
+ class RequestAuthenticator < MAuth::Middleware
17
+ def call(env)
18
+ if should_authenticate?(env)
19
+ mauth_request = MAuth::Rack::Request.new(env)
20
+ begin
21
+ if mauth_client.authentic?(mauth_request)
22
+ @app.call(env.merge('mauth.app_uuid' => mauth_request.signature_app_uuid, 'mauth.authentic' => true))
23
+ else
24
+ response_for_inauthentic_request(env)
25
+ end
26
+ rescue MAuth::UnableToAuthenticateError
27
+ response_for_unable_to_authenticate(env)
28
+ end
29
+ else
30
+ @app.call(env)
31
+ end
32
+ end
33
+
34
+ # discards the body if REQUEST_METHOD is HEAD. sets the Content-Length.
35
+ def handle_head(env)
36
+ status, headers, body = *yield
37
+ headers["Content-Length"] = body.map(&:bytesize).inject(0, &:+).to_s
38
+ [status, headers, env['REQUEST_METHOD'].casecmp('head').zero? ? [] : body]
39
+ end
40
+
41
+ # whether the request needs to be authenticated
42
+ def should_authenticate?(env)
43
+ @config['should_authenticate_check'] ? @config['should_authenticate_check'].call(env) : true
44
+ end
45
+
46
+ # response when the request is inauthentic. responds with status 401 Unauthorized and a
47
+ # message.
48
+ def response_for_inauthentic_request(env)
49
+ handle_head(env) do
50
+ body = { 'errors' => { 'mauth' => ['Unauthorized'] } }
51
+ [401, { 'Content-Type' => 'application/json' }, [JSON.pretty_generate(body)]]
52
+ end
53
+ end
54
+
55
+ # response when the authenticity of the request cannot be determined, due to
56
+ # a problem communicating with the MAuth service. responds with a status of 500 and
57
+ # a message.
58
+ def response_for_unable_to_authenticate(env)
59
+ handle_head(env) do
60
+ body = { 'errors' => { 'mauth' => ['Could not determine request authenticity'] } }
61
+ [500, { 'Content-Type' => 'application/json' }, [JSON.pretty_generate(body)]]
62
+ end
63
+ end
64
+ end
65
+
66
+ # same as MAuth::Rack::RequestAuthenticator, but does not authenticate /app_status
67
+ class RequestAuthenticatorNoAppStatus < RequestAuthenticator
68
+ def should_authenticate?(env)
69
+ env['PATH_INFO'] != "/app_status" && super
70
+ end
71
+ end
72
+
73
+ # signs outgoing responses
74
+ class ResponseSigner < MAuth::Middleware
75
+ def call(env)
76
+ unsigned_response = @app.call(env)
77
+ signed_response = mauth_client.signed(MAuth::Rack::Response.new(*unsigned_response))
78
+ signed_response.status_headers_body
79
+ end
80
+ end
81
+
82
+ # representation of a request composed from a rack request env which can be passed to a
83
+ # Mauth::Client for authentication
84
+ class Request < MAuth::Request
85
+ include Signed
86
+ attr_reader :env
87
+ def initialize(env)
88
+ @env = env
89
+ end
90
+
91
+ def attributes_for_signing
92
+ @attributes_for_signing ||= begin
93
+ env['rack.input'].rewind
94
+ body = env['rack.input'].read
95
+ env['rack.input'].rewind
96
+ { verb: env['REQUEST_METHOD'], request_url: env['PATH_INFO'], body: body }
97
+ end
98
+ end
99
+
100
+ def x_mws_time
101
+ @env['HTTP_X_MWS_TIME']
102
+ end
103
+
104
+ def x_mws_authentication
105
+ @env['HTTP_X_MWS_AUTHENTICATION']
106
+ end
107
+ end
108
+
109
+ # representation of a response composed from a rack response (status, headers, body) which
110
+ # can be passed to a Mauth::Client for signing
111
+ class Response < MAuth::Response
112
+ def initialize(status, headers, body)
113
+ @status = status
114
+ @headers = headers
115
+ @body = body
116
+ end
117
+
118
+ def status_headers_body
119
+ [@status, @headers, @body]
120
+ end
121
+
122
+ def attributes_for_signing
123
+ @attributes_for_signing ||= begin
124
+ body = ''
125
+ @body.each { |part| body << part } # note: rack only requires #each be defined on the body, so not using map or inject
126
+ { status_code: @status.to_i, body: body }
127
+ end
128
+ end
129
+
130
+ # takes a Hash of headers; returns an instance of this class whose
131
+ # headers have been updated with the argument headers
132
+ def merge_headers(headers)
133
+ self.class.new(@status, @headers.merge(headers), @body)
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,73 @@
1
+ require 'digest'
2
+
3
+ module MAuth
4
+ # module which composes a string to sign.
5
+ #
6
+ # includer must provide
7
+ # - SIGNATURE_COMPONENTS constant - array of keys to get from #attributes_for_signing
8
+ # - #attributes_for_signing
9
+ # - #merge_headers (takes a Hash of headers; returns an instance of includer's own class whose
10
+ # headers have been updated with the argument headers)
11
+ module Signable
12
+ # composes a string suitable for private-key signing from the SIGNATURE_COMPONENTS keys of
13
+ # attributes for signing, which are themselves taken from #attributes_for_signing and
14
+ # the given argument more_attributes
15
+ def string_to_sign(more_attributes)
16
+ attributes_for_signing = self.attributes_for_signing.merge(more_attributes)
17
+ missing_attributes = self.class::SIGNATURE_COMPONENTS.select { |key| !attributes_for_signing.key?(key) || attributes_for_signing[key].nil? }
18
+ missing_attributes.delete(:body) # body may be omitted
19
+ if missing_attributes.any?
20
+ raise(UnableToSignError, "Missing required attributes to sign: #{missing_attributes.inspect}\non object to sign: #{inspect}")
21
+ end
22
+ string = self.class::SIGNATURE_COMPONENTS.map { |k| attributes_for_signing[k].to_s }.join("\n")
23
+ Digest::SHA512.hexdigest(string)
24
+ end
25
+
26
+ def initialize(attributes_for_signing)
27
+ @attributes_for_signing = attributes_for_signing
28
+ end
29
+
30
+ def attributes_for_signing
31
+ @attributes_for_signing
32
+ end
33
+ end
34
+
35
+ # methods for an incoming object which is expected to have a signature.
36
+ #
37
+ # includer must provide
38
+ # - #x_mws_authentication which returns that header's value
39
+ # - #x_mws_time
40
+ module Signed
41
+ # returns a hash with keys :token, :app_uuid, and :signature parsed from the X-MWS-Authentication header
42
+ def signature_info
43
+ @signature_info ||= begin
44
+ match = x_mws_authentication && x_mws_authentication.match(/\A([^ ]+) *([^:]+):([^:]+)\z/)
45
+ match ? { token: match[1], app_uuid: match[2], signature: match[3] } : {}
46
+ end
47
+ end
48
+
49
+ def signature_app_uuid
50
+ signature_info[:app_uuid]
51
+ end
52
+
53
+ def signature_token
54
+ signature_info[:token]
55
+ end
56
+
57
+ def signature
58
+ signature_info[:signature]
59
+ end
60
+ end
61
+
62
+ # virtual base class for signable requests
63
+ class Request
64
+ SIGNATURE_COMPONENTS = [:verb, :request_url, :body, :app_uuid, :time].freeze
65
+ include Signable
66
+ end
67
+
68
+ # virtual base class for signable responses
69
+ class Response
70
+ SIGNATURE_COMPONENTS = [:status_code, :body, :app_uuid, :time].freeze
71
+ include Signable
72
+ end
73
+ end
@@ -0,0 +1,3 @@
1
+ module MAuth
2
+ VERSION = '4.0.1'.freeze
3
+ end
@@ -0,0 +1 @@
1
+ require 'mauth/client'
data/lib/rack/mauth.rb ADDED
@@ -0,0 +1 @@
1
+ require 'mauth/rack'
@@ -0,0 +1,36 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'mauth/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'mauth-client'
7
+ spec.version = MAuth::VERSION
8
+ spec.authors = ['Matthew Szenher', 'Aaron Suggs', 'Geoffrey Ducharme', 'Ethan']
9
+ spec.email = ['mszenher@mdsol.com']
10
+ spec.summary = 'Sign and authenticate requests and responses with mAuth authentication.'
11
+ spec.description = 'Client for signing and authentication of requests and responses with mAuth authentication. Includes middleware for Rack and Faraday for incoming and outgoing requests and responses.'
12
+ spec.homepage = 'https://github.com/mdsol/mauth-client-ruby'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = '>= 2.1.0'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'faraday', '~> 0.7'
22
+ spec.add_dependency 'faraday_middleware', '~> 0.9'
23
+ spec.add_dependency 'term-ansicolor', '~> 1.0'
24
+ spec.add_dependency 'coderay', '~> 1.0'
25
+ spec.add_dependency 'rack'
26
+ spec.add_dependency 'dice_bag', '>= 0.9', '< 2.0'
27
+
28
+ spec.add_development_dependency 'bundler', '~> 1.10'
29
+ spec.add_development_dependency 'kender', '~> 0.4'
30
+ spec.add_development_dependency 'rack-test', '~> 0.6.3'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'rspec', '~> 3.4'
33
+ spec.add_development_dependency 'simplecov', '~> 0.12.0'
34
+ spec.add_development_dependency 'timecop', '~> 0.8.1'
35
+ spec.add_development_dependency 'uuidtools', '~> 2.1.5'
36
+ end
metadata ADDED
@@ -0,0 +1,292 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mauth-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Szenher
8
+ - Aaron Suggs
9
+ - Geoffrey Ducharme
10
+ - Ethan
11
+ autorequire:
12
+ bindir: exe
13
+ cert_chain: []
14
+ date: 2016-08-09 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: faraday
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '0.7'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.7'
30
+ - !ruby/object:Gem::Dependency
31
+ name: faraday_middleware
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: '0.9'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '0.9'
44
+ - !ruby/object:Gem::Dependency
45
+ name: term-ansicolor
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '1.0'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '1.0'
58
+ - !ruby/object:Gem::Dependency
59
+ name: coderay
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '1.0'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: rack
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: dice_bag
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0.9'
93
+ - - "<"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0.9'
103
+ - - "<"
104
+ - !ruby/object:Gem::Version
105
+ version: '2.0'
106
+ - !ruby/object:Gem::Dependency
107
+ name: bundler
108
+ requirement: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '1.10'
113
+ type: :development
114
+ prerelease: false
115
+ version_requirements: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '1.10'
120
+ - !ruby/object:Gem::Dependency
121
+ name: kender
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '0.4'
127
+ type: :development
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '0.4'
134
+ - !ruby/object:Gem::Dependency
135
+ name: rack-test
136
+ requirement: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: 0.6.3
141
+ type: :development
142
+ prerelease: false
143
+ version_requirements: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: 0.6.3
148
+ - !ruby/object:Gem::Dependency
149
+ name: rake
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '10.0'
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '10.0'
162
+ - !ruby/object:Gem::Dependency
163
+ name: rspec
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '3.4'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: '3.4'
176
+ - !ruby/object:Gem::Dependency
177
+ name: simplecov
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: 0.12.0
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: 0.12.0
190
+ - !ruby/object:Gem::Dependency
191
+ name: timecop
192
+ requirement: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: 0.8.1
197
+ type: :development
198
+ prerelease: false
199
+ version_requirements: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - "~>"
202
+ - !ruby/object:Gem::Version
203
+ version: 0.8.1
204
+ - !ruby/object:Gem::Dependency
205
+ name: uuidtools
206
+ requirement: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - "~>"
209
+ - !ruby/object:Gem::Version
210
+ version: 2.1.5
211
+ type: :development
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - "~>"
216
+ - !ruby/object:Gem::Version
217
+ version: 2.1.5
218
+ description: Client for signing and authentication of requests and responses with
219
+ mAuth authentication. Includes middleware for Rack and Faraday for incoming and
220
+ outgoing requests and responses.
221
+ email:
222
+ - mszenher@mdsol.com
223
+ executables:
224
+ - mauth-client
225
+ - mauth-proxy
226
+ extensions: []
227
+ extra_rdoc_files: []
228
+ files:
229
+ - ".gitignore"
230
+ - ".travis.yml"
231
+ - ".yardopts"
232
+ - CHANGELOG.md
233
+ - CONTRIBUTING.md
234
+ - Gemfile
235
+ - LICENSE.txt
236
+ - README.md
237
+ - Rakefile
238
+ - doc/implementations.md
239
+ - doc/mauth-client_CLI.md
240
+ - doc/mauth-proxy.md
241
+ - doc/mauth.yml.md
242
+ - examples/Gemfile
243
+ - examples/Gemfile.lock
244
+ - examples/README.md
245
+ - examples/config.yml
246
+ - examples/get_user_info.rb
247
+ - examples/mauth_key
248
+ - exe/mauth-client
249
+ - exe/mauth-proxy
250
+ - lib/mauth-client.rb
251
+ - lib/mauth/autoload.rb
252
+ - lib/mauth/client.rb
253
+ - lib/mauth/core_ext.rb
254
+ - lib/mauth/dice_bag/mauth.rb.dice
255
+ - lib/mauth/dice_bag/mauth.yml.dice
256
+ - lib/mauth/dice_bag/mauth_key.dice
257
+ - lib/mauth/dice_bag/mauth_templates.rb
258
+ - lib/mauth/fake/rack.rb
259
+ - lib/mauth/faraday.rb
260
+ - lib/mauth/middleware.rb
261
+ - lib/mauth/proxy.rb
262
+ - lib/mauth/rack.rb
263
+ - lib/mauth/request_and_response.rb
264
+ - lib/mauth/version.rb
265
+ - lib/rack/mauth.rb
266
+ - mauth-client.gemspec
267
+ homepage: https://github.com/mdsol/mauth-client-ruby
268
+ licenses:
269
+ - MIT
270
+ metadata: {}
271
+ post_install_message:
272
+ rdoc_options: []
273
+ require_paths:
274
+ - lib
275
+ required_ruby_version: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: 2.1.0
280
+ required_rubygems_version: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: '0'
285
+ requirements: []
286
+ rubyforge_project:
287
+ rubygems_version: 2.5.1
288
+ signing_key:
289
+ specification_version: 4
290
+ summary: Sign and authenticate requests and responses with mAuth authentication.
291
+ test_files: []
292
+ has_rdoc: