Skip to content

Commit d0232ca

Browse files
committed
fix: Allow IAM client_id/secret to be supplied for basicauth header
1 parent e8a2aa8 commit d0232ca

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

src/main/java/com/ibm/cloud/sdk/core/service/security/IamTokenManager.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@
2525
import okhttp3.Request;
2626

2727
import java.io.IOException;
28+
import java.util.Base64;
2829
import java.util.logging.Logger;
2930

3031
/**
3132
* Retrieves, stores, and refreshes IAM tokens.
3233
*/
3334
public class IamTokenManager {
35+
private static String iamClientId = null;
36+
private static String iamSecret = null;
37+
3438
private String userManagedAccessToken;
3539
private String apiKey;
3640
private String url;
@@ -39,7 +43,7 @@ public class IamTokenManager {
3943
private static final Logger LOG = Logger.getLogger(IamTokenManager.class.getName());
4044
private static final String ERROR_MESSAGE = "Error getting IAM token from API";
4145
private static final String DEFAULT_AUTHORIZATION = "Basic Yng6Yng=";
42-
private static final String DEFAULT_IAM_URL = "https://iam.bluemix.net/identity/token";
46+
private static final String DEFAULT_IAM_URL = "https://iam.cloud.ibm.com/identity/token";
4347
private static final String GRANT_TYPE = "grant_type";
4448
private static final String REQUEST_GRANT_TYPE = "urn:ibm:params:oauth:grant-type:apikey";
4549
private static final String REFRESH_GRANT_TYPE = "refresh_token";
@@ -100,7 +104,7 @@ private String requestToken() {
100104
RequestBuilder builder = RequestBuilder.post(RequestBuilder.constructHttpUrl(url, new String[0]));
101105

102106
builder.header(HttpHeaders.CONTENT_TYPE, HttpMediaType.APPLICATION_FORM_URLENCODED);
103-
builder.header(HttpHeaders.AUTHORIZATION, DEFAULT_AUTHORIZATION);
107+
builder.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeaderValue());
104108

105109
FormBody formBody = new FormBody.Builder()
106110
.add(GRANT_TYPE, REQUEST_GRANT_TYPE)
@@ -122,7 +126,7 @@ private String refreshToken() {
122126
RequestBuilder builder = RequestBuilder.post(RequestBuilder.constructHttpUrl(url, new String[0]));
123127

124128
builder.header(HttpHeaders.CONTENT_TYPE, HttpMediaType.APPLICATION_FORM_URLENCODED);
125-
builder.header(HttpHeaders.AUTHORIZATION, DEFAULT_AUTHORIZATION);
129+
builder.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeaderValue());
126130

127131
FormBody formBody = new FormBody.Builder()
128132
.add(GRANT_TYPE, REFRESH_GRANT_TYPE)
@@ -218,4 +222,31 @@ public void run() {
218222
}
219223
return returnToken[0];
220224
}
225+
226+
public static String getIamClientId() {
227+
return iamClientId;
228+
}
229+
230+
public static void setIamClientId(String iamClientId) {
231+
IamTokenManager.iamClientId = iamClientId;
232+
}
233+
234+
public static String getIamSecret() {
235+
return iamSecret;
236+
}
237+
238+
public static void setIamSecret(String iamSecret) {
239+
IamTokenManager.iamSecret = iamSecret;
240+
}
241+
242+
public static String getAuthorizationHeaderValue() {
243+
String result;
244+
if (getIamClientId() != null && getIamSecret() != null) {
245+
String s = getIamClientId() + ":" + getIamSecret();
246+
result = "Basic " + Base64.getEncoder().encodeToString(s.getBytes());
247+
} else {
248+
result = DEFAULT_AUTHORIZATION;
249+
}
250+
return result;
251+
}
221252
}

src/test/java/com/ibm/cloud/sdk/core/test/service/IamManagerTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import static com.ibm.cloud.sdk.core.test.TestUtils.loadFixture;
2424
import static org.junit.Assert.assertEquals;
25+
import static org.testng.Assert.assertNotEquals;
2526

2627
public class IamManagerTest extends BaseServiceUnitTest {
2728

@@ -41,6 +42,26 @@ public void setUp() throws Exception {
4142
validTokenData = loadFixture("src/test/resources/valid_iam_token.json", IamToken.class);
4243
}
4344

45+
@Test
46+
public void testAuthorizationHeader() {
47+
// Make sure the default header value is correct.
48+
String header1 = IamTokenManager.getAuthorizationHeaderValue();
49+
assertEquals(header1, "Basic Yng6Yng=");
50+
51+
// Now make sure different clientid/secret combinations yield different header values
52+
53+
IamTokenManager.setIamClientId("myuser");
54+
IamTokenManager.setIamSecret("mysecret");
55+
String header2 = IamTokenManager.getAuthorizationHeaderValue();
56+
assertNotEquals(header1, header2);
57+
58+
IamTokenManager.setIamClientId("123j10iii38918-afde3");
59+
IamTokenManager.setIamSecret("aU4RyzIZdFgZWxEroo1");
60+
String header3 = IamTokenManager.getAuthorizationHeaderValue();
61+
assertNotEquals(header1, header3);
62+
assertNotEquals(header2, header3);
63+
}
64+
4465
/**
4566
* Tests that if a user passes in an access token during initial IAM setup, that access token is passed back
4667
* during later retrieval.

0 commit comments

Comments
 (0)