cerner-oauth1a 2.0.0.rc1 → 2.0.0.rc2
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 +4 -4
- data/README.md +1 -2
- data/lib/cerner/oauth1a/access_token.rb +35 -23
- data/lib/cerner/oauth1a/access_token_agent.rb +5 -3
- data/lib/cerner/oauth1a/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: 64818192ce3e55c68d1dbf2a5cc77bf12225e5b5c80cbc3e121b5212f8e5adaa
|
4
|
+
data.tar.gz: dfff2b1c96e60e9b55dbe5ddd024fb80bfbfe6e30613a88bf564cacfe38f1589
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2482f15305e156725b2989609ec9b4c01d1b0535e1641215f34a769495f453043c2d376f405150ff31bc6fa1e94fe7d64f71ae65a8c619d9b06857b130ac01e7
|
7
|
+
data.tar.gz: 9d5368c0f9662259fcd46ef8a3e53491406efc44a63580461be8b527f35df8578a6f23a7ef15b01ce08170581bccc0daee7d67524dda0f81aa58f9dec02a14bd
|
data/README.md
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
[](https://travis-ci.org/cerner/cerner-oauth1a)
|
4
4
|
[](https://rubygems.org/gems/cerner-oauth1a)
|
5
5
|
[](https://codeclimate.com/github/cerner/cerner-oauth1a)
|
6
|
-
[](https://gemnasium.com/cerner/cerner-oauth1a)
|
7
6
|
|
8
7
|
A minimal dependency library for interacting with a Cerner OAuth 1.0a Access Token Service for
|
9
8
|
invoking Cerner OAuth 1.0a protected services or implementing Cerner OAuth 1.0a authentication.
|
@@ -76,7 +75,7 @@ implement that:
|
|
76
75
|
|
77
76
|
# Optionally, extract additional parameters sent with the token, such as Consumer.Principal
|
78
77
|
# (xoauth_principal)
|
79
|
-
consumer_principal =
|
78
|
+
consumer_principal = access_token.consumer_principal
|
80
79
|
|
81
80
|
## References
|
82
81
|
* https://wiki.ucern.com/display/public/reference/Cerner%27s+OAuth+Specification
|
@@ -26,17 +26,17 @@ module Cerner
|
|
26
26
|
|
27
27
|
missing_params = []
|
28
28
|
consumer_key = params[:oauth_consumer_key]
|
29
|
-
missing_params << :oauth_consumer_key
|
29
|
+
missing_params << :oauth_consumer_key if consumer_key.nil? || consumer_key.empty?
|
30
30
|
nonce = params[:oauth_nonce]
|
31
|
-
missing_params << :oauth_nonce
|
31
|
+
missing_params << :oauth_nonce if nonce.nil? || nonce.empty?
|
32
32
|
timestamp = params[:oauth_timestamp]
|
33
|
-
missing_params << :oauth_timestamp
|
33
|
+
missing_params << :oauth_timestamp if timestamp.nil? || timestamp.empty?
|
34
34
|
token = params[:oauth_token]
|
35
|
-
missing_params << :oauth_token
|
35
|
+
missing_params << :oauth_token if token.nil? || token.empty?
|
36
36
|
signature_method = params[:oauth_signature_method]
|
37
|
-
missing_params << :oauth_signature_method
|
37
|
+
missing_params << :oauth_signature_method if signature_method.nil? || signature_method.empty?
|
38
38
|
signature = params[:oauth_signature]
|
39
|
-
missing_params << :oauth_signature
|
39
|
+
missing_params << :oauth_signature if signature.nil? || signature.empty?
|
40
40
|
|
41
41
|
raise OAuthError.new('', nil, 'parameter_absent', missing_params) unless missing_params.empty?
|
42
42
|
|
@@ -50,24 +50,28 @@ module Cerner
|
|
50
50
|
)
|
51
51
|
end
|
52
52
|
|
53
|
-
# Returns
|
53
|
+
# Returns a String, but may be nil, with the Accessor Secret related to this token.
|
54
54
|
attr_reader :accessor_secret
|
55
|
-
# Returns
|
55
|
+
# Returns a String with the Consumer Key (oauth_consumer_key) related to this token.
|
56
56
|
attr_reader :consumer_key
|
57
|
-
# Returns
|
57
|
+
# Returns a Time, but may be nil, which represents the moment when this token expires.
|
58
58
|
attr_reader :expires_at
|
59
|
-
# Returns
|
59
|
+
# Returns a String with the Nonce (oauth_nonce) related to this token.
|
60
60
|
attr_reader :nonce
|
61
|
-
# Returns
|
61
|
+
# Returns a Time, which represents the moment when this token was created (oauth_timestamp).
|
62
62
|
attr_reader :timestamp
|
63
|
-
# Returns
|
63
|
+
# Returns a String with the Token (oauth_token).
|
64
64
|
attr_reader :token
|
65
|
-
# Returns
|
65
|
+
# Returns a String, but may be nil, with the Token Secret related to this token.
|
66
66
|
attr_reader :token_secret
|
67
|
-
# Returns
|
67
|
+
# Returns a String with the Signature Method (oauth_signature_method) related to this token.
|
68
68
|
attr_reader :signature_method
|
69
|
-
# Returns
|
69
|
+
# Returns a String, but may be nil, with the Signature (oauth_signature) related to this token.
|
70
70
|
attr_reader :signature
|
71
|
+
# Returns a String with the Consumer Principal (Consumer.Principal param encoded within oauth_token).
|
72
|
+
# This value is only populated after a successful #authenticate and only if the #token (oauth_token)
|
73
|
+
# contains a 'Consumer.Principal' parameter.
|
74
|
+
attr_reader :consumer_principal
|
71
75
|
|
72
76
|
# Public: Constructs an instance.
|
73
77
|
#
|
@@ -108,6 +112,7 @@ module Cerner
|
|
108
112
|
@accessor_secret = accessor_secret || nil
|
109
113
|
@authorization_header = nil
|
110
114
|
@consumer_key = consumer_key
|
115
|
+
@consumer_principal = nil
|
111
116
|
@expires_at = expires_at ? convert_to_time(expires_at) : nil
|
112
117
|
@nonce = nonce
|
113
118
|
@signature = signature
|
@@ -159,7 +164,8 @@ module Cerner
|
|
159
164
|
# appropriate credentials to retrieve secrets via
|
160
165
|
# Cerner::OAuth1a::AccessTokenAgent#retrieve_keys.
|
161
166
|
#
|
162
|
-
# Returns a Hash (symbolized keys) of any extra parameters
|
167
|
+
# Returns a Hash (symbolized keys) of any extra parameters within #token (oauth_token),
|
168
|
+
# if authentication succeeds. In most scenarios, the Hash will be empty.
|
163
169
|
#
|
164
170
|
# Raises ArgumentError if access_token_agent is nil
|
165
171
|
# Raises Cerner::OAuth1a::OAuthError with an oauth_problem if authentication fails.
|
@@ -186,6 +192,8 @@ module Cerner
|
|
186
192
|
|
187
193
|
verify_signature(keys, tuples.delete(:HMACSecrets))
|
188
194
|
|
195
|
+
@consumer_principal = tuples.delete(:"Consumer.Principal")
|
196
|
+
|
189
197
|
tuples
|
190
198
|
end
|
191
199
|
|
@@ -272,15 +280,19 @@ module Cerner
|
|
272
280
|
#
|
273
281
|
# Raises OAuthError if the parameter is invalid or expired
|
274
282
|
def verify_expiration(expires_on)
|
275
|
-
raise OAuthError.new('token missing ExpiresOn', nil, 'oauth_parameters_rejected') unless expires_on
|
283
|
+
raise OAuthError.new('token missing ExpiresOn', nil, 'oauth_parameters_rejected', 'oauth_token') unless expires_on
|
276
284
|
expires_on = convert_to_time(expires_on)
|
277
285
|
now = convert_to_time(Time.now)
|
278
286
|
raise OAuthError.new('token has expired', nil, 'token_expired') if now.tv_sec >= expires_on.tv_sec
|
279
287
|
end
|
280
288
|
|
281
289
|
def load_keys(access_token_agent, keys_version)
|
282
|
-
raise OAuthError.new('token missing KeysVersion', nil, 'oauth_parameters_rejected') unless keys_version
|
283
|
-
|
290
|
+
raise OAuthError.new('token missing KeysVersion', nil, 'oauth_parameters_rejected', 'oauth_token') unless keys_version
|
291
|
+
begin
|
292
|
+
access_token_agent.retrieve_keys(keys_version)
|
293
|
+
rescue OAuthError
|
294
|
+
raise OAuthError.new('token references invalid keys version', nil, 'oauth_parameters_rejected', 'oauth_token')
|
295
|
+
end
|
284
296
|
end
|
285
297
|
|
286
298
|
# Internal: Used by #authenticate to verify the oauth_token value.
|
@@ -290,7 +302,7 @@ module Cerner
|
|
290
302
|
# Raises OAuthError if the parameter is not authentic
|
291
303
|
def verify_token(keys)
|
292
304
|
unless keys.verify_rsasha1_signature(@token)
|
293
|
-
raise OAuthError.new('token is not authentic', nil, 'oauth_parameters_rejected')
|
305
|
+
raise OAuthError.new('token is not authentic', nil, 'oauth_parameters_rejected', 'oauth_token')
|
294
306
|
end
|
295
307
|
end
|
296
308
|
|
@@ -302,13 +314,13 @@ module Cerner
|
|
302
314
|
# Raises OAuthError if there is no signature, the parameter is invalid or the signature does
|
303
315
|
# not match the secrets
|
304
316
|
def verify_signature(keys, hmac_secrets)
|
305
|
-
raise OAuthError.new('missing signature', nil, 'oauth_parameters_absent') unless @signature
|
306
|
-
raise OAuthError.new('missing HMACSecrets', nil, 'oauth_parameters_rejected') unless hmac_secrets
|
317
|
+
raise OAuthError.new('missing signature', nil, 'oauth_parameters_absent', 'oauth_signature') unless @signature
|
318
|
+
raise OAuthError.new('missing HMACSecrets', nil, 'oauth_parameters_rejected', 'oauth_token') unless hmac_secrets
|
307
319
|
|
308
320
|
begin
|
309
321
|
secrets = keys.decrypt_hmac_secrets(hmac_secrets)
|
310
322
|
rescue ArgumentError, OpenSSL::PKey::RSAError => e
|
311
|
-
raise OAuthError.new("unable to decrypt HMACSecrets: #{e.message}", nil, 'oauth_parameters_rejected')
|
323
|
+
raise OAuthError.new("unable to decrypt HMACSecrets: #{e.message}", nil, 'oauth_parameters_rejected', 'oauth_token')
|
312
324
|
end
|
313
325
|
|
314
326
|
secrets_parts = Protocol.parse_url_query_string(secrets)
|
@@ -14,7 +14,7 @@ require 'uri'
|
|
14
14
|
|
15
15
|
module Cerner
|
16
16
|
module OAuth1a
|
17
|
-
# Public: A user agent for interacting with the Cerner OAuth 1.0a Access Token service to acquire
|
17
|
+
# Public: A user agent (client) for interacting with the Cerner OAuth 1.0a Access Token service to acquire
|
18
18
|
# consumer Access Tokens or service provider Keys.
|
19
19
|
class AccessTokenAgent
|
20
20
|
MIME_WWW_FORM_URL_ENCODED = 'application/x-www-form-urlencoded'
|
@@ -28,7 +28,9 @@ module Cerner
|
|
28
28
|
|
29
29
|
# Public: Constructs an instance of the agent.
|
30
30
|
#
|
31
|
-
#
|
31
|
+
# _Caching_
|
32
|
+
#
|
33
|
+
# By default, AccessToken and Keys instances are maintained in a small, constrained
|
32
34
|
# memory cache used by #retrieve and #retrieve_keys, respectively.
|
33
35
|
#
|
34
36
|
# The AccessToken cache keeps a maximum of 5 entries and prunes them when they expire. As the
|
@@ -253,7 +255,7 @@ module Cerner
|
|
253
255
|
|
254
256
|
# Internal: Prepare a request for #retrieve_keys
|
255
257
|
def retrieve_keys_prepare_request(keys_version)
|
256
|
-
request = Net::HTTP::Get.new("#{@access_token_url}/keys/#{keys_version}")
|
258
|
+
request = Net::HTTP::Get.new(URI("#{@access_token_url}/keys/#{keys_version}"))
|
257
259
|
request['Accept'] = 'application/json'
|
258
260
|
request['User-Agent'] = user_agent_string
|
259
261
|
request['Authorization'] = retrieve.authorization_header
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cerner-oauth1a
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Beyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
A minimal dependency library for interacting with a Cerner OAuth 1.0a Access
|