Skip to content

Commit cd495fa

Browse files
authored
Merge pull request #942 from AzureAD/avdunn/nimbus-map
Represent query parameters with Map<String, String>
2 parents 700a850 + cf869a0 commit cd495fa

22 files changed

+297
-132
lines changed

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AbstractClientApplicationBase.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.net.MalformedURLException;
88
import java.net.Proxy;
99
import java.net.URL;
10-
import java.util.Collections;
1110
import java.util.Set;
1211
import java.util.concurrent.CompletableFuture;
1312
import java.util.concurrent.ExecutorService;
@@ -134,22 +133,22 @@ public URL getAuthorizationRequestUrl(AuthorizationRequestUrlParameters paramete
134133

135134
validateNotNull("parameters", parameters);
136135

137-
parameters.requestParameters.put("client_id", Collections.singletonList(this.clientId));
136+
parameters.requestParameters.put("client_id", this.clientId);
138137

139138
//If the client application has any client capabilities set, they must be merged into the claims parameter
140139
if (this.clientCapabilities != null) {
141140
if (parameters.requestParameters.containsKey("claims")) {
142-
String claims = String.valueOf(parameters.requestParameters.get("claims").get(0));
141+
String claims = String.valueOf(parameters.requestParameters.get("claims"));
143142
String mergedClaimsCapabilities = JsonHelper.mergeJSONString(claims, this.clientCapabilities);
144-
parameters.requestParameters.put("claims", Collections.singletonList(mergedClaimsCapabilities));
143+
parameters.requestParameters.put("claims", mergedClaimsCapabilities);
145144
} else {
146-
parameters.requestParameters.put("claims", Collections.singletonList(this.clientCapabilities));
145+
parameters.requestParameters.put("claims", this.clientCapabilities);
147146
}
148147
}
149148

150149
return parameters.createAuthorizationURL(
151150
this.authenticationAuthority,
152-
parameters.requestParameters());
151+
parameters.requestParameters);
153152
}
154153

155154
@Override

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AbstractMsalAuthorizationGrant.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ abstract class AbstractMsalAuthorizationGrant {
2020
*
2121
* @return A map contains the HTTP parameters
2222
*/
23-
abstract Map<String, List<String>> toParameters();
23+
abstract Map<String, String> toParameters();
2424

2525
static final String SCOPE_PARAM_NAME = "scope";
2626
static final String SCOPES_DELIMITER = " ";

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AcquireTokenByAuthorizationGrantSupplier.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
package com.microsoft.aad.msal4j;
55

6-
import com.nimbusds.jose.util.Base64URL;
7-
86
import java.net.URLEncoder;
97
import java.nio.charset.StandardCharsets;
108
import java.util.Base64;
@@ -101,24 +99,22 @@ private void processPasswordGrant(OAuthAuthorizationGrant authGrant) throws Exce
10199
}
102100
}
103101

104-
private Map<String, List<String>> getSAMLAuthGrantParameters(WSTrustResponse response) {
105-
Map<String, List<String>> params = new LinkedHashMap<>();
102+
private Map<String, String> getSAMLAuthGrantParameters(WSTrustResponse response) {
103+
Map<String, String> params = new LinkedHashMap<>();
106104

107105
if (response.isTokenSaml2()) {
108-
params.put(GrantConstants.GRANT_TYPE_PARAMETER, Collections.singletonList(GrantConstants.SAML_2_BEARER));
106+
params.put(GrantConstants.GRANT_TYPE_PARAMETER, GrantConstants.SAML_2_BEARER);
109107
} else {
110-
params.put(GrantConstants.GRANT_TYPE_PARAMETER, Collections.singletonList(GrantConstants.SAML_1_1_BEARER));
108+
params.put(GrantConstants.GRANT_TYPE_PARAMETER, GrantConstants.SAML_1_1_BEARER);
111109
}
112110

113-
params.put(GrantConstants.ASSERTION_PARAMETER, Collections.singletonList(new Base64URL(
114-
Base64.getEncoder().encodeToString(response.getToken()
115-
.getBytes(StandardCharsets.UTF_8))).toString()));
111+
params.put(GrantConstants.ASSERTION_PARAMETER, Base64.getUrlEncoder().encodeToString(response.getToken().getBytes(StandardCharsets.UTF_8)));
116112

117113
return params;
118114
}
119115

120-
private Map<String, List<String>> getAuthorizationGrantIntegrated(String userName) throws Exception {
121-
Map<String, List<String>> params;
116+
private Map<String, String> getAuthorizationGrantIntegrated(String userName) throws Exception {
117+
Map<String, String> params;
122118

123119
String userRealmEndpoint = this.clientApplication.authenticationAuthority.
124120
getUserRealmEndpoint(URLEncoder.encode(userName, StandardCharsets.UTF_8.name()));

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AppServiceManagedIdentitySource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public void createManagedIdentityRequest(String resource) {
3131
managedIdentityRequest.headers.put(SECRET_HEADER_NAME, identityHeader);
3232

3333
managedIdentityRequest.queryParameters = new HashMap<>();
34-
managedIdentityRequest.queryParameters.put("api-version", Collections.singletonList(APP_SERVICE_MSI_API_VERSION));
35-
managedIdentityRequest.queryParameters.put("resource", Collections.singletonList(resource));
34+
managedIdentityRequest.queryParameters.put("api-version", APP_SERVICE_MSI_API_VERSION);
35+
managedIdentityRequest.queryParameters.put("resource", resource);
3636

3737
if (this.idType != null && !StringHelper.isNullOrBlank(this.userAssignedId)) {
3838
LOG.info("[Managed Identity] Adding user assigned ID to the request for App Service Managed Identity.");

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthorizationCodeRequest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ class AuthorizationCodeRequest extends MsalRequest {
1717
}
1818

1919
private static AbstractMsalAuthorizationGrant createMsalGrant(AuthorizationCodeParameters parameters) {
20-
Map<String, List<String>> params = new LinkedHashMap<>();
20+
Map<String, String> params = new LinkedHashMap<>();
2121

22-
params.put(GrantConstants.GRANT_TYPE_PARAMETER, Collections.singletonList(GrantConstants.AUTHORIZATION_CODE));
23-
params.put("code", Collections.singletonList(parameters.authorizationCode()));
22+
params.put(GrantConstants.GRANT_TYPE_PARAMETER, GrantConstants.AUTHORIZATION_CODE);
23+
params.put("code", parameters.authorizationCode());
2424

2525
if (parameters.redirectUri() != null) {
26-
params.put("redirect_uri", Collections.singletonList(parameters.redirectUri().toString()));
26+
params.put("redirect_uri", parameters.redirectUri().toString());
2727
}
2828

2929
if (parameters.codeVerifier() != null) {
30-
params.put("code_verifier", Collections.singletonList(parameters.codeVerifier()));
30+
params.put("code_verifier", parameters.codeVerifier());
3131
}
3232

3333
return new OAuthAuthorizationGrant(params, parameters.scopes(), parameters.claims());

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthorizationRequestUrlParameters.java

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
package com.microsoft.aad.msal4j;
55

6-
import com.nimbusds.oauth2.sdk.util.URLUtils;
76
import org.slf4j.Logger;
87
import org.slf4j.LoggerFactory;
98

@@ -36,7 +35,7 @@ public class AuthorizationRequestUrlParameters {
3635

3736
Map<String, String> extraQueryParameters;
3837

39-
Map<String, List<String>> requestParameters = new HashMap<>();
38+
Map<String, String> requestParameters = new HashMap<>();
4039

4140
Logger log = LoggerFactory.getLogger(AuthorizationRequestUrlParameters.class);
4241

@@ -58,7 +57,7 @@ private static Builder builder() {
5857
private AuthorizationRequestUrlParameters(Builder builder) {
5958
//required parameters
6059
this.redirectUri = builder.redirectUri;
61-
requestParameters.put("redirect_uri", Collections.singletonList(this.redirectUri));
60+
requestParameters.put("redirect_uri", this.redirectUri);
6261
this.scopes = builder.scopes;
6362

6463
Set<String> scopesParam = new LinkedHashSet<>(AbstractMsalAuthorizationGrant.COMMON_SCOPES);
@@ -70,86 +69,86 @@ private AuthorizationRequestUrlParameters(Builder builder) {
7069
}
7170

7271
this.scopes = scopesParam;
73-
requestParameters.put("scope", Collections.singletonList(String.join(" ", scopesParam)));
74-
requestParameters.put("response_type", Collections.singletonList("code"));
72+
requestParameters.put("scope", String.join(" ", scopesParam));
73+
requestParameters.put("response_type", "code");
7574

7675
// Optional parameters
7776
if (builder.claims != null) {
7877
String claimsParam = String.join(" ", builder.claims);
79-
requestParameters.put("claims", Collections.singletonList(claimsParam));
78+
requestParameters.put("claims", claimsParam);
8079
}
8180

8281
if (builder.claimsChallenge != null && builder.claimsChallenge.trim().length() > 0) {
8382
JsonHelper.validateJsonFormat(builder.claimsChallenge);
84-
requestParameters.put("claims", Collections.singletonList(builder.claimsChallenge));
83+
requestParameters.put("claims", builder.claimsChallenge);
8584
}
8685

8786
if (builder.claimsRequest != null) {
8887
String claimsRequest = builder.claimsRequest.formatAsJSONString();
8988
//If there are other claims (such as part of a claims challenge), merge them with this claims request.
9089
if (requestParameters.get("claims") != null) {
91-
claimsRequest = JsonHelper.mergeJSONString(claimsRequest, requestParameters.get("claims").get(0));
90+
claimsRequest = JsonHelper.mergeJSONString(claimsRequest, requestParameters.get("claims"));
9291
}
93-
requestParameters.put("claims", Collections.singletonList(claimsRequest));
92+
requestParameters.put("claims", claimsRequest);
9493
}
9594

9695
if (builder.codeChallenge != null) {
9796
this.codeChallenge = builder.codeChallenge;
98-
requestParameters.put("code_challenge", Collections.singletonList(builder.codeChallenge));
97+
requestParameters.put("code_challenge", builder.codeChallenge);
9998
}
10099

101100
if (builder.codeChallengeMethod != null) {
102101
this.codeChallengeMethod = builder.codeChallengeMethod;
103-
requestParameters.put("code_challenge_method", Collections.singletonList(builder.codeChallengeMethod));
102+
requestParameters.put("code_challenge_method", builder.codeChallengeMethod);
104103
}
105104

106105
if (builder.state != null) {
107106
this.state = builder.state;
108-
requestParameters.put("state", Collections.singletonList(builder.state));
107+
requestParameters.put("state", builder.state);
109108
}
110109

111110
if (builder.nonce != null) {
112111
this.nonce = builder.nonce;
113-
requestParameters.put("nonce", Collections.singletonList(builder.nonce));
112+
requestParameters.put("nonce", builder.nonce);
114113
}
115114

116115
if (builder.responseMode != null) {
117116
this.responseMode = builder.responseMode;
118-
requestParameters.put("response_mode", Collections.singletonList(
119-
builder.responseMode.toString()));
117+
requestParameters.put("response_mode",
118+
builder.responseMode.toString());
120119
} else {
121120
this.responseMode = ResponseMode.FORM_POST;
122-
requestParameters.put("response_mode", Collections.singletonList(
123-
ResponseMode.FORM_POST.toString()));
121+
requestParameters.put("response_mode",
122+
ResponseMode.FORM_POST.toString());
124123
}
125124

126125
if (builder.loginHint != null) {
127126
this.loginHint = loginHint();
128-
requestParameters.put("login_hint", Collections.singletonList(builder.loginHint));
127+
requestParameters.put("login_hint", builder.loginHint);
129128

130129
// For CCS routing
131-
requestParameters.put(HttpHeaders.X_ANCHOR_MAILBOX, Collections.singletonList(
132-
String.format(HttpHeaders.X_ANCHOR_MAILBOX_UPN_FORMAT, builder.loginHint)));
130+
requestParameters.put(HttpHeaders.X_ANCHOR_MAILBOX,
131+
String.format(HttpHeaders.X_ANCHOR_MAILBOX_UPN_FORMAT, builder.loginHint));
133132
}
134133

135134
if (builder.domainHint != null) {
136135
this.domainHint = domainHint();
137-
requestParameters.put("domain_hint", Collections.singletonList(builder.domainHint));
136+
requestParameters.put("domain_hint", builder.domainHint);
138137
}
139138

140139
if (builder.prompt != null) {
141140
this.prompt = builder.prompt;
142-
requestParameters.put("prompt", Collections.singletonList(builder.prompt.toString()));
141+
requestParameters.put("prompt", builder.prompt.toString());
143142
}
144143

145144
if (builder.correlationId != null) {
146145
this.correlationId = builder.correlationId;
147-
requestParameters.put("correlation_id", Collections.singletonList(builder.correlationId));
146+
requestParameters.put("correlation_id", builder.correlationId);
148147
}
149148

150149
if (builder.instanceAware) {
151150
this.instanceAware = builder.instanceAware;
152-
requestParameters.put("instance_aware", Collections.singletonList(String.valueOf(instanceAware)));
151+
requestParameters.put("instance_aware", String.valueOf(instanceAware));
153152
}
154153

155154
if(null != builder.extraQueryParameters && !builder.extraQueryParameters.isEmpty()){
@@ -160,13 +159,13 @@ private AuthorizationRequestUrlParameters(Builder builder) {
160159
if(requestParameters.containsKey(key)){
161160
log.warn("A query parameter {} has been provided with values multiple times.", key);
162161
}
163-
requestParameters.put(key, Collections.singletonList(value));
162+
requestParameters.put(key, value);
164163
}
165164
}
166165
}
167166

168167
URL createAuthorizationURL(Authority authority,
169-
Map<String, List<String>> requestParameters) {
168+
Map<String, String> requestParameters) {
170169
URL authorizationRequestUrl;
171170
try {
172171
String authorizationCodeEndpoint;
@@ -178,7 +177,7 @@ URL createAuthorizationURL(Authority authority,
178177
}
179178

180179
String uriString = authorizationCodeEndpoint + "?" +
181-
URLUtils.serializeParameters(requestParameters);
180+
StringHelper.serializeQueryParameters(requestParameters);
182181

183182
authorizationRequestUrl = new URL(uriString);
184183
} catch (MalformedURLException ex) {
@@ -240,7 +239,7 @@ public Map<String, String> extraQueryParameters() {
240239
}
241240

242241
public Map<String, List<String>> requestParameters() {
243-
return this.requestParameters;
242+
return StringHelper.convertToMultiValueMap(this.requestParameters);
244243
}
245244

246245
public Logger log() {

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AzureArcManagedIdentitySource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public void createManagedIdentityRequest(String resource)
8383
managedIdentityRequest.headers.put("Metadata", "true");
8484

8585
managedIdentityRequest.queryParameters = new HashMap<>();
86-
managedIdentityRequest.queryParameters.put("api-version", Collections.singletonList(ARC_API_VERSION));
87-
managedIdentityRequest.queryParameters.put("resource", Collections.singletonList(resource));
86+
managedIdentityRequest.queryParameters.put("api-version", ARC_API_VERSION);
87+
managedIdentityRequest.queryParameters.put("resource", resource);
8888
}
8989

9090
@Override

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/ClientCredentialRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ class ClientCredentialRequest extends MsalRequest {
2828
}
2929

3030
private static OAuthAuthorizationGrant createMsalGrant(ClientCredentialParameters parameters) {
31-
Map<String, List<String>> params = new LinkedHashMap<>();
31+
Map<String, String> params = new LinkedHashMap<>();
3232

33-
params.put(GrantConstants.GRANT_TYPE_PARAMETER, Collections.singletonList(GrantConstants.CLIENT_CREDENTIALS));
33+
params.put(GrantConstants.GRANT_TYPE_PARAMETER, GrantConstants.CLIENT_CREDENTIALS);
3434

3535
return new OAuthAuthorizationGrant(params, parameters.scopes(), parameters.claims());
3636
}

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/CloudShellManagedIdentitySource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void createManagedIdentityRequest(String resource) {
2727
managedIdentityRequest.headers.put("Metadata", "true");
2828

2929
managedIdentityRequest.queryParameters = new HashMap<>();
30-
managedIdentityRequest.queryParameters.put("resource", Collections.singletonList(resource));
30+
managedIdentityRequest.queryParameters.put("resource", resource);
3131
}
3232

3333
private CloudShellManagedIdentitySource(MsalRequest msalRequest, ServiceBundle serviceBundle, URI msiEndpoint)

msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/DeviceCodeFlowRequest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@
33

44
package com.microsoft.aad.msal4j;
55

6-
import com.nimbusds.oauth2.sdk.util.URLUtils;
7-
86
import java.util.Collections;
97
import java.util.HashMap;
108
import java.util.LinkedHashMap;
11-
import java.util.List;
129
import java.util.Map;
1310
import java.util.concurrent.CompletableFuture;
1411
import java.util.concurrent.atomic.AtomicReference;
@@ -55,28 +52,28 @@ DeviceCode acquireDeviceCode(String url,
5552
}
5653

5754
void createAuthenticationGrant(DeviceCode deviceCode) {
58-
final Map<String, List<String>> params = new LinkedHashMap<>();
55+
final Map<String, String> params = new LinkedHashMap<>();
5956

60-
params.put(GrantConstants.GRANT_TYPE_PARAMETER, Collections.singletonList(GrantConstants.DEVICE_CODE));
61-
params.put("device_code", Collections.singletonList(deviceCode.deviceCode()));
57+
params.put(GrantConstants.GRANT_TYPE_PARAMETER, GrantConstants.DEVICE_CODE);
58+
params.put("device_code", deviceCode.deviceCode());
6259

6360
if (parameters.claims() != null) {
64-
params.put("claims", Collections.singletonList(parameters.claims().formatAsJSONString()));
61+
params.put("claims", parameters.claims().formatAsJSONString());
6562
}
6663

6764
msalAuthorizationGrant = new OAuthAuthorizationGrant(params, Collections.singleton(deviceCode.scopes()), parameters.claims());
6865
}
6966

7067
private String createQueryParams(String clientId) {
71-
Map<String, List<String>> queryParameters = new HashMap<>();
72-
queryParameters.put("client_id", Collections.singletonList(clientId));
68+
Map<String, String> queryParameters = new HashMap<>();
69+
queryParameters.put("client_id", clientId);
7370

7471
String scopesParam = String.join(AbstractMsalAuthorizationGrant.SCOPES_DELIMITER, AbstractMsalAuthorizationGrant.COMMON_SCOPES) +
7572
AbstractMsalAuthorizationGrant.SCOPES_DELIMITER + scopesStr;
7673

77-
queryParameters.put("scope", Collections.singletonList(scopesParam));
74+
queryParameters.put("scope", scopesParam);
7875

79-
return URLUtils.serializeParameters(queryParameters);
76+
return StringHelper.serializeQueryParameters(queryParameters);
8077
}
8178

8279
private Map<String, String> appendToHeaders(Map<String, String> clientDataHeaders) {

0 commit comments

Comments
 (0)