mauth-client 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: