Skip to content

Commit 00c991a

Browse files
authored
Merge pull request #606 from AzureAD/SJAIN/Issue-605
Instance discovery throws exception only with invalid authority
2 parents ed7df00 + cf814eb commit 00c991a

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.microsoft.aad.msal4j;
2+
3+
import org.testng.annotations.Test;
4+
5+
import java.net.URI;
6+
import java.util.Collections;
7+
import java.util.concurrent.CompletableFuture;
8+
import java.util.concurrent.ExecutionException;
9+
10+
public class InvalidAuthorityIT extends SeleniumTest{
11+
12+
@Test(expectedExceptions = ExecutionException.class, expectedExceptionsMessageRegExp = ".*?invalid instance.*?")
13+
public void acquireTokenWithAuthorizationCode_InvalidAuthority() throws Exception{
14+
PublicClientApplication app;
15+
app = PublicClientApplication.builder(
16+
TestConfiguration.AAD_CLIENT_ID)
17+
.authority("https://dummy.microsoft.com/common") //invalid authority, request fails at instance discovery
18+
.build();
19+
20+
CompletableFuture<IAuthenticationResult> future = app.acquireToken(
21+
AuthorizationCodeParameters.builder("auth_code", new URI(TestConfiguration.AAD_DEFAULT_REDIRECT_URI))
22+
.scopes(Collections.singleton("default-scope"))
23+
.authorizationCode("auth_code").redirectUri(new URI(TestConfiguration.AAD_DEFAULT_REDIRECT_URI)).build());
24+
future.get();
25+
}
26+
}

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class AadInstanceDiscoveryProvider {
3838

3939
private static final Logger log = LoggerFactory.getLogger(AadInstanceDiscoveryProvider.class);
4040

41+
//flag to check if instance discovery has failed
42+
private static boolean instanceDiscoveryFailed = false;
4143
static ConcurrentHashMap<String, InstanceDiscoveryMetadataEntry> cache = new ConcurrentHashMap<>();
4244

4345
static {
@@ -84,7 +86,7 @@ static InstanceDiscoveryMetadataEntry getMetadataEntry(URL authorityUrl,
8486
InstanceDiscoveryMetadataEntry result = cache.get(host);
8587

8688
if (result == null) {
87-
if(msalRequest.application().instanceDiscovery()){
89+
if(msalRequest.application().instanceDiscovery() && !instanceDiscoveryFailed){
8890
doInstanceDiscoveryAndCache(authorityUrl, validateAuthority, msalRequest, serviceBundle);
8991
} else {
9092
// instanceDiscovery flag is set to False. Do not perform instanceDiscovery.
@@ -234,12 +236,18 @@ private static AadInstanceDiscoveryResponse sendInstanceDiscoveryRequest(URL aut
234236

235237
httpResponse = executeRequest(instanceDiscoveryRequestUrl, msalRequest.headers().getReadonlyHeaderMap(), msalRequest, serviceBundle);
236238

239+
AadInstanceDiscoveryResponse response = JsonHelper.convertJsonToObject(httpResponse.body(), AadInstanceDiscoveryResponse.class);
240+
237241
if (httpResponse.statusCode() != HttpHelper.HTTP_STATUS_200) {
238-
throw MsalServiceExceptionFactory.fromHttpResponse(httpResponse);
242+
if(httpResponse.statusCode() == HttpHelper.HTTP_STATUS_400 && response.error().equals("invalid_instance")){
243+
// instance discovery failed due to an invalid authority, throw an exception.
244+
throw MsalServiceExceptionFactory.fromHttpResponse(httpResponse);
245+
}
246+
// instance discovery failed due to reasons other than an invalid authority, do not perform instance discovery again in this environment.
247+
instanceDiscoveryFailed = true;
239248
}
240249

241-
242-
return JsonHelper.convertJsonToObject(httpResponse.body(), AadInstanceDiscoveryResponse.class);
250+
return response;
243251
}
244252

245253
private static int determineRegionOutcome(String detectedRegion, String providedRegion, boolean autoDetect) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ class HttpHelper {
2222
public static final int RETRY_DELAY_MS = 1000;
2323

2424
public static final int HTTP_STATUS_200 = 200;
25+
26+
public static final int HTTP_STATUS_400 = 400;
27+
2528
public static final int HTTP_STATUS_429 = 429;
2629
public static final int HTTP_STATUS_500 = 500;
2730

0 commit comments

Comments
 (0)