Skip to content

Commit 7732833

Browse files
committed
Add get operation for SAML provider configs. (#421)
1 parent 0751674 commit 7732833

File tree

6 files changed

+165
-22
lines changed

6 files changed

+165
-22
lines changed

src/main/java/com/google/firebase/auth/AbstractFirebaseAuth.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,6 +1379,49 @@ protected SamlProviderConfig execute() throws FirebaseAuthException {
13791379
};
13801380
}
13811381

1382+
/**
1383+
* Gets the SAML provider Auth config corresponding to the specified provider ID.
1384+
*
1385+
* @param providerId A provider ID string.
1386+
* @return An {@link OidcProviderConfig} instance.
1387+
* @throws IllegalArgumentException If the provider ID string is null or empty, or is not prefixed
1388+
* with 'saml'.
1389+
* @throws FirebaseAuthException If an error occurs while retrieving the provider config.
1390+
*/
1391+
public SamlProviderConfig getSamlProviderConfig(@NonNull String providerId)
1392+
throws FirebaseAuthException {
1393+
return getSamlProviderConfigOp(providerId).call();
1394+
}
1395+
1396+
/**
1397+
* Similar to {@link #getSamlProviderConfig(String)} but performs the operation asynchronously.
1398+
* Page size will be limited to 100 provider configs.
1399+
*
1400+
* @param providerId A provider ID string.
1401+
* @return An {@code ApiFuture} which will complete successfully with an
1402+
* {@link SamlProviderConfig} instance. If an error occurs while retrieving the provider
1403+
* config or if the specified provider ID does not exist, the future throws a
1404+
* {@link FirebaseAuthException}.
1405+
* @throws IllegalArgumentException If the provider ID string is null or empty, or is not prefixed
1406+
* with 'saml'.
1407+
*/
1408+
public ApiFuture<SamlProviderConfig> getSamlProviderConfigAsync(@NonNull String providerId) {
1409+
return getSamlProviderConfigOp(providerId).callAsync(firebaseApp);
1410+
}
1411+
1412+
private CallableOperation<SamlProviderConfig, FirebaseAuthException>
1413+
getSamlProviderConfigOp(final String providerId) {
1414+
checkNotDestroyed();
1415+
SamlProviderConfig.checkSamlProviderId(providerId);
1416+
final FirebaseUserManager userManager = getUserManager();
1417+
return new CallableOperation<SamlProviderConfig, FirebaseAuthException>() {
1418+
@Override
1419+
protected SamlProviderConfig execute() throws FirebaseAuthException {
1420+
return userManager.getSamlProviderConfig(providerId);
1421+
}
1422+
};
1423+
}
1424+
13821425
/**
13831426
* Deletes the SAML Auth provider config identified by the specified provider ID.
13841427
*

src/main/java/com/google/firebase/auth/FirebaseUserManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,11 @@ OidcProviderConfig getOidcProviderConfig(String providerId) throws FirebaseAuthE
399399
return sendRequest("GET", url, null, OidcProviderConfig.class);
400400
}
401401

402+
SamlProviderConfig getSamlProviderConfig(String providerId) throws FirebaseAuthException {
403+
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + getSamlUrlSuffix(providerId));
404+
return sendRequest("GET", url, null, SamlProviderConfig.class);
405+
}
406+
402407
ListOidcProviderConfigsResponse listOidcProviderConfigs(int maxResults, String pageToken)
403408
throws FirebaseAuthException {
404409
ImmutableMap.Builder<String, Object> builder =

src/test/java/com/google/firebase/auth/FirebaseAuthIT.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ public void testGenerateSignInWithEmailLink() throws Exception {
664664

665665
@Test
666666
public void testOidcProviderConfigLifecycle() throws Exception {
667-
// Create config provider
667+
// Create provider config
668668
String providerId = "oidc.provider-id";
669669
OidcProviderConfig config = temporaryProviderConfig.createOidcProviderConfig(
670670
new OidcProviderConfig.CreateRequest()
@@ -679,15 +679,15 @@ public void testOidcProviderConfigLifecycle() throws Exception {
679679
assertEquals("ClientId", config.getClientId());
680680
assertEquals("https://oidc.com/issuer", config.getIssuer());
681681

682-
// Get config provider
682+
// Get provider config
683683
config = auth.getOidcProviderConfigAsync(providerId).get();
684684
assertEquals(providerId, config.getProviderId());
685685
assertEquals("DisplayName", config.getDisplayName());
686686
assertTrue(config.isEnabled());
687687
assertEquals("ClientId", config.getClientId());
688688
assertEquals("https://oidc.com/issuer", config.getIssuer());
689689

690-
// Update config provider
690+
// Update provider config
691691
OidcProviderConfig.UpdateRequest updateRequest =
692692
new OidcProviderConfig.UpdateRequest(providerId)
693693
.setDisplayName("NewDisplayName")
@@ -701,7 +701,7 @@ public void testOidcProviderConfigLifecycle() throws Exception {
701701
assertEquals("NewClientId", config.getClientId());
702702
assertEquals("https://oidc.com/new-issuer", config.getIssuer());
703703

704-
// Delete config provider
704+
// Delete provider config
705705
temporaryProviderConfig.deleteOidcProviderConfig(providerId);
706706
ProviderConfigTestUtils.assertOidcProviderConfigDoesNotExist(auth, providerId);
707707
}
@@ -777,7 +777,7 @@ public void onSuccess(ListProviderConfigsPage<OidcProviderConfig> result) {
777777

778778
@Test
779779
public void testSamlProviderConfigLifecycle() throws Exception {
780-
// Create config provider
780+
// Create provider config
781781
String providerId = "saml.provider-id";
782782
SamlProviderConfig config = temporaryProviderConfig.createSamlProviderConfig(
783783
new SamlProviderConfig.CreateRequest()
@@ -799,14 +799,21 @@ public void testSamlProviderConfigLifecycle() throws Exception {
799799
assertEquals("RP_ENTITY_ID", config.getRpEntityId());
800800
assertEquals("https://projectId.firebaseapp.com/__/auth/handler", config.getCallbackUrl());
801801

802-
// TODO(micahstairs): Once implemented, add tests for getting and updating the SAML provider
803-
// config.
802+
config = auth.getSamlProviderConfig(providerId);
803+
assertEquals(providerId, config.getProviderId());
804+
assertEquals("DisplayName", config.getDisplayName());
805+
assertTrue(config.isEnabled());
806+
assertEquals("IDP_ENTITY_ID", config.getIdpEntityId());
807+
assertEquals("https://example.com/login", config.getSsoUrl());
808+
assertEquals(ImmutableList.of("certificate1", "certificate2"), config.getX509Certificates());
809+
assertEquals("RP_ENTITY_ID", config.getRpEntityId());
810+
assertEquals("https://projectId.firebaseapp.com/__/auth/handler", config.getCallbackUrl());
804811

805-
// Delete config provider
806-
temporaryProviderConfig.deleteSamlProviderConfig(providerId);
812+
// TODO(micahstairs): Once implemented, add tests for updating the SAML provider config.
807813

808-
// TODO(micahstairs): Once the operation to get a SAML config is implemented, add an assertion
809-
// that the SAML provider does not exist.
814+
// Delete provider config
815+
temporaryProviderConfig.deleteSamlProviderConfig(providerId);
816+
ProviderConfigTestUtils.assertSamlProviderConfigDoesNotExist(auth, providerId);
810817
}
811818

812819
private Map<String, String> parseLinkParameters(String link) throws Exception {

src/test/java/com/google/firebase/auth/FirebaseUserManagerTest.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2169,6 +2169,75 @@ public void testTenantAwareCreateSamlProvider() throws Exception {
21692169
checkUrl(interceptor, "POST", TENANTS_BASE_URL + "/TENANT_ID/inboundSamlConfigs");
21702170
}
21712171

2172+
@Test
2173+
public void testGetSamlProviderConfig() throws Exception {
2174+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
2175+
TestUtils.loadResource("saml.json"));
2176+
2177+
SamlProviderConfig config =
2178+
FirebaseAuth.getInstance().getSamlProviderConfig("saml.provider-id");
2179+
2180+
checkSamlProviderConfig(config, "saml.provider-id");
2181+
checkRequestHeaders(interceptor);
2182+
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/inboundSamlConfigs/saml.provider-id");
2183+
}
2184+
2185+
@Test
2186+
public void testGetSamlProviderConfigMissingId() throws Exception {
2187+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
2188+
TestUtils.loadResource("saml.json"));
2189+
2190+
try {
2191+
FirebaseAuth.getInstance().getSamlProviderConfig(null);
2192+
fail("No error thrown for missing provider ID.");
2193+
} catch (IllegalArgumentException e) {
2194+
// Expected.
2195+
}
2196+
}
2197+
2198+
@Test
2199+
public void testGetSamlProviderConfigInvalidId() throws Exception {
2200+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
2201+
TestUtils.loadResource("saml.json"));
2202+
2203+
try {
2204+
FirebaseAuth.getInstance().getSamlProviderConfig("oidc.invalid-saml-provider-id");
2205+
fail("No error thrown for invalid provider ID.");
2206+
} catch (IllegalArgumentException e) {
2207+
// Expected.
2208+
}
2209+
}
2210+
2211+
@Test
2212+
public void testGetSamlProviderConfigWithNotFoundError() throws Exception {
2213+
TestResponseInterceptor interceptor =
2214+
initializeAppForUserManagementWithStatusCode(404,
2215+
"{\"error\": {\"message\": \"CONFIGURATION_NOT_FOUND\"}}");
2216+
try {
2217+
FirebaseAuth.getInstance().getSamlProviderConfig("saml.provider-id");
2218+
fail("No error thrown for invalid response");
2219+
} catch (FirebaseAuthException e) {
2220+
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR, e.getErrorCode());
2221+
}
2222+
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/inboundSamlConfigs/saml.provider-id");
2223+
}
2224+
2225+
@Test
2226+
public void testGetTenantAwareSamlProviderConfig() throws Exception {
2227+
TestResponseInterceptor interceptor = initializeAppForTenantAwareUserManagement(
2228+
"TENANT_ID",
2229+
TestUtils.loadResource("saml.json"));
2230+
TenantAwareFirebaseAuth tenantAwareAuth =
2231+
FirebaseAuth.getInstance().getTenantManager().getAuthForTenant("TENANT_ID");
2232+
2233+
SamlProviderConfig config = tenantAwareAuth.getSamlProviderConfig("saml.provider-id");
2234+
2235+
checkSamlProviderConfig(config, "saml.provider-id");
2236+
checkRequestHeaders(interceptor);
2237+
String expectedUrl = TENANTS_BASE_URL + "/TENANT_ID/inboundSamlConfigs/saml.provider-id";
2238+
checkUrl(interceptor, "GET", expectedUrl);
2239+
}
2240+
21722241
@Test
21732242
public void testDeleteSamlProviderConfig() throws Exception {
21742243
TestResponseInterceptor interceptor = initializeAppForUserManagement("{}");

src/test/java/com/google/firebase/auth/ProviderConfigTestUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ static void assertOidcProviderConfigDoesNotExist(
4040
}
4141
}
4242

43+
static void assertSamlProviderConfigDoesNotExist(
44+
AbstractFirebaseAuth firebaseAuth, String providerId) throws Exception {
45+
try {
46+
firebaseAuth.getSamlProviderConfigAsync(providerId).get();
47+
fail("No error thrown for getting a deleted SAML provider config.");
48+
} catch (ExecutionException e) {
49+
assertTrue(e.getCause() instanceof FirebaseAuthException);
50+
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR,
51+
((FirebaseAuthException) e.getCause()).getErrorCode());
52+
}
53+
}
54+
4355
/**
4456
* Creates temporary provider configs for testing, and deletes them at the end of each test case.
4557
*/

src/test/java/com/google/firebase/auth/TenantAwareFirebaseAuthIT.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ public void testVerifyTokenWithWrongTenantAwareClient() throws Exception {
262262

263263
@Test
264264
public void testOidcProviderConfigLifecycle() throws Exception {
265-
// Create config provider
265+
// Create provider config
266266
String providerId = "oidc.provider-id";
267267
OidcProviderConfig config =
268268
temporaryProviderConfig.createOidcProviderConfig(
@@ -277,14 +277,14 @@ public void testOidcProviderConfigLifecycle() throws Exception {
277277
assertEquals("ClientId", config.getClientId());
278278
assertEquals("https://oidc.com/issuer", config.getIssuer());
279279

280-
// Get config provider
280+
// Get provider config
281281
config = tenantAwareAuth.getOidcProviderConfigAsync(providerId).get();
282282
assertEquals(providerId, config.getProviderId());
283283
assertEquals("DisplayName", config.getDisplayName());
284284
assertEquals("ClientId", config.getClientId());
285285
assertEquals("https://oidc.com/issuer", config.getIssuer());
286286

287-
// Update config provider
287+
// Update provider config
288288
OidcProviderConfig.UpdateRequest updateRequest =
289289
new OidcProviderConfig.UpdateRequest(providerId)
290290
.setDisplayName("NewDisplayName")
@@ -298,7 +298,7 @@ public void testOidcProviderConfigLifecycle() throws Exception {
298298
assertEquals("NewClientId", config.getClientId());
299299
assertEquals("https://oidc.com/new-issuer", config.getIssuer());
300300

301-
// Delete config provider
301+
// Delete provider config
302302
temporaryProviderConfig.deleteOidcProviderConfig(providerId);
303303
ProviderConfigTestUtils.assertOidcProviderConfigDoesNotExist(tenantAwareAuth, providerId);
304304
}
@@ -337,7 +337,7 @@ public void testListOidcProviderConfigs() throws Exception {
337337

338338
@Test
339339
public void testSamlProviderConfigLifecycle() throws Exception {
340-
// Create config provider
340+
// Create provider config
341341
String providerId = "saml.provider-id";
342342
SamlProviderConfig config = temporaryProviderConfig.createSamlProviderConfig(
343343
new SamlProviderConfig.CreateRequest()
@@ -359,14 +359,21 @@ public void testSamlProviderConfigLifecycle() throws Exception {
359359
assertEquals("RP_ENTITY_ID", config.getRpEntityId());
360360
assertEquals("https://projectId.firebaseapp.com/__/auth/handler", config.getCallbackUrl());
361361

362-
// TODO(micahstairs): Once implemented, add tests for getting and updating the SAML provider
363-
// config.
362+
config = tenantAwareAuth.getSamlProviderConfig(providerId);
363+
assertEquals(providerId, config.getProviderId());
364+
assertEquals("DisplayName", config.getDisplayName());
365+
assertTrue(config.isEnabled());
366+
assertEquals("IDP_ENTITY_ID", config.getIdpEntityId());
367+
assertEquals("https://example.com/login", config.getSsoUrl());
368+
assertEquals(ImmutableList.of("certificate1", "certificate2"), config.getX509Certificates());
369+
assertEquals("RP_ENTITY_ID", config.getRpEntityId());
370+
assertEquals("https://projectId.firebaseapp.com/__/auth/handler", config.getCallbackUrl());
364371

365-
// Delete config provider
366-
temporaryProviderConfig.deleteSamlProviderConfig(providerId);
372+
// TODO(micahstairs): Once implemented, add tests for updating the SAML provider config.
367373

368-
// TODO(micahstairs): Once the operation to get a SAML config is implemented, add an assertion
369-
// that the SAML provider does not exist.
374+
// Delete provider config
375+
temporaryProviderConfig.deleteSamlProviderConfig(providerId);
376+
ProviderConfigTestUtils.assertSamlProviderConfigDoesNotExist(tenantAwareAuth, providerId);
370377
}
371378

372379
private String randomPhoneNumber() {

0 commit comments

Comments
 (0)