mauth-client 5.0.2 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/doc/mauth.yml.md +6 -0
- data/lib/mauth/client/authenticator_base.rb +13 -2
- data/lib/mauth/request_and_response.rb +26 -16
- data/lib/mauth/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73a877135a7440cd3137c471873a1ac760304a31cac524189045448c122dc2a8
|
4
|
+
data.tar.gz: e817da8c2d7de3e5d2629de33ded9f8e5985cbc6923dca057de49738460d6ea1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca1e092bbfbc376f1dac96da7198fdc94b234ccd9086a373de69d4ee7e638971e964ab5a549330beeacbf811b2b3990fbef6d7672b498a42d07c6d5518f7e6ad
|
7
|
+
data.tar.gz: 230c42bd030c4bac0dab46c365acda69d8011ab06060156a7244c9f1319ca9248630f2ba29c5c35732d456be8d0734260580c8c1cda0ee40bd8f0182970dadec
|
data/CHANGELOG.md
CHANGED
data/doc/mauth.yml.md
CHANGED
@@ -29,6 +29,8 @@ common: &common
|
|
29
29
|
SIY2exfsy7Y8NoOnBPlGiXKhgaF21T8kqV9C7R6OAuP0U6CgMJnINx/UjozvBENH
|
30
30
|
Ux45QdvRd6vai8nHp7AgV7rr55SxXAZVgATll84uBUpfpmC6YK/j
|
31
31
|
-----END RSA PRIVATE KEY-----
|
32
|
+
v2_only_authenticate: false
|
33
|
+
v2_only_sign_requests: false
|
32
34
|
|
33
35
|
production:
|
34
36
|
<<: *common
|
@@ -46,6 +48,8 @@ common: &common
|
|
46
48
|
mauth_api_version: v1
|
47
49
|
app_uuid: 123we997-0333-44d8-8fCf-5dd555c5bd51
|
48
50
|
private_key_file: config/my_mauth_private.key
|
51
|
+
v2_only_authenticate: false
|
52
|
+
v2_only_sign_requests: false
|
49
53
|
|
50
54
|
production:
|
51
55
|
<<: *common
|
@@ -62,6 +66,8 @@ test:
|
|
62
66
|
- `app_uuid` - Required in the same circumstances where a `private_key` is required.
|
63
67
|
- `mauth_baseurl` - Required for authentication but not for signing. Needed for local authentication to retrieve public keys and for remote authentication. Usually this is `https://mauth.imedidata.com` for production.
|
64
68
|
- `mauth_api_version` - Required for authentication but not for signing. only `v1` exists as of this writing.
|
69
|
+
- `v2_only_authenticate` - If true, all outgoing requests will be signed with only the V2 protocol.
|
70
|
+
- `v2_only_sign_requests` - If true, any incoming request or incoming response that does not use the V2 protocol will be rejected.
|
65
71
|
|
66
72
|
## Usage in your application
|
67
73
|
|
@@ -19,10 +19,21 @@ module MAuth
|
|
19
19
|
|
20
20
|
# raises InauthenticError unless the given object is authentic. Will only
|
21
21
|
# authenticate with v2 if the environment variable V2_ONLY_AUTHENTICATE
|
22
|
-
# is set. Otherwise will
|
22
|
+
# is set. Otherwise will fallback to v1 when v2 authentication fails
|
23
23
|
def authenticate!(object)
|
24
24
|
if object.protocol_version == 2
|
25
|
-
|
25
|
+
begin
|
26
|
+
authenticate_v2!(object)
|
27
|
+
rescue InauthenticError => e
|
28
|
+
raise e if v2_only_authenticate?
|
29
|
+
|
30
|
+
object.fall_back_to_mws_signature_info
|
31
|
+
raise e unless object.signature
|
32
|
+
|
33
|
+
log_authentication_request(object)
|
34
|
+
authenticate_v1!(object)
|
35
|
+
logger.warn("Completed successful authentication attempt after fallback to v1")
|
36
|
+
end
|
26
37
|
elsif object.protocol_version == 1
|
27
38
|
if v2_only_authenticate?
|
28
39
|
# If v2 is required but not present and v1 is present we raise MissingV2Error
|
@@ -59,9 +59,9 @@ module MAuth
|
|
59
59
|
|
60
60
|
# memoization of body_digest to avoid hashing three times when we call
|
61
61
|
# string_to_sign_v2 three times in client#signature_valid_v2!
|
62
|
-
# note that if :body is nil we hash an empty string (
|
63
|
-
attrs_with_overrides[:body_digest] ||= Digest::SHA512.hexdigest(attrs_with_overrides[:body]
|
64
|
-
attrs_with_overrides[:encoded_query_params] = encode_query_string(attrs_with_overrides[:query_string]
|
62
|
+
# note that if :body is nil we hash an empty string ('')
|
63
|
+
attrs_with_overrides[:body_digest] ||= Digest::SHA512.hexdigest(attrs_with_overrides[:body] || '')
|
64
|
+
attrs_with_overrides[:encoded_query_params] = encode_query_string(attrs_with_overrides[:query_string] || '')
|
65
65
|
|
66
66
|
missing_attributes = self.class::SIGNATURE_COMPONENTS_V2.reject do |key|
|
67
67
|
attrs_with_overrides.dig(key)
|
@@ -115,23 +115,17 @@ module MAuth
|
|
115
115
|
# - #x_mws_authentication which returns that header's value
|
116
116
|
# - #x_mws_time
|
117
117
|
module Signed
|
118
|
-
# mauth_client will authenticate with the highest protocol version present and
|
119
|
-
# protocol versions.
|
118
|
+
# mauth_client will authenticate with the highest protocol version present and if authentication fails,
|
119
|
+
# will fallback to lower protocol versions (if provided).
|
120
120
|
# returns a hash with keys :token, :app_uuid, and :signature parsed from the MCC-Authentication header
|
121
121
|
# if it is present and if not then the X-MWS-Authentication header if it is present.
|
122
122
|
# Note MWSV2 protocol no longer allows more than one space between the token and app uuid.
|
123
123
|
def signature_info
|
124
|
-
@signature_info ||=
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
elsif x_mws_authentication
|
130
|
-
x_mws_authentication.match(/\A([^ ]+) *([^:]+):([^:]+)\z/)
|
131
|
-
end
|
132
|
-
|
133
|
-
match ? { token: match[1], app_uuid: match[2], signature: match[3] } : {}
|
134
|
-
end
|
124
|
+
@signature_info ||= build_signature_info(mcc_data || x_mws_data)
|
125
|
+
end
|
126
|
+
|
127
|
+
def fall_back_to_mws_signature_info
|
128
|
+
@signature_info = build_signature_info(x_mws_data)
|
135
129
|
end
|
136
130
|
|
137
131
|
def signature_app_uuid
|
@@ -153,6 +147,22 @@ module MAuth
|
|
153
147
|
1
|
154
148
|
end
|
155
149
|
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def build_signature_info(match_data)
|
154
|
+
match_data ? { token: match_data[1], app_uuid: match_data[2], signature: match_data[3] } : {}
|
155
|
+
end
|
156
|
+
|
157
|
+
def mcc_data
|
158
|
+
mcc_authentication&.match(
|
159
|
+
/\A(#{MAuth::Client::MWSV2_TOKEN}) ([^:]+):([^:]+)#{MAuth::Client::AUTH_HEADER_DELIMITER}\z/
|
160
|
+
)
|
161
|
+
end
|
162
|
+
|
163
|
+
def x_mws_data
|
164
|
+
x_mws_authentication&.match(/\A([^ ]+) *([^:]+):([^:]+)\z/)
|
165
|
+
end
|
156
166
|
end
|
157
167
|
|
158
168
|
# virtual base class for signable requests
|
data/lib/mauth/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mauth-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Szenher
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2020-01-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: faraday
|