ibm_cloud_sdk_core 0.3.0 → 0.3.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 +4 -4
- data/lib/ibm_cloud_sdk_core/base_service.rb +2 -0
- data/lib/ibm_cloud_sdk_core/iam_token_manager.rb +2 -1
- data/lib/ibm_cloud_sdk_core/icp4d_token_manager.rb +2 -1
- data/lib/ibm_cloud_sdk_core/jwt_token_manager.rb +28 -12
- data/lib/ibm_cloud_sdk_core/version.rb +1 -1
- data/test/unit/test_base_service.rb +23 -0
- data/test/unit/test_jwt_token_manager.rb +3 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98e7c5e7a5e78cc4f561a8b7fddbe026b201d5c18365354236f8b7cd185e2e2e
|
4
|
+
data.tar.gz: 97490e5521edbc772cd9a1932099ac4243ed70a2b712813e9cd4d1ef65e77073
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6bb9065154371294ed94a910c3e3400f8b41723f4fcee4f6656f8ab8e015c5a2817ff9503e23176ab59ee9d7e92e530274c94f4a8cb376e1293aec6ac681a45
|
7
|
+
data.tar.gz: 177559d12ccfe34ad297774558e1c6d2ac2139a97fd66f71ece0c736b61a1806b12f4a60ca9fc3008957ada9a2b81e0b050e7cf01f8aeb8362e795b291ef18bc
|
@@ -243,6 +243,8 @@ module IBMCloudSdkCore
|
|
243
243
|
ssl_context = OpenSSL::SSL::SSLContext.new
|
244
244
|
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
245
245
|
@conn.default_options = { ssl_context: ssl_context }
|
246
|
+
|
247
|
+
@token_manager&.ssl_verification(true)
|
246
248
|
end
|
247
249
|
add_proxy(proxy) unless proxy.empty? || !proxy.dig(:address).is_a?(String) || !proxy.dig(:port).is_a?(Integer)
|
248
250
|
add_timeout(timeout) unless timeout.empty? || (!timeout.key?(:per_operation) && !timeout.key?(:global))
|
@@ -17,6 +17,7 @@ module IBMCloudSdkCore
|
|
17
17
|
DEFAULT_CLIENT_SECRET = "bx"
|
18
18
|
REQUEST_TOKEN_GRANT_TYPE = "urn:ibm:params:oauth:grant-type:apikey"
|
19
19
|
REQUEST_TOKEN_RESPONSE_TYPE = "cloud_iam"
|
20
|
+
TOKEN_NAME = "access_token"
|
20
21
|
|
21
22
|
attr_accessor :token_info, :user_access_token
|
22
23
|
def initialize(iam_apikey: nil, iam_access_token: nil, iam_url: nil,
|
@@ -24,7 +25,7 @@ module IBMCloudSdkCore
|
|
24
25
|
@iam_apikey = iam_apikey
|
25
26
|
@user_access_token = iam_access_token
|
26
27
|
@iam_url = iam_url.nil? ? DEFAULT_IAM_URL : iam_url
|
27
|
-
super(url: iam_url, access_token: iam_access_token)
|
28
|
+
super(url: iam_url, access_token: iam_access_token, token_name: TOKEN_NAME)
|
28
29
|
|
29
30
|
# Both the client id and secret should be provided or neither should be provided.
|
30
31
|
if !iam_client_id.nil? && !iam_client_secret.nil?
|
@@ -9,13 +9,14 @@ require_relative("./jwt_token_manager")
|
|
9
9
|
module IBMCloudSdkCore
|
10
10
|
# Class to manage ICP4D Token Authentication
|
11
11
|
class ICP4DTokenManager < JWTTokenManager
|
12
|
+
TOKEN_NAME = "accessToken"
|
12
13
|
def initialize(url: nil, username: nil, password: nil, access_token: nil)
|
13
14
|
raise ArgumentError.new("The url is mandatory for ICP4D.") if url.nil? && access_token.nil?
|
14
15
|
|
15
16
|
url += "/v1/preauth/validateAuth"
|
16
17
|
@username = username
|
17
18
|
@password = password
|
18
|
-
super(url: url, user_access_token: access_token)
|
19
|
+
super(url: url, user_access_token: access_token, token_name: TOKEN_NAME)
|
19
20
|
end
|
20
21
|
|
21
22
|
def request_token
|
@@ -6,8 +6,6 @@ require("jwt")
|
|
6
6
|
require("rbconfig")
|
7
7
|
require_relative("./version.rb")
|
8
8
|
|
9
|
-
TOKEN_NAME = "access_token"
|
10
|
-
|
11
9
|
module IBMCloudSdkCore
|
12
10
|
# Class to manage JWT Token Authentication
|
13
11
|
class JWTTokenManager
|
@@ -22,6 +20,7 @@ module IBMCloudSdkCore
|
|
22
20
|
@url = vars[:url]
|
23
21
|
@token_info = vars[:token_info]
|
24
22
|
@user_access_token = vars[:access_token]
|
23
|
+
@token_name = vars[:token_name]
|
25
24
|
@time_to_live = nil
|
26
25
|
@expire_time = nil
|
27
26
|
@disable_ssl_verification = false
|
@@ -33,9 +32,9 @@ module IBMCloudSdkCore
|
|
33
32
|
elsif @token_info.nil? || token_expired?
|
34
33
|
token_info = request_token
|
35
34
|
save_token_info(token_info: token_info)
|
36
|
-
@token_info[
|
35
|
+
@token_info[@token_name]
|
37
36
|
elsif !@token_info.nil?
|
38
|
-
@token_info[
|
37
|
+
@token_info[@token_name]
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
@@ -43,6 +42,10 @@ module IBMCloudSdkCore
|
|
43
42
|
@user_access_token = access_token
|
44
43
|
end
|
45
44
|
|
45
|
+
def ssl_verification(disable_ssl_verification)
|
46
|
+
@disable_ssl_verification = disable_ssl_verification
|
47
|
+
end
|
48
|
+
|
46
49
|
private
|
47
50
|
|
48
51
|
# Check if currently stored token is expired.
|
@@ -59,7 +62,7 @@ module IBMCloudSdkCore
|
|
59
62
|
end
|
60
63
|
|
61
64
|
def save_token_info(token_info: nil)
|
62
|
-
access_token = token_info[
|
65
|
+
access_token = token_info[@token_name]
|
63
66
|
decoded_response = JWT.decode access_token, nil, false, {}
|
64
67
|
exp = decoded_response[0]["exp"]
|
65
68
|
iat = decoded_response[0]["iat"]
|
@@ -69,13 +72,26 @@ module IBMCloudSdkCore
|
|
69
72
|
end
|
70
73
|
|
71
74
|
def request(method:, url:, headers: nil, params: nil, data: nil, username: nil, password: nil)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
if @disable_ssl_verification
|
76
|
+
ssl_context = OpenSSL::SSL::SSLContext.new
|
77
|
+
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
78
|
+
response = HTTP.basic_auth(user: username, pass: password).request(
|
79
|
+
method,
|
80
|
+
url,
|
81
|
+
body: data,
|
82
|
+
headers: headers,
|
83
|
+
params: params,
|
84
|
+
ssl_context: ssl_context
|
85
|
+
)
|
86
|
+
else
|
87
|
+
response = HTTP.basic_auth(user: username, pass: password).request(
|
88
|
+
method,
|
89
|
+
url,
|
90
|
+
body: data,
|
91
|
+
headers: headers,
|
92
|
+
params: params
|
93
|
+
)
|
94
|
+
end
|
79
95
|
return JSON.parse(response.body.to_s) if (200..299).cover?(response.code)
|
80
96
|
|
81
97
|
require_relative("./api_exception.rb")
|
@@ -351,4 +351,27 @@ class BaseServiceTest < Minitest::Test
|
|
351
351
|
token_manager = service.instance_variable_get(:@token_manager)
|
352
352
|
assert_equal(token_manager.instance_variable_get(:@user_access_token), "new_token")
|
353
353
|
end
|
354
|
+
|
355
|
+
def test_icp4d_disable_ssl
|
356
|
+
service = IBMCloudSdkCore::BaseService.new(
|
357
|
+
authentication_type: "icp4d",
|
358
|
+
icp4d_url: "https://the.sixth.one",
|
359
|
+
icp4d_access_token: "token",
|
360
|
+
url: "http://the.com"
|
361
|
+
)
|
362
|
+
stub_request(:get, "http://the.com/music")
|
363
|
+
.with(
|
364
|
+
headers: {
|
365
|
+
"Authorization" => "Basic Og==",
|
366
|
+
"Host" => "the.com"
|
367
|
+
}
|
368
|
+
).to_return(status: 200, body: {}.to_json, headers: {})
|
369
|
+
assert_equal(service.instance_variable_get(:@icp4d_access_token), "token")
|
370
|
+
service.send :icp4d_token_manager, icp4d_access_token: "new_token", icp4d_url: "the.url"
|
371
|
+
token_manager = service.instance_variable_get(:@token_manager)
|
372
|
+
service.configure_http_client(disable_ssl_verification: true)
|
373
|
+
assert_equal(token_manager.instance_variable_get(:@disable_ssl_verification), true)
|
374
|
+
service_response = token_manager.send :request, method: "GET", url: "http://the.com/music", headers: {}
|
375
|
+
assert_equal({}, service_response)
|
376
|
+
end
|
354
377
|
end
|
@@ -85,7 +85,7 @@ class JWTTokenManagerTest < Minitest::Test
|
|
85
85
|
access_token = JWT.encode(access_token_layout, "secret", "HS256", "kid": "230498151c214b788dd97f22b85410a5")
|
86
86
|
|
87
87
|
token = {
|
88
|
-
"
|
88
|
+
"accessToken" => access_token,
|
89
89
|
"token_type" => "Bearer",
|
90
90
|
"expires_in" => 3600,
|
91
91
|
"expiration" => Time.now.to_i + (6 * 3600),
|
@@ -95,7 +95,8 @@ class JWTTokenManagerTest < Minitest::Test
|
|
95
95
|
token_manager = IBMCloudSdkCore::JWTTokenManager.new(
|
96
96
|
icp4d_url: "https://the.sixth.one",
|
97
97
|
username: "you",
|
98
|
-
password: "me"
|
98
|
+
password: "me",
|
99
|
+
token_name: "accessToken"
|
99
100
|
)
|
100
101
|
token_manager.send(:save_token_info, token_info: token)
|
101
102
|
token_response = token_manager.send(:token)
|