diff --git a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AcquireTokenInteractiveIT.java b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AcquireTokenInteractiveIT.java index c9257379..edce1e88 100644 --- a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AcquireTokenInteractiveIT.java +++ b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/AcquireTokenInteractiveIT.java @@ -3,10 +3,7 @@ package com.microsoft.aad.msal4j; -import labapi.AzureEnvironment; -import labapi.B2CProvider; -import labapi.FederationProvider; -import labapi.User; +import labapi.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; @@ -16,6 +13,8 @@ import java.net.URI; import java.net.URL; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ExecutionException; public class AcquireTokenInteractiveIT extends SeleniumTest { @@ -73,7 +72,45 @@ public void acquireTokenInteractive_ADFSv2_Federated(String environment) { public void acquireTokenInteractive_Ciam() { User user = labUserProvider.getCiamUser(); - assertAcquireTokenCommon(user, TestConstants.CIAM_AUTHORITY, TestConstants.GRAPH_DEFAULT_SCOPE); + Map extraQueryParameters = new HashMap<>(); + extraQueryParameters.put("dc","ESTS-PUB-EUS-AZ1-FD000-TEST1"); + + PublicClientApplication pca; + try { + pca = PublicClientApplication.builder( + user.getAppId()). + authority("https://" + user.getLabName() + ".ciamlogin.com/") + .build(); + } catch (MalformedURLException ex) { + throw new RuntimeException(ex.getMessage()); + } + + IAuthenticationResult result; + try { + URI url = new URI("http://localhost:8080"); + + SystemBrowserOptions browserOptions = + SystemBrowserOptions + .builder() + .openBrowserAction(new SeleniumOpenBrowserAction(user, pca)) + .build(); + + InteractiveRequestParameters parameters = InteractiveRequestParameters + .builder(url) + .scopes(Collections.singleton(TestConstants.GRAPH_DEFAULT_SCOPE)) + .extraQueryParameters(extraQueryParameters) + .systemBrowserOptions(browserOptions) + .build(); + + result = pca.acquireToken(parameters).get(); + + } catch (Exception e) { + LOG.error("Error acquiring token with authCode: " + e.getMessage()); + throw new RuntimeException("Error acquiring token with authCode: " + e.getMessage()); + } + + assertTokenResultNotNull(result); + Assert.assertEquals(user.getUpn(), result.account().username()); } @Test(dataProvider = "environments", dataProviderClass = EnvironmentsProvider.class) diff --git a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/ClientCredentialsIT.java b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/ClientCredentialsIT.java index 19838d8c..e5c5d157 100644 --- a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/ClientCredentialsIT.java +++ b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/ClientCredentialsIT.java @@ -6,6 +6,7 @@ import labapi.AppCredentialProvider; import labapi.AzureEnvironment; import labapi.LabUserProvider; +import labapi.User; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; @@ -18,6 +19,8 @@ import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.Callable; import static com.microsoft.aad.msal4j.TestConstants.KEYVAULT_DEFAULT_SCOPE; @@ -62,11 +65,29 @@ public void acquireTokenClientCredentials_ClientAssertion() throws Exception { @Test public void acquireTokenClientCredentials_ClientSecret_Ciam() throws Exception { - String clientId = labUserProvider.getCiamUser().getAppId(); + + User user = labUserProvider.getCiamUser(); + String clientId = user.getAppId(); + + Map extraQueryParameters = new HashMap<>(); + extraQueryParameters.put("dc","ESTS-PUB-EUS-AZ1-FD000-TEST1"); AppCredentialProvider appProvider = new AppCredentialProvider(AzureEnvironment.CIAM); IClientCredential credential = ClientCredentialFactory.createFromSecret(appProvider.getOboAppPassword()); + ConfidentialClientApplication cca = ConfidentialClientApplication.builder( + clientId, credential). + authority("https://" + user.getLabName() + ".ciamlogin.com/"). + build(); + + IAuthenticationResult result = cca.acquireToken(ClientCredentialParameters + .builder(Collections.singleton(TestConstants.GRAPH_DEFAULT_SCOPE)) + .extraQueryParameters(extraQueryParameters) + .build()) + .get(); + + Assert.assertNotNull(result); + Assert.assertNotNull(result.accessToken()); assertAcquireTokenCommon(clientId, credential, TestConstants.CIAM_AUTHORITY); } diff --git a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/DeviceCodeIT.java b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/DeviceCodeIT.java index a7ab3a48..4b1d10d1 100644 --- a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/DeviceCodeIT.java +++ b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/DeviceCodeIT.java @@ -43,9 +43,7 @@ public void DeviceCodeFlowADTest(String environment) throws Exception { authority(cfg.tenantSpecificAuthority()). build(); - Consumer deviceCodeConsumer = (DeviceCode deviceCode) -> { - runAutomatedDeviceCodeFlow(deviceCode, user); - }; + Consumer deviceCodeConsumer = (DeviceCode deviceCode) -> runAutomatedDeviceCodeFlow(deviceCode, user); IAuthenticationResult result = pca.acquireToken(DeviceCodeFlowParameters .builder(Collections.singleton(cfg.graphDefaultScope()), @@ -119,7 +117,7 @@ public void DeviceCodeFlowCiamTest() throws Exception { PublicClientApplication pca = PublicClientApplication.builder( user.getAppId()). - authority(TestConstants.CIAM_AUTHORITY). + authority("https://" + user.getLabName() + ".ciamlogin.com/"). build(); Consumer deviceCodeConsumer = (DeviceCode deviceCode) -> { @@ -174,7 +172,7 @@ private void runAutomatedDeviceCodeFlow(DeviceCode deviceCode, User user) { if (isADFS2019) { SeleniumExtensions.performADFS2019Login(seleniumDriver, user); } else { - SeleniumExtensions.performADLogin(seleniumDriver, user); + SeleniumExtensions.performADOrCiamLogin(seleniumDriver, user); } } catch (Exception e) { if (!isRunningLocally) { diff --git a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/SeleniumTest.java b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/SeleniumTest.java index 62306e12..ccb218b1 100644 --- a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/SeleniumTest.java +++ b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/SeleniumTest.java @@ -51,9 +51,11 @@ void runSeleniumAutomatedLogin(User user, AbstractClientApplicationBase app) { break; } } else if (authorityType == AuthorityType.AAD) { - SeleniumExtensions.performADLogin(seleniumDriver, user); + SeleniumExtensions.performADOrCiamLogin(seleniumDriver, user); } else if (authorityType == AuthorityType.ADFS) { SeleniumExtensions.performADFS2019Login(seleniumDriver, user); + } else if (authorityType == AuthorityType.CIAM) { + SeleniumExtensions.performADOrCiamLogin(seleniumDriver, user); } } } diff --git a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/TestConstants.java b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/TestConstants.java index e76cb60c..d11fcdf8 100644 --- a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/TestConstants.java +++ b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/TestConstants.java @@ -34,7 +34,10 @@ public class TestConstants { public final static String REGIONAL_MICROSOFT_AUTHORITY_BASIC_HOST_EASTUS = "eastus.login.microsoft.com"; - public final static String CIAM_AUTHORITY = MICROSOFT_AUTHORITY_HOST + "msidlabciam1.onmicrosoft.com"; +// public final static String CIAM_AUTHORITY = MICROSOFT_AUTHORITY_HOST + "msidlabciam1.onmicrosoft.com"; + public final static String CIAM_AUTHORITY = "https://msidlabciam1.ciamlogin.com/" + "msidlabciam1.onmicrosoft.com"; + + public final static String CIAM_TEST_AUTHORITY = "https://contoso0781.ciamlogin.com/6babcaad-604b-40ac-a9d7-9fd97c0b779f/v2.0/.well-known/openid-configuration?dc=ESTS-PUB-EUS-AZ1-FD000-TEST1&ciamhost=true"; public final static String ARLINGTON_ORGANIZATIONS_AUTHORITY = ARLINGTON_MICROSOFT_AUTHORITY_HOST + "organizations/"; public final static String ARLINGTON_TENANT_SPECIFIC_AUTHORITY = ARLINGTON_MICROSOFT_AUTHORITY_HOST + ARLINGTON_AUTHORITY_TENANT; diff --git a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/UsernamePasswordIT.java b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/UsernamePasswordIT.java index cade6134..8b9c9fe0 100644 --- a/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/UsernamePasswordIT.java +++ b/msal4j-sdk/src/integrationtest/java/com.microsoft.aad.msal4j/UsernamePasswordIT.java @@ -9,6 +9,8 @@ import org.testng.annotations.Test; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; @Test() public class UsernamePasswordIT { @@ -100,10 +102,24 @@ public void acquireTokenWithUsernamePassword_ADFSv2(String environment) throws E @Test public void acquireTokenWithUsernamePassword_Ciam() throws Exception { + Map extraQueryParameters = new HashMap<>(); + extraQueryParameters.put("dc","ESTS-PUB-EUS-AZ1-FD000-TEST1"); + User user = labUserProvider.getCiamUser(); + PublicClientApplication pca = PublicClientApplication.builder(user.getAppId()) + .authority("https://" + user.getLabName() + ".ciamlogin.com/") + .build(); - assertAcquireTokenCommon(user, TestConstants.CIAM_AUTHORITY, TestConstants.GRAPH_DEFAULT_SCOPE, - user.getAppId()); + + IAuthenticationResult result = pca.acquireToken(UserNamePasswordParameters. + builder(Collections.singleton(TestConstants.GRAPH_DEFAULT_SCOPE), + user.getUpn(), + user.getPassword().toCharArray()) + .extraQueryParameters(extraQueryParameters) + .build()) + .get(); + + Assert.assertNotNull(result.accessToken()); } @Test @@ -125,6 +141,7 @@ private void assertAcquireTokenCommonAAD(User user) throws Exception { private void assertAcquireTokenCommon(User user, String authority, String scope, String appId) throws Exception { + PublicClientApplication pca = PublicClientApplication.builder( appId). authority(authority). @@ -135,6 +152,7 @@ private void assertAcquireTokenCommon(User user, String authority, String scope, user.getUpn(), user.getPassword().toCharArray()) .build()) + .get(); assertTokenResultNotNull(result); diff --git a/msal4j-sdk/src/integrationtest/java/infrastructure/SeleniumExtensions.java b/msal4j-sdk/src/integrationtest/java/infrastructure/SeleniumExtensions.java index f7084c01..c40784b5 100644 --- a/msal4j-sdk/src/integrationtest/java/infrastructure/SeleniumExtensions.java +++ b/msal4j-sdk/src/integrationtest/java/infrastructure/SeleniumExtensions.java @@ -65,8 +65,8 @@ public static WebElement waitForElementToBeVisibleAndEnable(WebDriver driver, By return waitForElementToBeVisibleAndEnable(driver, by, DEFAULT_TIMEOUT_IN_SEC); } - public static void performADLogin(WebDriver driver, User user) { - LOG.info("PerformADLogin"); + public static void performADOrCiamLogin(WebDriver driver, User user) { + LOG.info("performADOrCiamLogin"); UserInformationFields fields = new UserInformationFields(user); @@ -76,7 +76,7 @@ public static void performADLogin(WebDriver driver, User user) { LOG.info("Loggin in ... Clicking after username"); driver.findElement(new By.ById(fields.getAadSignInButtonId())).click(); - if (user.getFederationProvider() == FederationProvider.ADFS_2 && + if (user.getFederationProvider().equals(FederationProvider.ADFS_2) && !user.getLabName().equals(LabConstants.ARLINGTON_LAB_NAME)) { LOG.info("Loggin in ... ADFS-V2 - Entering the username in ADFSv2 form"); @@ -96,6 +96,7 @@ public static void performADLogin(WebDriver driver, User user) { checkAuthenticationCompletePage(driver); return; } catch (TimeoutException ex) { + LOG.error(ex.getMessage()); } LOG.info("Checking optional questions"); @@ -107,6 +108,7 @@ public static void performADLogin(WebDriver driver, User user) { LOG.info("Are you trying to sign in to ... ? click Continue"); } catch (TimeoutException ex) { + LOG.error(ex.getMessage()); } try { @@ -115,6 +117,7 @@ public static void performADLogin(WebDriver driver, User user) { click(); LOG.info("Stay signed in? click NO"); } catch (TimeoutException ex) { + LOG.error(ex.getMessage()); } } diff --git a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AbstractClientApplicationBase.java b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AbstractClientApplicationBase.java index 0bcd0077..37ee24d5 100644 --- a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AbstractClientApplicationBase.java +++ b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AbstractClientApplicationBase.java @@ -357,7 +357,7 @@ public T authority(String val) throws MalformedURLException { authority = Authority.enforceTrailingSlash(val); URL authorityURL = new URL(authority); - Authority.validateAuthority(authorityURL); + switch (Authority.detectAuthorityType(authorityURL)) { case AAD: @@ -366,10 +366,15 @@ public T authority(String val) throws MalformedURLException { case ADFS: authenticationAuthority = new ADFSAuthority(authorityURL); break; + case CIAM: + authenticationAuthority = new CIAMAuthority(authorityURL); + break; default: throw new IllegalArgumentException("Unsupported authority type."); } + Authority.validateAuthority(authenticationAuthority.canonicalAuthorityUrl()); + return self(); } diff --git a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/Authority.java b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/Authority.java index dea2281b..5644db45 100644 --- a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/Authority.java +++ b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/Authority.java @@ -54,19 +54,22 @@ private void setCommonAuthorityProperties() { this.host = canonicalAuthorityUrl.getAuthority().toLowerCase(); } - static Authority createAuthority(URL authorityUrl) { - validateAuthority(authorityUrl); - + static Authority createAuthority(URL authorityUrl) throws MalformedURLException{ + Authority createdAuthority; AuthorityType authorityType = detectAuthorityType(authorityUrl); if (authorityType == AuthorityType.AAD) { - return new AADAuthority(authorityUrl); + createdAuthority = new AADAuthority(authorityUrl); } else if (authorityType == AuthorityType.B2C) { - return new B2CAuthority(authorityUrl); + createdAuthority = new B2CAuthority(authorityUrl); } else if (authorityType == AuthorityType.ADFS) { - return new ADFSAuthority(authorityUrl); + createdAuthority = new ADFSAuthority(authorityUrl); + } else if(authorityType == AuthorityType.CIAM){ + createdAuthority = new CIAMAuthority(authorityUrl); } else { throw new IllegalArgumentException("Unsupported Authority Type"); } + validateAuthority(createdAuthority.canonicalAuthorityUrl()); + return createdAuthority; } static AuthorityType detectAuthorityType(URL authorityUrl) { @@ -76,6 +79,9 @@ static AuthorityType detectAuthorityType(URL authorityUrl) { final String path = authorityUrl.getPath().substring(1); if (StringHelper.isBlank(path)) { + if(isCiamAuthority(authorityUrl.getHost())){ + return AuthorityType.CIAM; + } throw new IllegalArgumentException( "authority Uri should have at least one segment in the path (i.e. https:////...)"); } @@ -87,7 +93,9 @@ static AuthorityType detectAuthorityType(URL authorityUrl) { return AuthorityType.B2C; } else if (isAdfsAuthority(firstPath)) { return AuthorityType.ADFS; - } else { + } else if(isCiamAuthority(host)){ + return AuthorityType.CIAM; + } else{ return AuthorityType.AAD; } } @@ -154,6 +162,10 @@ private static boolean isB2CAuthority(final String host, final String firstPath) return host.contains(B2C_HOST_SEGMENT) || firstPath.compareToIgnoreCase(B2C_PATH_SEGMENT) == 0; } + private static boolean isCiamAuthority(final String host){ + return host.endsWith(CIAMAuthority.CIAM_HOST_SEGMENT); + } + String deviceCodeEndpoint() { return deviceCodeEndpoint; } diff --git a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthorityType.java b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthorityType.java index aa442d74..f686f2f2 100644 --- a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthorityType.java +++ b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/AuthorityType.java @@ -4,5 +4,5 @@ package com.microsoft.aad.msal4j; enum AuthorityType { - AAD, ADFS, B2C + AAD, ADFS, B2C, CIAM } diff --git a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/CIAMAuthority.java b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/CIAMAuthority.java new file mode 100644 index 00000000..5d4795a6 --- /dev/null +++ b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/CIAMAuthority.java @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.aad.msal4j; + +import java.net.MalformedURLException; +import java.net.URL; + +public class CIAMAuthority extends Authority{ + + public static final String CIAM_HOST_SEGMENT = ".ciamlogin.com"; + + static final String AUTHORIZATION_ENDPOINT = "oauth2/v2.0/authorize"; + static final String TOKEN_ENDPOINT = "oauth2/v2.0/token"; + static final String DEVICE_CODE_ENDPOINT = "oauth2/v2.0/devicecode"; + + private static final String CIAM_AUTHORITY_FORMAT = "https://%s/%s/"; + private static final String DEVICE_CODE_ENDPOINT_FORMAT = CIAM_AUTHORITY_FORMAT + DEVICE_CODE_ENDPOINT; + + private static final String CIAM_AUTHORIZATION_ENDPOINT_FORMAT = CIAM_AUTHORITY_FORMAT + AUTHORIZATION_ENDPOINT; + private static final String CIAM_TOKEN_ENDPOINT_FORMAT = CIAM_AUTHORITY_FORMAT + TOKEN_ENDPOINT; + + CIAMAuthority(URL authorityUrl) throws MalformedURLException { + super(transformAuthority(authorityUrl), AuthorityType.CIAM); + setAuthorityProperties(); + this.authority = String.format(CIAM_AUTHORITY_FORMAT,host,tenant); + } + + /** This method takes a CIAM authority string of format "tenant.ciamlogin.com" or "https://tenant.ciamlogin.com" + and converts it into a full authority url with a path segment of format "/tenant.onmicrosoft.com" + * @param originalAuthority authority to be transformed + * @return full CIAM authority with path + */ + protected static URL transformAuthority(URL originalAuthority) throws MalformedURLException { + String host = originalAuthority.getHost() + originalAuthority.getPath(); + String transformedAuthority = originalAuthority.toString(); + if(originalAuthority.getPath().equals("/")){ + int ciamHostIndex = host.indexOf(CIAMAuthority.CIAM_HOST_SEGMENT); + String tenant = host.substring(0 , ciamHostIndex); + transformedAuthority = originalAuthority + tenant + ".onmicrosoft.com/"; + } + return new URL(transformedAuthority); + } + + private void setAuthorityProperties() { + this.authorizationEndpoint = String.format(CIAM_AUTHORIZATION_ENDPOINT_FORMAT, host, tenant); + this.tokenEndpoint = String.format(CIAM_TOKEN_ENDPOINT_FORMAT, host, tenant); + this.deviceCodeEndpoint = String.format(DEVICE_CODE_ENDPOINT_FORMAT, host, tenant); + this.selfSignedJwtAudience = this.tokenEndpoint; + } +} diff --git a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/PublicClientApplication.java b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/PublicClientApplication.java index a7f18dda..80fa1c31 100644 --- a/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/PublicClientApplication.java +++ b/msal4j-sdk/src/main/java/com/microsoft/aad/msal4j/PublicClientApplication.java @@ -66,10 +66,9 @@ public CompletableFuture acquireToken(IntegratedWindowsAu @Override public CompletableFuture acquireToken(DeviceCodeFlowParameters parameters) { - if (!(AuthorityType.AAD.equals(authenticationAuthority.authorityType()) || - AuthorityType.ADFS.equals(authenticationAuthority.authorityType()))) { + if (AuthorityType.B2C.equals(authenticationAuthority.authorityType())) { throw new IllegalArgumentException( - "Invalid authority type. Device Flow is only supported by AAD and ADFS authorities"); + "Invalid authority type. Device Flow is not supported by B2C authority."); } validateNotNull("parameters", parameters); diff --git a/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/AuthorityTest.java b/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/AuthorityTest.java index ea5a99a8..cd0a8bf4 100644 --- a/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/AuthorityTest.java +++ b/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/AuthorityTest.java @@ -34,6 +34,32 @@ public void testDetectAuthorityType_B2C() throws Exception { Assert.assertEquals(Authority.detectAuthorityType(url), AuthorityType.B2C); } + @DataProvider(name = "ciamAuthorities") + public static Object[][] createCiamAuthorityData() throws MalformedURLException { + return new Object[][]{{new URL("https://msidlabciam1.ciamlogin.com/")}, + {new URL("https://msidlabciam1.ciamlogin.com/d57fb3d4-4b5a-4144-9328-9c1f7d58179d/")}, + {new URL("https://msidlabciam1.ciamlogin.com/msidlabciam1.onmicrosoft.com/")}, + {new URL("https://msidlabciam1.ciamlogin.com/aDomain/")}}; + } + + @Test(dataProvider = "ciamAuthorities") + public void testDetectAuthorityType_CIAM(URL authority) throws Exception { + Assert.assertEquals(Authority.detectAuthorityType(authority), AuthorityType.CIAM); + } + + @DataProvider(name = "validCiamAuthoritiesAndTransformedAuthority") + public static Object[][] createCiamAndTransformedAuthorityData() throws MalformedURLException { + return new Object[][]{{new URL("https://msidlabciam1.ciamlogin.com/"),new URL("https://msidlabciam1.ciamlogin.com/msidlabciam1.onmicrosoft.com/")}, + {new URL("https://msidlabciam1.ciamlogin.com/d57fb3d4-4b5a-4144-9328-9c1f7d58179d"),new URL("https://msidlabciam1.ciamlogin.com/d57fb3d4-4b5a-4144-9328-9c1f7d58179d")}, + {new URL("https://msidlabciam1.ciamlogin.com/msidlabciam1.onmicrosoft.com"),new URL("https://msidlabciam1.ciamlogin.com/msidlabciam1.onmicrosoft.com")}, + {new URL("https://msidlabciam1.ciamlogin.com/aDomain"),new URL("https://msidlabciam1.ciamlogin.com/aDomain")}}; + } + + @Test(dataProvider = "validCiamAuthoritiesAndTransformedAuthority") + public void testCiamAuthorityTransformation(URL authority, URL transformedAuthority) throws Exception{ + Assert.assertEquals(CIAMAuthority.transformAuthority(authority), transformedAuthority); + } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Valid B2C 'authority' URLs should follow either of these formats.*") diff --git a/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/DeviceCodeFlowTest.java b/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/DeviceCodeFlowTest.java index 80f9955a..1ac60c59 100644 --- a/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/DeviceCodeFlowTest.java +++ b/msal4j-sdk/src/test/java/com/microsoft/aad/msal4j/DeviceCodeFlowTest.java @@ -145,7 +145,7 @@ public void deviceCodeFlowTest() throws Exception { } @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Invalid authority type. Device Flow is only supported by AAD and ADFS authorities") + expectedExceptionsMessageRegExp = "Invalid authority type. Device Flow is not supported by B2C authority.") public void executeAcquireDeviceCode_B2CAuthorityUsed_IllegalArgumentExceptionThrown() throws Exception {