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.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +13 -0
- data/.yardopts +4 -0
- data/CHANGELOG.md +119 -0
- data/CONTRIBUTING.md +20 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +19 -0
- data/README.md +235 -0
- data/Rakefile +7 -0
- data/doc/implementations.md +6 -0
- data/doc/mauth-client_CLI.md +59 -0
- data/doc/mauth-proxy.md +71 -0
- data/doc/mauth.yml.md +73 -0
- data/examples/Gemfile +4 -0
- data/examples/Gemfile.lock +41 -0
- data/examples/README.md +33 -0
- data/examples/config.yml +8 -0
- data/examples/get_user_info.rb +58 -0
- data/examples/mauth_key +0 -0
- data/exe/mauth-client +264 -0
- data/exe/mauth-proxy +40 -0
- data/lib/mauth/autoload.rb +8 -0
- data/lib/mauth/client.rb +487 -0
- data/lib/mauth/core_ext.rb +7 -0
- data/lib/mauth/dice_bag/mauth.rb.dice +12 -0
- data/lib/mauth/dice_bag/mauth.yml.dice +14 -0
- data/lib/mauth/dice_bag/mauth_key.dice +1 -0
- data/lib/mauth/dice_bag/mauth_templates.rb +19 -0
- data/lib/mauth/fake/rack.rb +45 -0
- data/lib/mauth/faraday.rb +87 -0
- data/lib/mauth/middleware.rb +23 -0
- data/lib/mauth/proxy.rb +77 -0
- data/lib/mauth/rack.rb +137 -0
- data/lib/mauth/request_and_response.rb +73 -0
- data/lib/mauth/version.rb +3 -0
- data/lib/mauth-client.rb +1 -0
- data/lib/rack/mauth.rb +1 -0
- data/mauth-client.gemspec +36 -0
- metadata +292 -0
@@ -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
|
data/lib/mauth/proxy.rb
ADDED
@@ -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
|
data/lib/mauth-client.rb
ADDED
@@ -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:
|