diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java index 31df6a3a8b80..c333e2118d9c 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/EnvironmentCredential.java @@ -38,6 +38,7 @@ public class EnvironmentCredential implements TokenCredential { private final Configuration configuration; private final IdentityClientOptions identityClientOptions; private final ClientLogger logger = new ClientLogger(EnvironmentCredential.class); + private final TokenCredential tokenCredential; /** * Creates an instance of the default environment credential provider. @@ -47,36 +48,39 @@ public class EnvironmentCredential implements TokenCredential { EnvironmentCredential(IdentityClientOptions identityClientOptions) { this.configuration = Configuration.getGlobalConfiguration().clone(); this.identityClientOptions = identityClientOptions; - } + TokenCredential targetCredential = null; - @Override - public Mono getToken(TokenRequestContext request) { - return Mono.fromSupplier(() -> { - String clientId = configuration.get(Configuration.PROPERTY_AZURE_CLIENT_ID); - String tenantId = configuration.get(Configuration.PROPERTY_AZURE_TENANT_ID); - String clientSecret = configuration.get(Configuration.PROPERTY_AZURE_CLIENT_SECRET); - String certPath = configuration.get(Configuration.PROPERTY_AZURE_CLIENT_CERTIFICATE_PATH); - String username = configuration.get(Configuration.PROPERTY_AZURE_USERNAME); - String password = configuration.get(Configuration.PROPERTY_AZURE_PASSWORD); - if (verifyNotNull(clientId)) { - if (verifyNotNull(tenantId, clientSecret)) { - // TODO: support other clouds - return new ClientSecretCredential(tenantId, clientId, clientSecret, identityClientOptions); - } else if (verifyNotNull(tenantId, certPath)) { - return new ClientCertificateCredential(tenantId, clientId, certPath, null, identityClientOptions); - } else if (verifyNotNull(username, password)) { - return new UsernamePasswordCredential(clientId, + String clientId = configuration.get(Configuration.PROPERTY_AZURE_CLIENT_ID); + String tenantId = configuration.get(Configuration.PROPERTY_AZURE_TENANT_ID); + String clientSecret = configuration.get(Configuration.PROPERTY_AZURE_CLIENT_SECRET); + String certPath = configuration.get(Configuration.PROPERTY_AZURE_CLIENT_CERTIFICATE_PATH); + String username = configuration.get(Configuration.PROPERTY_AZURE_USERNAME); + String password = configuration.get(Configuration.PROPERTY_AZURE_PASSWORD); + if (verifyNotNull(clientId)) { + if (verifyNotNull(tenantId, clientSecret)) { + targetCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, identityClientOptions); + } else if (verifyNotNull(tenantId, certPath)) { + targetCredential = new ClientCertificateCredential(tenantId, clientId, certPath, + null, identityClientOptions); + } else if (verifyNotNull(username, password)) { + targetCredential = new UsernamePasswordCredential(clientId, tenantId, username, password, identityClientOptions); - } } + } + tokenCredential = targetCredential; + } - // Other environment variables - throw logger.logExceptionAsError(new CredentialUnavailableException( - "Cannot create any credentials with the current environment variables")); - }).flatMap(cred -> cred.getToken(request)); + @Override + public Mono getToken(TokenRequestContext request) { + if (tokenCredential == null) { + return Mono.error(logger.logExceptionAsError(new CredentialUnavailableException( + "Cannot create any credentials with the current environment variables"))); + } else { + return tokenCredential.getToken(request); + } } private boolean verifyNotNull(String... configs) { diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/IntelliJCredential.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/IntelliJCredential.java index 3798a75f793a..ea868138423e 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/IntelliJCredential.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/IntelliJCredential.java @@ -7,6 +7,7 @@ import com.azure.core.credential.AccessToken; import com.azure.core.credential.TokenCredential; import com.azure.core.credential.TokenRequestContext; +import com.azure.core.util.CoreUtils; import com.azure.identity.implementation.IdentityClient; import com.azure.identity.implementation.IdentityClientBuilder; import com.azure.identity.implementation.IdentityClientOptions; @@ -49,9 +50,11 @@ class IntelliJCredential implements TokenCredential { authMethodDetails = null; } - String azureEnv = authMethodDetails != null ? authMethodDetails.getAzureEnv() : ""; - String cloudInstance = accessor.getAzureAuthHost(azureEnv); - options.setAuthorityHost(cloudInstance); + if (CoreUtils.isNullOrEmpty(options.getAuthorityHost())) { + String azureEnv = authMethodDetails != null ? authMethodDetails.getAzureEnv() : ""; + String cloudInstance = accessor.getAzureAuthHost(azureEnv); + options.setAuthorityHost(cloudInstance); + } String tenant = tenantId; diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java index d7f6ec0e24f7..c1825bc19775 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/VisualStudioCodeCredential.java @@ -6,6 +6,7 @@ import com.azure.core.credential.AccessToken; import com.azure.core.credential.TokenCredential; import com.azure.core.credential.TokenRequestContext; +import com.azure.core.util.CoreUtils; import com.azure.identity.implementation.IdentityClient; import com.azure.identity.implementation.IdentityClientBuilder; import com.azure.identity.implementation.IdentityClientOptions; @@ -35,17 +36,26 @@ class VisualStudioCodeCredential implements TokenCredential { IdentityClientOptions options = (identityClientOptions == null ? new IdentityClientOptions() : identityClientOptions); + String tenant; - String tenant = tenantId; - if (tenant == null) { - tenant = "common"; - } VisualStudioCacheAccessor accessor = new VisualStudioCacheAccessor(); - Map userSettings = accessor.getUserSettingsDetails(tenant); + Map userSettings = accessor.getUserSettingsDetails(); + cloudInstance = userSettings.get("cloud"); - options.setAuthorityHost(accessor.getAzureAuthHost(cloudInstance)); + if (CoreUtils.isNullOrEmpty(options.getAuthorityHost())) { + options.setAuthorityHost(accessor.getAzureAuthHost(cloudInstance)); + } + + if (!CoreUtils.isNullOrEmpty(tenantId)) { + tenant = tenantId; + } else if (userSettings.containsKey("tenant")) { + tenant = userSettings.get("tenant"); + } else { + tenant = "common"; + } identityClient = new IdentityClientBuilder() + .tenantId(tenant) .clientId("aebc6443-996d-45c2-90f0-388ff96faa56") .identityClientOptions(options) .build(); diff --git a/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/VisualStudioCacheAccessor.java b/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/VisualStudioCacheAccessor.java index 8f7ec711abb0..f358bb02c8f9 100644 --- a/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/VisualStudioCacheAccessor.java +++ b/sdk/identity/azure-identity/src/main/java/com/azure/identity/implementation/VisualStudioCacheAccessor.java @@ -59,19 +59,17 @@ private JsonNode getUserSettings() { /** * Get the user configured settings of Visual Studio code. * - * @param tenantId the user specified tenant id. * @return a Map containing Vs Code user settings */ - public Map getUserSettingsDetails(String tenantId) { + public Map getUserSettingsDetails() { JsonNode userSettings = getUserSettings(); Map details = new HashMap<>(); - String tenant = tenantId; - + String tenant = null; String cloud = "Azure"; if (userSettings != null && !userSettings.isNull()) { - if (userSettings.has("azure.tenant") && CoreUtils.isNullOrEmpty(tenant)) { + if (userSettings.has("azure.tenant")) { tenant = userSettings.get("azure.tenant").asText(); } @@ -80,7 +78,10 @@ public Map getUserSettingsDetails(String tenantId) { } } - details.put("tenant", tenant); + if (!CoreUtils.isNullOrEmpty(tenant)) { + details.put("tenant", tenant); + } + details.put("cloud", cloud); return details; }