Skip to content

Commit 9ee4f10

Browse files
authored
Update Identity Flows for IntelliJ and Authorization Code credentials (Azure#37044)
1 parent 30f95dc commit 9ee4f10

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

sdk/identity/azure-identity/src/main/java/com/azure/identity/AuthorizationCodeCredential.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import com.azure.core.credential.AccessToken;
88
import com.azure.core.credential.TokenCredential;
99
import com.azure.core.credential.TokenRequestContext;
10+
import com.azure.core.util.CoreUtils;
1011
import com.azure.core.util.logging.ClientLogger;
1112
import com.azure.identity.implementation.IdentityClient;
1213
import com.azure.identity.implementation.IdentityClientBuilder;
1314
import com.azure.identity.implementation.IdentityClientOptions;
15+
import com.azure.identity.implementation.MsalToken;
1416
import com.azure.identity.implementation.MsalAuthenticationAccount;
1517
import com.azure.identity.implementation.util.LoggingUtil;
1618
import reactor.core.publisher.Mono;
@@ -60,6 +62,7 @@ public class AuthorizationCodeCredential implements TokenCredential {
6062
private boolean isCaeEnabledRequestCached;
6163
private boolean isCaeDisabledRequestCached;
6264
private boolean isCachePopulated;
65+
private final boolean useConfidentialClient;
6366

6467
/**
6568
* Creates an AuthorizationCodeCredential with the given identity client options.
@@ -82,15 +85,21 @@ public class AuthorizationCodeCredential implements TokenCredential {
8285
this.cachedToken = new AtomicReference<>();
8386
this.authCode = authCode;
8487
this.redirectUri = redirectUri;
88+
this.useConfidentialClient = !CoreUtils.isNullOrEmpty(clientSecret);
8589
}
8690

8791
@Override
8892
public Mono<AccessToken> getToken(TokenRequestContext request) {
8993
return Mono.defer(() -> {
9094
isCachePopulated = isCachePopulated(request);
9195
if (isCachePopulated) {
92-
return identityClient.authenticateWithPublicClientCache(request, cachedToken.get())
93-
.onErrorResume(t -> Mono.empty());
96+
if (useConfidentialClient) {
97+
return identityClient.authenticateWithConfidentialClientCache(request, cachedToken.get())
98+
.map(accessToken -> (MsalToken) accessToken);
99+
} else {
100+
return identityClient.authenticateWithPublicClientCache(request, cachedToken.get())
101+
.onErrorResume(t -> Mono.empty());
102+
}
94103
} else {
95104
return Mono.empty();
96105
}

sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/IdentityClient.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,17 +667,33 @@ private SynchronizedAccessor<PublicClientApplication> getPublicClientInstance(To
667667
*/
668668
@SuppressWarnings("deprecation")
669669
public Mono<AccessToken> authenticateWithConfidentialClientCache(TokenRequestContext request) {
670+
return authenticateWithConfidentialClientCache(request, null);
671+
}
672+
673+
/**
674+
* Asynchronously acquire a token from the currently logged in client.
675+
*
676+
* @param request the details of the token request
677+
* @param account the account used to log in to acquire the last token
678+
*
679+
* @return a Publisher that emits an AccessToken
680+
*/
681+
@SuppressWarnings("deprecation")
682+
public Mono<AccessToken> authenticateWithConfidentialClientCache(TokenRequestContext request, IAccount account) {
670683
return getConfidentialClientInstance(request).getValue()
671684
.flatMap(confidentialClient -> Mono.fromFuture(() -> {
672685
SilentParameters.SilentParametersBuilder parametersBuilder = SilentParameters.builder(
673686
new HashSet<>(request.getScopes()))
674687
.tenant(IdentityUtil.resolveTenantId(tenantId, request, options));
688+
if (account != null) {
689+
parametersBuilder.account(account);
690+
}
675691
try {
676692
return confidentialClient.acquireTokenSilently(parametersBuilder.build());
677693
} catch (MalformedURLException e) {
678694
return getFailedCompletableFuture(LOGGER.logExceptionAsError(new RuntimeException(e)));
679695
}
680-
}).map(ar -> (AccessToken) new MsalToken(ar))
696+
}).map(ar -> new MsalToken(ar))
681697
.filter(t -> OffsetDateTime.now().isBefore(t.getExpiresAt().minus(REFRESH_OFFSET))));
682698
}
683699

sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/IntelliJCacheAccessor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,12 @@ public IntelliJAuthMethodDetails getAuthDetailsIfAvailable() throws IOException
308308
return null;
309309
}
310310

311-
IntelliJAuthMethodDetails authMethodDetails = parseAuthMethodDetails(authFile);
311+
IntelliJAuthMethodDetails authMethodDetails;
312+
try {
313+
authMethodDetails = parseAuthMethodDetails(authFile);
314+
} catch (IOException exception) {
315+
throw new CredentialUnavailableException("Error Parsing Authentication Method details.", exception);
316+
}
312317

313318
String authType = authMethodDetails.getAuthMethod();
314319
if (CoreUtils.isNullOrEmpty(authType)) {

0 commit comments

Comments
 (0)