ibm_cloud_sdk_core 1.0.0.rc1 → 1.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/lib/ibm_cloud_sdk_core/authenticators/basic_authenticator.rb +5 -3
- data/lib/ibm_cloud_sdk_core/authenticators/bearer_token_authenticator.rb +3 -2
- data/lib/ibm_cloud_sdk_core/authenticators/cp4d_authenticator.rb +1 -1
- data/lib/ibm_cloud_sdk_core/authenticators/iam_authenticator.rb +10 -11
- data/lib/ibm_cloud_sdk_core/base_service.rb +7 -0
- data/lib/ibm_cloud_sdk_core/token_managers/cp4d_token_manager.rb +5 -0
- data/lib/ibm_cloud_sdk_core/token_managers/iam_token_manager.rb +7 -2
- data/lib/ibm_cloud_sdk_core/token_managers/jwt_token_manager.rb +0 -4
- data/lib/ibm_cloud_sdk_core/version.rb +1 -1
- data/test/unit/test_base_service.rb +29 -1
- data/test/unit/test_iam_token_manager.rb +38 -47
- data/test/unit/test_icp4d_token_manager.rb +23 -12
- 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: 24cf43bb93090b3c2cdb627369b7645ca17eadc7262f16fbb18b40e76f1285b2
|
4
|
+
data.tar.gz: 2d8be9a330480c90327a5b52d6d2121476aaaf85ecb5ef3e3574945b4ceb75f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1294cd526ded8bccfd89556c9450e7111fcff4ae31162a9f4ea5004d6c718ca360a0b6a09a6f83bc1b3910993f8593d76add495736d361b1c876115df5f35ac9
|
7
|
+
data.tar.gz: de99be13ca0a0ce0e0a4d73852bb7c2f25171717bc654e51d7dca70a834f26c1c05a8cac4bf98b2f14f908e0467ad9cd06e8c3799da8e4dbad0c6457e3752189
|
@@ -7,7 +7,7 @@ require_relative("../utils.rb")
|
|
7
7
|
module IBMCloudSdkCore
|
8
8
|
# Basic Authenticator
|
9
9
|
class BasicAuthenticator < Authenticator
|
10
|
-
attr_accessor :username, :password
|
10
|
+
attr_accessor :username, :password, :authentication_type
|
11
11
|
def initialize(vars)
|
12
12
|
defaults = {
|
13
13
|
username: nil,
|
@@ -21,8 +21,10 @@ module IBMCloudSdkCore
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Adds the Authorization header, if possible
|
24
|
-
def authenticate(
|
25
|
-
|
24
|
+
def authenticate(headers)
|
25
|
+
base64_authentication = Base64.strict_encode64("#{@username}:#{@password}")
|
26
|
+
headers["Authorization"] = "Basic #{base64_authentication}"
|
27
|
+
headers
|
26
28
|
end
|
27
29
|
|
28
30
|
# Checks if all the inputs needed are present
|
@@ -19,8 +19,9 @@ module IBMCloudSdkCore
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# Adds the Authorization header, if possible
|
22
|
-
def authenticate(
|
23
|
-
|
22
|
+
def authenticate(headers)
|
23
|
+
headers["Authorization"] = "Bearer #{@bearer_token}"
|
24
|
+
headers
|
24
25
|
end
|
25
26
|
|
26
27
|
# Checks if all the inputs needed are present
|
@@ -26,8 +26,9 @@ module IBMCloudSdkCore
|
|
26
26
|
@client_secret = vars[:client_secret]
|
27
27
|
@disable_ssl_verification = vars[:disable_ssl_verification]
|
28
28
|
@authentication_type = AUTH_TYPE_IAM
|
29
|
+
|
29
30
|
validate
|
30
|
-
@token_manager =
|
31
|
+
@token_manager = IAMTokenManager.new(
|
31
32
|
apikey: @apikey,
|
32
33
|
url: @url,
|
33
34
|
client_id: @client_id,
|
@@ -36,8 +37,9 @@ module IBMCloudSdkCore
|
|
36
37
|
)
|
37
38
|
end
|
38
39
|
|
39
|
-
def authenticate(
|
40
|
-
|
40
|
+
def authenticate(headers)
|
41
|
+
headers["Authorization"] = "Bearer #{@token_manager.access_token}"
|
42
|
+
headers
|
41
43
|
end
|
42
44
|
|
43
45
|
def validate
|
@@ -46,14 +48,11 @@ module IBMCloudSdkCore
|
|
46
48
|
raise ArgumentError.new('The apikey shouldn\'t start or end with curly brackets or quotes. Be sure to remove any {} and \" characters surrounding your apikey') if check_bad_first_or_last_char(@apikey)
|
47
49
|
|
48
50
|
# Both the client id and secret should be provided or neither should be provided.
|
49
|
-
if
|
50
|
-
@
|
51
|
-
@
|
52
|
-
elsif
|
53
|
-
|
54
|
-
@iam_client_secret = DEFAULT_CLIENT_SECRET
|
55
|
-
else
|
56
|
-
raise ArgumentError.new("Only one of 'iam_client_id' or 'iam_client_secret' were specified, but both parameters should be specified together.")
|
51
|
+
if @client_id.nil? && @client_secret.nil?
|
52
|
+
@client_id = DEFAULT_CLIENT_ID
|
53
|
+
@client_secret = DEFAULT_CLIENT_SECRET
|
54
|
+
elsif @client_id.nil? || client_secret.nil?
|
55
|
+
raise ArgumentError.new("Only one of 'client_id' or 'client_secret' were specified, but both parameters should be specified together.")
|
57
56
|
end
|
58
57
|
end
|
59
58
|
end
|
@@ -9,6 +9,12 @@ require_relative("./detailed_response.rb")
|
|
9
9
|
require_relative("./api_exception.rb")
|
10
10
|
require_relative("./utils.rb")
|
11
11
|
require_relative("./authenticators/authenticator")
|
12
|
+
require_relative("./authenticators/basic_authenticator")
|
13
|
+
require_relative("./authenticators/bearer_token_authenticator")
|
14
|
+
require_relative("./authenticators/config_based_authenticator_factory")
|
15
|
+
require_relative("./authenticators/iam_authenticator")
|
16
|
+
require_relative("./authenticators/cp4d_authenticator")
|
17
|
+
require_relative("./authenticators/no_auth_authenticator")
|
12
18
|
|
13
19
|
NORMALIZER = lambda do |uri| # Custom URI normalizer when using HTTP Client
|
14
20
|
HTTP::URI.parse uri
|
@@ -37,6 +43,7 @@ module IBMCloudSdkCore
|
|
37
43
|
@url = config[:url] unless config.nil?
|
38
44
|
end
|
39
45
|
|
46
|
+
@temp_headers = {}
|
40
47
|
@conn = HTTP::Client.new(
|
41
48
|
headers: {}
|
42
49
|
).use normalize_uri: { normalizer: NORMALIZER }
|
@@ -16,7 +16,7 @@ module IBMCloudSdkCore
|
|
16
16
|
REQUEST_TOKEN_RESPONSE_TYPE = "cloud_iam"
|
17
17
|
TOKEN_NAME = "access_token"
|
18
18
|
|
19
|
-
attr_accessor :token_info, :
|
19
|
+
attr_accessor :token_info, :token_name
|
20
20
|
def initialize(
|
21
21
|
apikey: nil,
|
22
22
|
url: nil,
|
@@ -25,11 +25,16 @@ module IBMCloudSdkCore
|
|
25
25
|
disable_ssl_verification: nil
|
26
26
|
)
|
27
27
|
@apikey = apikey
|
28
|
-
|
28
|
+
url = DEFAULT_IAM_URL if url.nil?
|
29
29
|
@client_id = client_id
|
30
30
|
@client_secret = client_secret
|
31
31
|
@disable_ssl_verification = disable_ssl_verification
|
32
32
|
super(url: url, token_name: TOKEN_NAME)
|
33
|
+
token
|
34
|
+
end
|
35
|
+
|
36
|
+
def access_token
|
37
|
+
@token_info[TOKEN_NAME]
|
33
38
|
end
|
34
39
|
|
35
40
|
private
|
@@ -179,10 +179,38 @@ class BaseServiceTest < Minitest::Test
|
|
179
179
|
end
|
180
180
|
|
181
181
|
def test_for_cp4d_authenticator
|
182
|
+
token_layout = {
|
183
|
+
"username": "dummy",
|
184
|
+
"role": "Admin",
|
185
|
+
"permissions": %w[administrator manage_catalog],
|
186
|
+
"sub": "admin",
|
187
|
+
"iss": "sss",
|
188
|
+
"aud": "sss",
|
189
|
+
"uid": "sss",
|
190
|
+
"iat": Time.now.to_i + 3600,
|
191
|
+
"exp": Time.now.to_i
|
192
|
+
}
|
193
|
+
token = JWT.encode token_layout, "secret", "HS256"
|
194
|
+
response = {
|
195
|
+
"accessToken" => token,
|
196
|
+
"token_type" => "Bearer",
|
197
|
+
"expires_in" => 3600,
|
198
|
+
"expiration" => 1_524_167_011,
|
199
|
+
"refresh_token" => "jy4gl91BQ"
|
200
|
+
}
|
201
|
+
stub_request(:get, "https://hello.world/v1/preauth/validateAuth")
|
202
|
+
.with(
|
203
|
+
headers: {
|
204
|
+
"Authorization" => "Basic aGVsbG86d29ybGQ=",
|
205
|
+
"Connection" => "close",
|
206
|
+
"Host" => "hello.world"
|
207
|
+
}
|
208
|
+
)
|
209
|
+
.to_return(status: 200, body: response.to_json, headers: {})
|
182
210
|
authenticator = IBMCloudSdkCore::CloudPakForDataAuthenticator.new(
|
183
211
|
username: "hello",
|
184
212
|
password: "world",
|
185
|
-
url: "hello.world"
|
213
|
+
url: "https://hello.world"
|
186
214
|
)
|
187
215
|
refute_nil(authenticator)
|
188
216
|
end
|
@@ -8,21 +8,26 @@ WebMock.disable_net_connect!(allow_localhost: true)
|
|
8
8
|
# Unit tests for the IAM Token Manager
|
9
9
|
class IAMTokenManagerTest < Minitest::Test
|
10
10
|
def test_request_token
|
11
|
+
token_layout = {
|
12
|
+
"username": "dummy",
|
13
|
+
"role": "Admin",
|
14
|
+
"permissions": %w[administrator manage_catalog],
|
15
|
+
"sub": "admin",
|
16
|
+
"iss": "sss",
|
17
|
+
"aud": "sss",
|
18
|
+
"uid": "sss",
|
19
|
+
"iat": Time.now.to_i + 3600,
|
20
|
+
"exp": Time.now.to_i
|
21
|
+
}
|
22
|
+
token = JWT.encode token_layout, "secret", "HS256"
|
11
23
|
response = {
|
12
|
-
"access_token" =>
|
24
|
+
"access_token" => token,
|
13
25
|
"token_type" => "Bearer",
|
14
26
|
"expires_in" => 3600,
|
15
27
|
"expiration" => 1_524_167_011,
|
16
28
|
"refresh_token" => "jy4gl91BQ"
|
17
29
|
}
|
18
30
|
|
19
|
-
# Use default iam_url, client id/secret
|
20
|
-
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
21
|
-
apikey: "apikey",
|
22
|
-
url: "https://iam.cloud.ibm.com/identity/token",
|
23
|
-
client_id: "bx",
|
24
|
-
client_secret: "bx"
|
25
|
-
)
|
26
31
|
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
27
32
|
.with(
|
28
33
|
body: { "apikey" => "apikey", "grant_type" => "urn:ibm:params:oauth:grant-type:apikey", "response_type" => "cloud_iam" },
|
@@ -33,16 +38,19 @@ class IAMTokenManagerTest < Minitest::Test
|
|
33
38
|
"Host" => "iam.cloud.ibm.com"
|
34
39
|
}
|
35
40
|
).to_return(status: 200, body: response.to_json, headers: {})
|
41
|
+
# Use default iam_url, client id/secret
|
42
|
+
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
43
|
+
apikey: "apikey",
|
44
|
+
url: "https://iam.cloud.ibm.com/identity/token",
|
45
|
+
client_id: "bx",
|
46
|
+
client_secret: "bx"
|
47
|
+
)
|
36
48
|
token_response = token_manager.send(:request_token)
|
37
49
|
assert_equal(response, token_response)
|
38
50
|
end
|
39
51
|
|
40
52
|
def test_request_token_fails
|
41
53
|
iam_url = "https://iam.cloud.ibm.com/identity/token"
|
42
|
-
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
43
|
-
apikey: "apikey",
|
44
|
-
url: iam_url
|
45
|
-
)
|
46
54
|
response = {
|
47
55
|
"code" => "500",
|
48
56
|
"error" => "Oh no"
|
@@ -58,17 +66,14 @@ class IAMTokenManagerTest < Minitest::Test
|
|
58
66
|
}
|
59
67
|
).to_return(status: 500, body: response.to_json, headers: {})
|
60
68
|
assert_raises do
|
61
|
-
|
69
|
+
IBMCloudSdkCore::IAMTokenManager.new(
|
70
|
+
apikey: "apikey",
|
71
|
+
url: iam_url
|
72
|
+
)
|
62
73
|
end
|
63
74
|
end
|
64
75
|
|
65
76
|
def test_request_token_fails_catch_exception
|
66
|
-
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
67
|
-
apikey: "apikey",
|
68
|
-
url: "https://iam.cloud.ibm.com/identity/token",
|
69
|
-
client_id: "bx",
|
70
|
-
client_secret: "bx"
|
71
|
-
)
|
72
77
|
response = {
|
73
78
|
"code" => "500",
|
74
79
|
"error" => "Oh no"
|
@@ -84,38 +89,18 @@ class IAMTokenManagerTest < Minitest::Test
|
|
84
89
|
}
|
85
90
|
).to_return(status: 401, body: response.to_json, headers: {})
|
86
91
|
begin
|
87
|
-
|
92
|
+
IBMCloudSdkCore::IAMTokenManager.new(
|
93
|
+
apikey: "apikey",
|
94
|
+
url: "https://iam.cloud.ibm.com/identity/token",
|
95
|
+
client_id: "bx",
|
96
|
+
client_secret: "bx"
|
97
|
+
)
|
88
98
|
rescue IBMCloudSdkCore::ApiException => e
|
89
99
|
assert(e.to_s.instance_of?(String))
|
90
100
|
end
|
91
101
|
end
|
92
102
|
|
93
|
-
def test_is_token_expired
|
94
|
-
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
95
|
-
apikey: "apikey",
|
96
|
-
url: "https://url.com",
|
97
|
-
client_id: "bx",
|
98
|
-
client_secret: "bx"
|
99
|
-
)
|
100
|
-
|
101
|
-
assert(token_manager.send(:token_expired?))
|
102
|
-
token_manager.instance_variable_set(:@time_to_live, 3600)
|
103
|
-
token_manager.instance_variable_set(:@expire_time, Time.now.to_i + 6000)
|
104
|
-
refute(token_manager.send(:token_expired?))
|
105
|
-
token_manager.instance_variable_set(:@time_to_live, 3600)
|
106
|
-
token_manager.instance_variable_set(:@expire_time, Time.now.to_i - 3600)
|
107
|
-
assert(token_manager.send(:token_expired?))
|
108
|
-
end
|
109
|
-
|
110
103
|
def test_get_token
|
111
|
-
iam_url = "https://iam.cloud.ibm.com/identity/token"
|
112
|
-
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
113
|
-
apikey: "apikey",
|
114
|
-
url: iam_url,
|
115
|
-
client_id: "bx",
|
116
|
-
client_secret: "bx"
|
117
|
-
)
|
118
|
-
|
119
104
|
access_token_layout = {
|
120
105
|
"username" => "dummy",
|
121
106
|
"role" => "Admin",
|
@@ -148,8 +133,14 @@ class IAMTokenManagerTest < Minitest::Test
|
|
148
133
|
"Host" => "iam.cloud.ibm.com"
|
149
134
|
}
|
150
135
|
).to_return(status: 200, body: response.to_json, headers: {})
|
151
|
-
|
152
|
-
|
136
|
+
iam_url = "https://iam.cloud.ibm.com/identity/token"
|
137
|
+
token_manager = IBMCloudSdkCore::IAMTokenManager.new(
|
138
|
+
apikey: "apikey",
|
139
|
+
url: iam_url,
|
140
|
+
client_id: "bx",
|
141
|
+
client_secret: "bx"
|
142
|
+
)
|
143
|
+
assert_equal(token_manager.access_token, access_token)
|
153
144
|
end
|
154
145
|
|
155
146
|
def test_client_id_only
|
@@ -8,19 +8,25 @@ WebMock.disable_net_connect!(allow_localhost: true)
|
|
8
8
|
# Unit tests for the CP4D Token Manager
|
9
9
|
class CP4DTokenManagerTest < Minitest::Test
|
10
10
|
def test_request_token
|
11
|
+
token_layout = {
|
12
|
+
"username": "dummy",
|
13
|
+
"role": "Admin",
|
14
|
+
"permissions": %w[administrator manage_catalog],
|
15
|
+
"sub": "admin",
|
16
|
+
"iss": "sss",
|
17
|
+
"aud": "sss",
|
18
|
+
"uid": "sss",
|
19
|
+
"iat": Time.now.to_i + 3600,
|
20
|
+
"exp": Time.now.to_i
|
21
|
+
}
|
22
|
+
token = JWT.encode token_layout, "secret", "HS256"
|
11
23
|
response = {
|
12
|
-
"
|
24
|
+
"accessToken" => token,
|
13
25
|
"token_type" => "Bearer",
|
14
26
|
"expires_in" => 3600,
|
15
27
|
"expiration" => 1_524_167_011,
|
16
28
|
"refresh_token" => "jy4gl91BQ"
|
17
29
|
}
|
18
|
-
|
19
|
-
token_manager = IBMCloudSdkCore::CP4DTokenManager.new(
|
20
|
-
url: "https://the.sixth.one",
|
21
|
-
username: "you",
|
22
|
-
password: "me"
|
23
|
-
)
|
24
30
|
stub_request(:get, "https://the.sixth.one/v1/preauth/validateAuth")
|
25
31
|
.with(
|
26
32
|
headers: {
|
@@ -28,16 +34,17 @@ class CP4DTokenManagerTest < Minitest::Test
|
|
28
34
|
"Host" => "the.sixth.one"
|
29
35
|
}
|
30
36
|
).to_return(status: 200, body: response.to_json, headers: {})
|
31
|
-
token_response = token_manager.send(:request_token)
|
32
|
-
assert_equal(response, token_response)
|
33
|
-
end
|
34
37
|
|
35
|
-
def test_request_token_fails
|
36
38
|
token_manager = IBMCloudSdkCore::CP4DTokenManager.new(
|
37
39
|
url: "https://the.sixth.one",
|
38
40
|
username: "you",
|
39
41
|
password: "me"
|
40
42
|
)
|
43
|
+
token_response = token_manager.send(:request_token)
|
44
|
+
assert_equal(response, token_response)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_request_token_fails
|
41
48
|
response = {
|
42
49
|
"code" => "500",
|
43
50
|
"error" => "Oh no"
|
@@ -50,7 +57,11 @@ class CP4DTokenManagerTest < Minitest::Test
|
|
50
57
|
}
|
51
58
|
).to_return(status: 500, body: response.to_json, headers: {})
|
52
59
|
begin
|
53
|
-
|
60
|
+
IBMCloudSdkCore::CP4DTokenManager.new(
|
61
|
+
url: "https://the.sixth.one",
|
62
|
+
username: "you",
|
63
|
+
password: "me"
|
64
|
+
)
|
54
65
|
rescue IBMCloudSdkCore::ApiException => e
|
55
66
|
assert(e.to_s.instance_of?(String))
|
56
67
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibm_cloud_sdk_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mamoon Raja
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|