mauth-client 6.4.3 → 7.0.0

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.
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: 6.4.3
4
+ version: 7.0.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: 2022-10-07 00:00:00.000000000 Z
14
+ date: 2023-05-24 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: addressable
@@ -41,26 +41,6 @@ dependencies:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
43
  version: '1.0'
44
- - !ruby/object:Gem::Dependency
45
- name: dice_bag
46
- requirement: !ruby/object:Gem::Requirement
47
- requirements:
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: '0.9'
51
- - - "<"
52
- - !ruby/object:Gem::Version
53
- version: '2.0'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: '0.9'
61
- - - "<"
62
- - !ruby/object:Gem::Version
63
- version: '2.0'
64
44
  - !ruby/object:Gem::Dependency
65
45
  name: faraday
66
46
  requirement: !ruby/object:Gem::Requirement
@@ -129,188 +109,6 @@ dependencies:
129
109
  - - "~>"
130
110
  - !ruby/object:Gem::Version
131
111
  version: '1.0'
132
- - !ruby/object:Gem::Dependency
133
- name: appraisal
134
- requirement: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- type: :development
140
- prerelease: false
141
- version_requirements: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- - !ruby/object:Gem::Dependency
147
- name: benchmark-ips
148
- requirement: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '2.7'
153
- type: :development
154
- prerelease: false
155
- version_requirements: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '2.7'
160
- - !ruby/object:Gem::Dependency
161
- name: bundler
162
- requirement: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '1.17'
167
- type: :development
168
- prerelease: false
169
- version_requirements: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '1.17'
174
- - !ruby/object:Gem::Dependency
175
- name: byebug
176
- requirement: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
- type: :development
182
- prerelease: false
183
- version_requirements: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- - !ruby/object:Gem::Dependency
189
- name: rack-test
190
- requirement: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - "~>"
193
- - !ruby/object:Gem::Version
194
- version: 1.1.0
195
- type: :development
196
- prerelease: false
197
- version_requirements: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - "~>"
200
- - !ruby/object:Gem::Version
201
- version: 1.1.0
202
- - !ruby/object:Gem::Dependency
203
- name: rake
204
- requirement: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - "~>"
207
- - !ruby/object:Gem::Version
208
- version: '12.0'
209
- type: :development
210
- prerelease: false
211
- version_requirements: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - "~>"
214
- - !ruby/object:Gem::Version
215
- version: '12.0'
216
- - !ruby/object:Gem::Dependency
217
- name: rspec
218
- requirement: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - "~>"
221
- - !ruby/object:Gem::Version
222
- version: '3.8'
223
- type: :development
224
- prerelease: false
225
- version_requirements: !ruby/object:Gem::Requirement
226
- requirements:
227
- - - "~>"
228
- - !ruby/object:Gem::Version
229
- version: '3.8'
230
- - !ruby/object:Gem::Dependency
231
- name: rubocop
232
- requirement: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - '='
235
- - !ruby/object:Gem::Version
236
- version: 1.25.1
237
- type: :development
238
- prerelease: false
239
- version_requirements: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - '='
242
- - !ruby/object:Gem::Version
243
- version: 1.25.1
244
- - !ruby/object:Gem::Dependency
245
- name: rubocop-mdsol
246
- requirement: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - "~>"
249
- - !ruby/object:Gem::Version
250
- version: '0.1'
251
- type: :development
252
- prerelease: false
253
- version_requirements: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - "~>"
256
- - !ruby/object:Gem::Version
257
- version: '0.1'
258
- - !ruby/object:Gem::Dependency
259
- name: rubocop-performance
260
- requirement: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - '='
263
- - !ruby/object:Gem::Version
264
- version: 1.13.2
265
- type: :development
266
- prerelease: false
267
- version_requirements: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - '='
270
- - !ruby/object:Gem::Version
271
- version: 1.13.2
272
- - !ruby/object:Gem::Dependency
273
- name: simplecov
274
- requirement: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - "~>"
277
- - !ruby/object:Gem::Version
278
- version: '0.16'
279
- type: :development
280
- prerelease: false
281
- version_requirements: !ruby/object:Gem::Requirement
282
- requirements:
283
- - - "~>"
284
- - !ruby/object:Gem::Version
285
- version: '0.16'
286
- - !ruby/object:Gem::Dependency
287
- name: timecop
288
- requirement: !ruby/object:Gem::Requirement
289
- requirements:
290
- - - "~>"
291
- - !ruby/object:Gem::Version
292
- version: '0.9'
293
- type: :development
294
- prerelease: false
295
- version_requirements: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - "~>"
298
- - !ruby/object:Gem::Version
299
- version: '0.9'
300
- - !ruby/object:Gem::Dependency
301
- name: webmock
302
- requirement: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - "~>"
305
- - !ruby/object:Gem::Version
306
- version: '3.0'
307
- type: :development
308
- prerelease: false
309
- version_requirements: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - "~>"
312
- - !ruby/object:Gem::Version
313
- version: '3.0'
314
112
  description: Client for signing and authentication of requests and responses with
315
113
  mAuth authentication. Includes middleware for Rack and Faraday for incoming and
316
114
  outgoing requests and responses.
@@ -337,15 +135,13 @@ files:
337
135
  - LICENSE.txt
338
136
  - README.md
339
137
  - Rakefile
138
+ - UPGRADE_GUIDE.md
340
139
  - doc/implementations.md
341
140
  - doc/mauth-client_CLI.md
342
141
  - doc/mauth-proxy.md
343
- - doc/mauth.yml.md
344
142
  - examples/Gemfile
345
- - examples/Gemfile.lock
346
143
  - examples/README.md
347
- - examples/config.yml
348
- - examples/get_user_info.rb
144
+ - examples/get_country_info.rb
349
145
  - examples/mauth_key
350
146
  - exe/mauth-client
351
147
  - exe/mauth-proxy
@@ -355,16 +151,11 @@ files:
355
151
  - lib/mauth-client.rb
356
152
  - lib/mauth/autoload.rb
357
153
  - lib/mauth/client.rb
358
- - lib/mauth/client/authenticator_base.rb
359
- - lib/mauth/client/local_authenticator.rb
360
- - lib/mauth/client/remote_authenticator.rb
154
+ - lib/mauth/client/authenticator.rb
361
155
  - lib/mauth/client/security_token_cacher.rb
362
156
  - lib/mauth/client/signer.rb
157
+ - lib/mauth/config_env.rb
363
158
  - lib/mauth/core_ext.rb
364
- - lib/mauth/dice_bag/mauth.rb.dice
365
- - lib/mauth/dice_bag/mauth.yml.dice
366
- - lib/mauth/dice_bag/mauth_key.dice
367
- - lib/mauth/dice_bag/mauth_templates.rb
368
159
  - lib/mauth/errors.rb
369
160
  - lib/mauth/fake/rack.rb
370
161
  - lib/mauth/faraday.rb
@@ -388,7 +179,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
388
179
  requirements:
389
180
  - - ">="
390
181
  - !ruby/object:Gem::Version
391
- version: 2.6.0
182
+ version: 2.7.0
392
183
  required_rubygems_version: !ruby/object:Gem::Requirement
393
184
  requirements:
394
185
  - - ">="
data/doc/mauth.yml.md DELETED
@@ -1,84 +0,0 @@
1
- # mauth.yml
2
-
3
- The conventional way to configure MAuth-Client for your project is through a YAML file which lives in your project at `config/mauth.yml`.
4
- It is keyed on environment, and for the most part its contents are passed directly to instantiate an MAuth::Client.
5
- See the documentation for [MAuth::Client#initialize](../lib/mauth/client.rb) for more details of what it accepts.
6
-
7
- ## Generating keys
8
-
9
- To generate a private key (`mauth_key`) and its public counterpart (`mauth_key.pub`) run:
10
-
11
- ```
12
- openssl genrsa -out mauth_key 2048
13
- openssl rsa -in mauth_key -pubout -out mauth_key.pub
14
- ```
15
-
16
- ## Format
17
-
18
- ```yaml
19
- common: &common
20
- mauth_baseurl: https://mauth-innovate.imedidata.com
21
- mauth_api_version: v1
22
- app_uuid: 123we997-0333-44d8-8fCf-5dd555c5bd51
23
- private_key: |
24
- -----BEGIN RSA PRIVATE KEY-----
25
- AIIEowIBAAKCAQEAwLYWYcKrCAl7uWVlkwzBcBXRiRREqGYLXEnRGgDrlqbY+lDg
26
- gwMNga3ylckui/rTUZhtefx1MLtxgnTGiil45eleoJgjdfsOO5yXzUA46KW0cuL4
27
- ...
28
- oEKe4QKBgFNbVJp3Zut83MzpN4Zu7/wZ/+q9ds9WMMxWb4hUugKQTPjsgj+8tCqa
29
- SIY2exfsy7Y8NoOnBPlGiXKhgaF21T8kqV9C7R6OAuP0U6CgMJnINx/UjozvBENH
30
- Ux45QdvRd6vai8nHp7AgV7rr55SxXAZVgATll84uBUpfpmC6YK/j
31
- -----END RSA PRIVATE KEY-----
32
- v2_only_authenticate: false
33
- v2_only_sign_requests: false
34
- disable_fallback_to_v1_on_v2_failure: true
35
-
36
- production:
37
- <<: *common
38
- development:
39
- <<: *common
40
- test:
41
- <<: *common
42
- ```
43
-
44
- Optionally you can load the private key from a file:
45
-
46
- ```yaml
47
- common: &common
48
- mauth_baseurl: https://mauth-innovate.imedidata.com
49
- mauth_api_version: v1
50
- app_uuid: 123we997-0333-44d8-8fCf-5dd555c5bd51
51
- private_key_file: config/my_mauth_private.key
52
- v2_only_authenticate: false
53
- v2_only_sign_requests: false
54
- disable_fallback_to_v1_on_v2_failure: true
55
- v1_only_sign_requests: false
56
-
57
- production:
58
- <<: *common
59
- development:
60
- <<: *common
61
- test:
62
- <<: *common
63
- ```
64
-
65
- ## Configuration options
66
-
67
- - `private_key` - Required for signing and for authenticating responses. May be omitted if only remote authentication of requests is being performed.
68
- - `private_key_file` - May be used instead of `private_key`, mauth-client will load the file instead.
69
- - `app_uuid` - Required in the same circumstances where a `private_key` is required.
70
- - `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.
71
- - `mauth_api_version` - Required for authentication but not for signing. only `v1` exists as of this writing.
72
- - `v2_only_sign_requests` - If true, all outgoing requests will be signed with only the V2 protocol. Defaults to false.
73
- - `v2_only_authenticate` - If true, any incoming request or incoming response that does not use the V2 protocol will be rejected. Defaults to false.
74
- - `disable_fallback_to_v1_on_v2_failure` - If true, any incoming V2 requests that fail authentication will not fall back to V1 authentication. Defaults to false.
75
- - `v1_only_sign_requests` - If true, all outgoing requests will be signed with only the V1 protocol. Defaults to true. Note, cannot be `true` if `v2_only_sign_requests` is also `true`.
76
-
77
- ## Usage in your application
78
-
79
- Load mauth.yml, merge in any other configuration that is needed for your usage, and pass the config along to instantiate a `MAuth::Client` or a middleware.
80
- See the [README](../README.md) for more detail.
81
-
82
- ## Usage in MAuth-Client executables (mauth-client, mauth-proxy)
83
-
84
- See the [MAuth-Client CLI Tool doc](./mauth-client_CLI.md#configuration).
@@ -1,69 +0,0 @@
1
- PATH
2
- remote: ..
3
- specs:
4
- mauth-client (6.4.3)
5
- addressable (~> 2.0)
6
- coderay (~> 1.0)
7
- dice_bag (>= 0.9, < 2.0)
8
- faraday (>= 0.9, < 3.0)
9
- faraday-http-cache (>= 2.0, < 3.0)
10
- rack (> 2.2.3)
11
- term-ansicolor (~> 1.0)
12
-
13
- GEM
14
- remote: https://rubygems.org/
15
- specs:
16
- addressable (2.8.1)
17
- public_suffix (>= 2.0.2, < 6.0)
18
- coderay (1.1.3)
19
- dice_bag (1.6.1)
20
- diff-lcs (~> 1.0)
21
- rake
22
- thor (< 2.0)
23
- diff-lcs (1.5.0)
24
- faraday (1.10.2)
25
- faraday-em_http (~> 1.0)
26
- faraday-em_synchrony (~> 1.0)
27
- faraday-excon (~> 1.1)
28
- faraday-httpclient (~> 1.0)
29
- faraday-multipart (~> 1.0)
30
- faraday-net_http (~> 1.0)
31
- faraday-net_http_persistent (~> 1.0)
32
- faraday-patron (~> 1.0)
33
- faraday-rack (~> 1.0)
34
- faraday-retry (~> 1.0)
35
- ruby2_keywords (>= 0.0.4)
36
- faraday-em_http (1.0.0)
37
- faraday-em_synchrony (1.0.0)
38
- faraday-excon (1.1.0)
39
- faraday-http-cache (2.4.1)
40
- faraday (>= 0.8)
41
- faraday-httpclient (1.0.1)
42
- faraday-multipart (1.0.4)
43
- multipart-post (~> 2)
44
- faraday-net_http (1.0.1)
45
- faraday-net_http_persistent (1.2.0)
46
- faraday-patron (1.0.0)
47
- faraday-rack (1.0.0)
48
- faraday-retry (1.0.3)
49
- multipart-post (2.2.3)
50
- public_suffix (5.0.0)
51
- rack (3.0.0)
52
- rake (13.0.6)
53
- ruby2_keywords (0.0.5)
54
- sync (0.5.0)
55
- term-ansicolor (1.7.1)
56
- tins (~> 1.0)
57
- thor (1.2.1)
58
- tins (1.31.1)
59
- sync
60
-
61
- PLATFORMS
62
- ruby
63
-
64
- DEPENDENCIES
65
- faraday (~> 1.0)
66
- mauth-client!
67
-
68
- BUNDLED WITH
69
- 2.2.29
data/examples/config.yml DELETED
@@ -1,12 +0,0 @@
1
- imedidata:
2
- host: https://innovate.imedidata.com
3
-
4
- mauth:
5
- mauth_baseurl: https://mauth-innovate.imedidata.com
6
- mauth_api_version: v1
7
- app_uuid: <APP UUID>
8
- private_key_file: ./mauth_key
9
- v2_only_authenticate: false
10
- v2_only_sign_requests: false
11
- disable_fallback_to_v1_on_v2_failure: true
12
- v1_only_sign_requests: false
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- abort "USAGE: ./#{__FILE__} <USER UUID>" unless ARGV.size == 1
5
-
6
- require 'bundler/setup'
7
- Bundler.require(:default)
8
-
9
- def config
10
- @config ||= YAML.safe_load(File.open('./config.yml'))
11
- end
12
-
13
- # get user information
14
- def get_user_info_mauth(user_uuid)
15
- get_data_from_imedidata "users/#{user_uuid}.json"
16
- end
17
-
18
- # fetch data from iMedidata
19
- def get_data_from_imedidata(resource_name)
20
- puts "fetching #{resource_name}..."
21
- begin
22
- connection = Faraday::Connection.new(url: config['imedidata']['host']) do |builder|
23
- builder.use MAuth::Faraday::RequestSigner, config['mauth']
24
- builder.adapter Faraday.default_adapter
25
- end
26
-
27
- # get the data
28
- response = connection.get "/api/v2/#{resource_name}"
29
- puts "HTTP #{response.status}"
30
-
31
- # return the user info
32
- if response.status == 200
33
- result = JSON.parse(response.body)
34
- puts JSON.pretty_generate(result)
35
- result
36
- else
37
- puts response.body
38
- nil
39
- end
40
- rescue JSON::ParserError => e
41
- puts "Error parsing data from imedidata: #{e.inspect}"
42
- puts e.backtrace.join("\n")
43
- end
44
- end
45
-
46
- get_user_info_mauth(ARGV[0])
47
-
48
- ### OTHER EXAMPLES
49
-
50
- #### get study groups for an user
51
- def get_study_groups_mauth(user_uuid)
52
- get_data_from_imedidata "users/#{user_uuid}/study_groups.json"
53
- end
54
-
55
- #### get roles for a user in an application study
56
- def get_user_study_roles_mauth(user_uuid, study_uuid)
57
- get_data_from_imedidata "users/#{user_uuid}/studies/#{study_uuid}/apps/#{config["mauth"]["app_uuid"]}/roles.json"
58
- end
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # methods common to RemoteRequestAuthenticator and LocalAuthenticator
4
-
5
- module MAuth
6
- class Client
7
- module AuthenticatorBase
8
- ALLOWED_DRIFT_SECONDS = 300
9
-
10
- # takes an incoming request or response object, and returns whether
11
- # the object is authentic according to its signature.
12
- def authentic?(object)
13
- log_authentication_request(object)
14
- begin
15
- authenticate!(object)
16
- true
17
- rescue InauthenticError, MAuthNotPresent, MissingV2Error
18
- false
19
- end
20
- end
21
-
22
- # raises InauthenticError unless the given object is authentic. Will only
23
- # authenticate with v2 if the environment variable V2_ONLY_AUTHENTICATE
24
- # is set. Otherwise will fall back to v1 when v2 authentication fails
25
- def authenticate!(object)
26
- case object.protocol_version
27
- when 2
28
- begin
29
- authenticate_v2!(object)
30
- rescue InauthenticError => e
31
- raise e if v2_only_authenticate?
32
- raise e if disable_fallback_to_v1_on_v2_failure?
33
-
34
- object.fall_back_to_mws_signature_info
35
- raise e unless object.signature
36
-
37
- log_authentication_request(object)
38
- authenticate_v1!(object)
39
- logger.warn('Completed successful authentication attempt after fallback to v1')
40
- end
41
- when 1
42
- if v2_only_authenticate?
43
- # If v2 is required but not present and v1 is present we raise MissingV2Error
44
- msg = 'This service requires mAuth v2 mcc-authentication header but only v1 x-mws-authentication is present'
45
- logger.error(msg)
46
- raise MissingV2Error, msg
47
- end
48
-
49
- authenticate_v1!(object)
50
- else
51
- sub_str = v2_only_authenticate? ? '' : 'X-MWS-Authentication header is blank, '
52
- msg = "Authentication Failed. No mAuth signature present; #{sub_str}MCC-Authentication header is blank."
53
- logger.warn("mAuth signature not present on #{object.class}. Exception: #{msg}")
54
- raise MAuthNotPresent, msg
55
- end
56
- end
57
-
58
- private
59
-
60
- # NOTE: This log is likely consumed downstream and the contents SHOULD NOT
61
- # be changed without a thorough review of downstream consumers.
62
- def log_authentication_request(object)
63
- object_app_uuid = object.signature_app_uuid || '[none provided]'
64
- object_token = object.signature_token || '[none provided]'
65
- logger.info(
66
- 'Mauth-client attempting to authenticate request from app with mauth' \
67
- " app uuid #{object_app_uuid} to app with mauth app uuid #{client_app_uuid}" \
68
- " using version #{object_token}."
69
- )
70
- end
71
-
72
- def log_inauthentic(object, message)
73
- logger.error("mAuth signature authentication failed for #{object.class}. Exception: #{message}")
74
- end
75
-
76
- def time_within_valid_range!(object, time_signed, now = Time.now)
77
- return if (-ALLOWED_DRIFT_SECONDS..ALLOWED_DRIFT_SECONDS).cover?(now.to_i - time_signed)
78
-
79
- msg = "Time verification failed. #{time_signed} not within #{ALLOWED_DRIFT_SECONDS} of #{now}"
80
- log_inauthentic(object, msg)
81
- raise InauthenticError, msg
82
- end
83
-
84
- # V1 helpers
85
- def authenticate_v1!(object)
86
- time_valid_v1!(object)
87
- token_valid_v1!(object)
88
- signature_valid_v1!(object)
89
- end
90
-
91
- def time_valid_v1!(object)
92
- if object.x_mws_time.nil?
93
- msg = 'Time verification failed. No x-mws-time present.'
94
- log_inauthentic(object, msg)
95
- raise InauthenticError, msg
96
- end
97
- time_within_valid_range!(object, object.x_mws_time.to_i)
98
- end
99
-
100
- def token_valid_v1!(object)
101
- return if object.signature_token == MWS_TOKEN
102
-
103
- msg = "Token verification failed. Expected #{MWS_TOKEN}; token was #{object.signature_token}"
104
- log_inauthentic(object, msg)
105
- raise InauthenticError, msg
106
- end
107
-
108
- # V2 helpers
109
- def authenticate_v2!(object)
110
- time_valid_v2!(object)
111
- token_valid_v2!(object)
112
- signature_valid_v2!(object)
113
- end
114
-
115
- def time_valid_v2!(object)
116
- if object.mcc_time.nil?
117
- msg = 'Time verification failed. No MCC-Time present.'
118
- log_inauthentic(object, msg)
119
- raise InauthenticError, msg
120
- end
121
- time_within_valid_range!(object, object.mcc_time.to_i)
122
- end
123
-
124
- def token_valid_v2!(object)
125
- return if object.signature_token == MWSV2_TOKEN
126
-
127
- msg = "Token verification failed. Expected #{MWSV2_TOKEN}; token was #{object.signature_token}"
128
- log_inauthentic(object, msg)
129
- raise InauthenticError, msg
130
- end
131
- end
132
- end
133
- end