Skip to content

Commit 88949fc

Browse files
authored
Merge pull request #607 from AzureAD/SJAIN/add-extraQueryParameters
expose extraQueryParameters
2 parents 00c991a + 6106d52 commit 88949fc

18 files changed

+141
-10
lines changed

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AcquireTokenSilentIT.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@
99
import org.testng.annotations.Test;
1010

1111
import java.net.MalformedURLException;
12-
import java.util.Collections;
13-
import java.util.Date;
14-
import java.util.HashSet;
15-
import java.util.Set;
12+
import java.util.*;
1613
import java.util.concurrent.ExecutionException;
1714

1815
import static com.microsoft.aad.msal4j.TestConstants.KEYVAULT_DEFAULT_SCOPE;
@@ -178,9 +175,12 @@ public void acquireTokenSilent_ConfidentialClient_acquireTokenSilent(String envi
178175
cfg = new Config(environment);
179176

180177
IConfidentialClientApplication cca = getConfidentialClientApplications();
181-
178+
//test that adding extra query parameters does not break the flow
179+
Map<String, String> extraParameters = new HashMap<>();
180+
extraParameters.put("test","test");
182181
IAuthenticationResult result = cca.acquireToken(ClientCredentialParameters
183182
.builder(Collections.singleton(cfg.graphDefaultScope()))
183+
.extraQueryParameters(extraParameters)
184184
.build())
185185
.get();
186186

@@ -191,6 +191,7 @@ public void acquireTokenSilent_ConfidentialClient_acquireTokenSilent(String envi
191191

192192
result = cca.acquireTokenSilently(SilentParameters
193193
.builder(Collections.singleton(cfg.graphDefaultScope()))
194+
.extraQueryParameters(extraParameters)
194195
.build())
195196
.get();
196197

@@ -401,10 +402,13 @@ private IAuthenticationResult acquireTokenSilently(IPublicClientApplication pca,
401402
}
402403

403404
private IAuthenticationResult acquireTokenUsernamePassword(User user, IPublicClientApplication pca, String scope) throws InterruptedException, ExecutionException {
405+
Map<String, String> map = new HashMap<>();
406+
map.put("test","test");
404407
return pca.acquireToken(UserNamePasswordParameters.
405408
builder(Collections.singleton(scope),
406409
user.getUpn(),
407410
user.getPassword().toCharArray())
411+
.extraQueryParameters(map)
408412
.build())
409413
.get();
410414
}

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AuthorizationCodeIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ private IAuthenticationResult acquireTokenInteractiveB2C(ConfidentialClientAppli
229229
result = cca.acquireToken(AuthorizationCodeParameters
230230
.builder(authCode, new URI(TestConstants.LOCALHOST + httpListener.port()))
231231
.scopes(Collections.singleton(TestConstants.B2C_LAB_SCOPE))
232+
.extraQueryParameters(new HashMap<>())
232233
.build())
233234
.get();
234235
} catch (Exception e) {

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/ConfidentialClientApplicationUnitT.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import java.util.*;
3232
import java.util.concurrent.CompletableFuture;
3333
import java.util.concurrent.Future;
34-
import java.util.function.Function;
3534

3635
import static com.microsoft.aad.msal4j.TestConstants.KEYVAULT_DEFAULT_SCOPE;
3736
import static org.easymock.EasyMock.*;
@@ -261,6 +260,8 @@ public void testClientAssertion_acquireToken() throws Exception{
261260
Assert.assertTrue(body.contains("client_assertion_type=" + URLEncoder.encode(JWTAuthentication.CLIENT_ASSERTION_TYPE, "utf-8")));
262261
Assert.assertTrue(body.contains("scope=" + URLEncoder.encode("openid profile offline_access " + scope, "utf-8")));
263262
Assert.assertTrue(body.contains("client_id=" + TestConfiguration.AAD_CLIENT_ID));
263+
Assert.assertTrue(body.contains("test=test"));
264+
Assert.assertTrue(body.contains("id_token_hint=token_hint_value"));
264265
}
265266

266267
private ServiceBundle mockedServiceBundle(IHttpClient httpClientMock) {
@@ -274,7 +275,15 @@ private ServiceBundle mockedServiceBundle(IHttpClient httpClientMock) {
274275
private ClientCredentialRequest getClientCredentialRequest(ConfidentialClientApplication app, String scope) {
275276
Set<String> scopes = new HashSet<>();
276277
scopes.add(scope);
277-
ClientCredentialParameters clientCredentials = ClientCredentialParameters.builder(scopes).tenant(IdToken.TENANT_IDENTIFIER).build();
278+
279+
Map<String, String> extraQueryParameters = new HashMap<>();
280+
extraQueryParameters.put("id_token_hint", "token_hint_value");
281+
extraQueryParameters.put("test", "test");
282+
283+
ClientCredentialParameters clientCredentials = ClientCredentialParameters.builder(scopes)
284+
.tenant(IdToken.TENANT_IDENTIFIER)
285+
.extraQueryParameters(extraQueryParameters)
286+
.build();
278287
RequestContext requestContext = new RequestContext(
279288
app,
280289
PublicApi.ACQUIRE_TOKEN_FOR_CLIENT,

msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/TokenCacheIT.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.testng.annotations.Test;
1010

1111
import java.util.Collections;
12+
import java.util.HashMap;
13+
import java.util.Map;
1214
import java.util.Set;
1315

1416
public class TokenCacheIT {
@@ -32,10 +34,14 @@ public void singleAccountInCache_RemoveAccountTest() throws Exception {
3234
// Check that cache is empty
3335
Assert.assertEquals(pca.getAccounts().join().size(), 0);
3436

37+
Map<String, String> extraQueryParameters = new HashMap<>();
38+
extraQueryParameters.put("test", "test");
39+
3540
pca.acquireToken(UserNamePasswordParameters.
3641
builder(Collections.singleton(TestConstants.GRAPH_DEFAULT_SCOPE),
3742
user.getUpn(),
3843
user.getPassword().toCharArray())
44+
.extraQueryParameters(extraQueryParameters)
3945
.build())
4046
.get();
4147

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ public class AuthorizationCodeParameters implements IAcquireTokenParameters {
5757
*/
5858
private Map<String, String> extraHttpHeaders;
5959

60+
/**
61+
* Adds additional query parameters to the token request
62+
*/
63+
private Map<String, String> extraQueryParameters;
64+
6065
/**
6166
* Overrides the tenant value in the authority URL for this request
6267
*/

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import lombok.Getter;
88
import lombok.NonNull;
99
import lombok.experimental.Accessors;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1012

1113
import java.net.MalformedURLException;
1214
import java.net.URL;
@@ -37,8 +39,12 @@ public class AuthorizationRequestUrlParameters {
3739
//Unlike other prompts (which are sent as query parameters), admin consent has its own endpoint format
3840
private static final String ADMIN_CONSENT_ENDPOINT = "https://login.microsoftonline.com/{tenant}/adminconsent";
3941

42+
Map<String, String> extraQueryParameters;
43+
4044
Map<String, List<String>> requestParameters = new HashMap<>();
4145

46+
Logger log = LoggerFactory.getLogger(AuthorizationRequestUrlParameters.class);
47+
4248
public static Builder builder(String redirectUri,
4349
Set<String> scopes) {
4450

@@ -152,6 +158,18 @@ private AuthorizationRequestUrlParameters(Builder builder) {
152158
this.instanceAware = builder.instanceAware;
153159
requestParameters.put("instance_aware", Collections.singletonList(String.valueOf(instanceAware)));
154160
}
161+
162+
if(null != builder.extraQueryParameters && !builder.extraQueryParameters.isEmpty()){
163+
this.extraQueryParameters = builder.extraQueryParameters;
164+
for(Map.Entry<String, String> entry: this.extraQueryParameters.entrySet()){
165+
String key = entry.getKey();
166+
String value = entry.getValue();
167+
if(requestParameters.containsKey(key)){
168+
log.warn("A query parameter {} has been provided with values multiple times.", key);
169+
}
170+
requestParameters.put(key, Collections.singletonList(value));
171+
}
172+
}
155173
}
156174

157175
URL createAuthorizationURL(Authority authority,
@@ -194,6 +212,7 @@ public static class Builder {
194212
private Prompt prompt;
195213
private String correlationId;
196214
private boolean instanceAware;
215+
private Map<String, String> extraQueryParameters;
197216

198217
public AuthorizationRequestUrlParameters build() {
199218
return new AuthorizationRequestUrlParameters(this);
@@ -340,5 +359,14 @@ public Builder instanceAware(boolean val) {
340359
this.instanceAware = val;
341360
return self();
342361
}
362+
363+
/**
364+
* Query parameters that you can add to the request,
365+
* in addition to the list of parameters already provided.
366+
*/
367+
public Builder extraQueryParameters(Map<String, String> val) {
368+
this.extraQueryParameters = val;
369+
return self();
370+
}
343371
}
344372
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public class ClientCredentialParameters implements IAcquireTokenParameters {
4444
*/
4545
private Map<String, String> extraHttpHeaders;
4646

47+
/**
48+
* Adds additional query parameters to the token request
49+
*/
50+
private Map<String, String> extraQueryParameters;
51+
4752
/**
4853
* Overrides the tenant value in the authority URL for this request
4954
*/

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public class DeviceCodeFlowParameters implements IAcquireTokenParameters {
4949
*/
5050
private Map<String, String> extraHttpHeaders;
5151

52+
/**
53+
* Adds additional query parameters to the token request
54+
*/
55+
private Map<String, String> extraQueryParameters;
56+
5257
/**
5358
* Overrides the tenant value in the authority URL for this request
5459
*/

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ interface IAcquireTokenParameters {
1616

1717
Map<String, String> extraHttpHeaders();
1818
String tenant();
19+
20+
Map<String, String> extraQueryParameters();
1921
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public class IntegratedWindowsAuthenticationParameters implements IAcquireTokenP
4646
*/
4747
private Map<String, String> extraHttpHeaders;
4848

49+
/**
50+
* Adds additional parameters to the token request
51+
*/
52+
private Map<String, String> extraQueryParameters;
53+
4954
/**
5055
* Overrides the tenant value in the authority URL for this request
5156
*/

0 commit comments

Comments
 (0)