Skip to content

Commit 96df50e

Browse files
authored
Pesomka/client cred silent (#68)
silent flow support for client cred grant
1 parent cf1f07d commit 96df50e

File tree

13 files changed

+240
-165
lines changed

13 files changed

+240
-165
lines changed

src/integrationtest/java/com.microsoft.aad.msal4j/ClientCredentialsIT.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.security.cert.X509Certificate;
3939
import java.util.Collections;
4040

41+
import static com.microsoft.aad.msal4j.TestConstants.GRAPH_DEFAULT_SCOPE;
4142
import static com.microsoft.aad.msal4j.TestConstants.KEYVAULT_DEFAULT_SCOPE;
4243

4344
@Test
@@ -72,8 +73,23 @@ private void assertAcquireTokenCommon(String clientId, IClientCredential credent
7273

7374
Assert.assertNotNull(result);
7475
Assert.assertNotNull(result.accessToken());
75-
// TODO AuthenticationResult should have an getAccountInfo API
76-
// Assert.assertEquals(labResponse.getUser().getUpn(), result.getAccountInfo().getUsername());
76+
77+
String cachedAt = result.accessToken();
78+
79+
result = cca.acquireTokenSilently(SilentParameters
80+
.builder(Collections.singleton(GRAPH_DEFAULT_SCOPE))
81+
.build())
82+
.get();
83+
84+
Assert.assertNull(result);
85+
86+
result = cca.acquireTokenSilently(SilentParameters
87+
.builder(Collections.singleton(KEYVAULT_DEFAULT_SCOPE))
88+
.build())
89+
.get();
90+
91+
Assert.assertNotNull(result);
92+
Assert.assertEquals(result.accessToken(), cachedAt);
7793
}
7894

7995

src/main/java/com/microsoft/aad/msal4j/AcquireTokenSilentSupplier.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323

2424
package com.microsoft.aad.msal4j;
2525

26-
import java.util.Optional;
27-
import java.util.Set;
28-
2926
class AcquireTokenSilentSupplier extends AuthenticationResultSupplier {
3027

3128
private SilentRequest silentRequest;
@@ -44,7 +41,17 @@ AuthenticationResult execute() throws Exception {
4441
getAuthorityWithPrefNetworkHost(silentRequest.requestAuthority().authority());
4542
}
4643

47-
AuthenticationResult res = clientApplication.tokenCache.getAuthenticationResult(
44+
AuthenticationResult res;
45+
46+
if(silentRequest.parameters().account() == null){
47+
res = clientApplication.tokenCache.getCachedAuthenticationResult(
48+
requestAuthority,
49+
silentRequest.parameters().scopes(),
50+
clientApplication.clientId());
51+
return StringHelper.isBlank(res.accessToken()) ? null : res;
52+
}
53+
54+
res = clientApplication.tokenCache.getCachedAuthenticationResult(
4855
silentRequest.parameters().account(),
4956
requestAuthority,
5057
silentRequest.parameters().scopes(),

src/main/java/com/microsoft/aad/msal4j/AuthenticationResultSupplier.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,14 @@ public IAuthenticationResult get() {
7676
true)) {
7777
try {
7878
result = execute();
79-
logResult(result, msalRequest.headers());
80-
8179
apiEvent.setWasSuccessful(true);
82-
if (result.account() != null) {
83-
apiEvent.setTenantId(result.accountCacheEntity().realm());
80+
81+
if(result != null){
82+
logResult(result, msalRequest.headers());
83+
84+
if (result.account() != null) {
85+
apiEvent.setTenantId(result.accountCacheEntity().realm());
86+
}
8487
}
8588
} catch(Exception ex) {
8689
if (ex instanceof AuthenticationException) {

src/main/java/com/microsoft/aad/msal4j/Authority.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import lombok.AccessLevel;
2727
import lombok.Getter;
2828
import lombok.experimental.Accessors;
29+
30+
import java.net.MalformedURLException;
2931
import java.net.URL;
3032

3133
/**
@@ -54,6 +56,10 @@ abstract class Authority {
5456

5557
String tokenEndpoint;
5658

59+
URL tokenEndpointUrl() throws MalformedURLException {
60+
return new URL(tokenEndpoint);
61+
}
62+
5763
Authority(URL canonicalAuthorityUrl){
5864
this.canonicalAuthorityUrl = canonicalAuthorityUrl;
5965
this.authorityType = detectAuthorityType(canonicalAuthorityUrl);

src/main/java/com/microsoft/aad/msal4j/ClientApplicationBase.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,7 @@ AuthenticationResult acquireTokenCommon(MsalRequest msalRequest, Authority reque
140140
headers.getHeaderCorrelationIdValue()));
141141
}
142142

143-
URL url = new URL(requestAuthority.tokenEndpoint());
144-
TokenRequest request = new TokenRequest(url, msalRequest, serviceBundle);
143+
TokenRequest request = new TokenRequest(requestAuthority, msalRequest, serviceBundle);
145144

146145
AuthenticationResult result = request.executeOauthRequestAndProcessResponse();
147146

@@ -150,7 +149,7 @@ AuthenticationResult acquireTokenCommon(MsalRequest msalRequest, Authority reque
150149
} else {
151150
InstanceDiscoveryMetadataEntry instanceDiscoveryMetadata =
152151
AadInstanceDiscovery.GetMetadataEntry
153-
(url, validateAuthority, msalRequest, serviceBundle);
152+
(requestAuthority.canonicalAuthorityUrl(), validateAuthority, msalRequest, serviceBundle);
154153

155154
tokenCache.saveTokens(request, result, instanceDiscoveryMetadata.preferredCache);
156155
}

src/main/java/com/microsoft/aad/msal4j/OAuthAuthorizationGrant.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ private OAuthAuthorizationGrant() {
5555

5656

5757
if (!StringHelper.isBlank(scopes)) {
58+
this.scopes = scopes;
5859
params.put(SCOPE_PARAM_NAME,
5960
Collections.singletonList(String.join(" ",params.get(SCOPE_PARAM_NAME)) + SCOPES_DELIMITER + scopes));
6061
}

src/main/java/com/microsoft/aad/msal4j/SilentParameters.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.Set;
3030

3131
import static com.microsoft.aad.msal4j.ParameterValidationUtils.validateNotEmpty;
32+
import static com.microsoft.aad.msal4j.ParameterValidationUtils.validateNotNull;
3233

3334
@Builder
3435
@Accessors(fluent = true)
@@ -39,7 +40,6 @@ public class SilentParameters {
3940
@NonNull
4041
private Set<String> scopes;
4142

42-
@NonNull
4343
private IAccount account;
4444

4545
private String authorityUrl;
@@ -53,10 +53,17 @@ private static SilentParametersBuilder builder() {
5353

5454
public static SilentParametersBuilder builder(Set<String> scopes, IAccount account) {
5555

56+
validateNotNull("account", account);
5657
validateNotEmpty("scopes", scopes);
5758

5859
return builder()
5960
.scopes(scopes)
6061
.account(account);
6162
}
63+
64+
public static SilentParametersBuilder builder(Set<String> scopes) {
65+
validateNotEmpty("scopes", scopes);
66+
67+
return builder().scopes(scopes);
68+
}
6269
}

0 commit comments

Comments
 (0)