Skip to content

Commit f643501

Browse files
committed
Add get operation for SAML provider configs.
1 parent ae4c0ec commit f643501

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
@@ -1242,6 +1242,49 @@ protected SamlProviderConfig execute() throws FirebaseAuthException {
12421242
};
12431243
}
12441244

1245+
/**
1246+
* Gets the SAML provider Auth config corresponding to the specified provider ID.
1247+
*
1248+
* @param providerId A provider ID string.
1249+
* @return An {@link OidcProviderConfig} instance.
1250+
* @throws IllegalArgumentException If the provider ID string is null or empty, or is not prefixed
1251+
* with 'saml'.
1252+
* @throws FirebaseAuthException If an error occurs while retrieving the provider config.
1253+
*/
1254+
public SamlProviderConfig getSamlProviderConfig(@NonNull String providerId)
1255+
throws FirebaseAuthException {
1256+
return getSamlProviderConfigOp(providerId).call();
1257+
}
1258+
1259+
/**
1260+
* Similar to {@link #getSamlProviderConfig(String)} but performs the operation asynchronously.
1261+
* Page size will be limited to 100 provider configs.
1262+
*
1263+
* @param providerId A provider ID string.
1264+
* @return An {@code ApiFuture} which will complete successfully with an
1265+
* {@link SamlProviderConfig} instance. If an error occurs while retrieving the provider
1266+
* config or if the specified provider ID does not exist, the future throws a
1267+
* {@link FirebaseAuthException}.
1268+
* @throws IllegalArgumentException If the provider ID string is null or empty, or is not prefixed
1269+
* with 'saml'.
1270+
*/
1271+
public ApiFuture<SamlProviderConfig> getSamlProviderConfigAsync(@NonNull String providerId) {
1272+
return getSamlProviderConfigOp(providerId).callAsync(firebaseApp);
1273+
}
1274+
1275+
private CallableOperation<SamlProviderConfig, FirebaseAuthException>
1276+
getSamlProviderConfigOp(final String providerId) {
1277+
checkNotDestroyed();
1278+
SamlProviderConfig.checkSamlProviderId(providerId);
1279+
final FirebaseUserManager userManager = getUserManager();
1280+
return new CallableOperation<SamlProviderConfig, FirebaseAuthException>() {
1281+
@Override
1282+
protected SamlProviderConfig execute() throws FirebaseAuthException {
1283+
return userManager.getSamlProviderConfig(providerId);
1284+
}
1285+
};
1286+
}
1287+
12451288
/**
12461289
* Deletes the SAML Auth provider config identified by the specified provider ID.
12471290
*

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

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

352+
SamlProviderConfig getSamlProviderConfig(String providerId) throws FirebaseAuthException {
353+
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + getSamlUrlSuffix(providerId));
354+
return sendRequest("GET", url, null, SamlProviderConfig.class);
355+
}
356+
352357
ListOidcProviderConfigsResponse listOidcProviderConfigs(int maxResults, String pageToken)
353358
throws FirebaseAuthException {
354359
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
@@ -563,7 +563,7 @@ public void testGenerateSignInWithEmailLink() throws Exception {
563563

564564
@Test
565565
public void testOidcProviderConfigLifecycle() throws Exception {
566-
// Create config provider
566+
// Create provider config
567567
String providerId = "oidc.provider-id";
568568
OidcProviderConfig config = temporaryProviderConfig.createOidcProviderConfig(
569569
new OidcProviderConfig.CreateRequest()
@@ -578,15 +578,15 @@ public void testOidcProviderConfigLifecycle() throws Exception {
578578
assertEquals("ClientId", config.getClientId());
579579
assertEquals("https://oidc.com/issuer", config.getIssuer());
580580

581-
// Get config provider
581+
// Get provider config
582582
config = auth.getOidcProviderConfigAsync(providerId).get();
583583
assertEquals(providerId, config.getProviderId());
584584
assertEquals("DisplayName", config.getDisplayName());
585585
assertTrue(config.isEnabled());
586586
assertEquals("ClientId", config.getClientId());
587587
assertEquals("https://oidc.com/issuer", config.getIssuer());
588588

589-
// Update config provider
589+
// Update provider config
590590
OidcProviderConfig.UpdateRequest updateRequest =
591591
new OidcProviderConfig.UpdateRequest(providerId)
592592
.setDisplayName("NewDisplayName")
@@ -600,7 +600,7 @@ public void testOidcProviderConfigLifecycle() throws Exception {
600600
assertEquals("NewClientId", config.getClientId());
601601
assertEquals("https://oidc.com/new-issuer", config.getIssuer());
602602

603-
// Delete config provider
603+
// Delete provider config
604604
temporaryProviderConfig.deleteOidcProviderConfig(providerId);
605605
ProviderConfigTestUtils.assertOidcProviderConfigDoesNotExist(auth, providerId);
606606
}
@@ -676,7 +676,7 @@ public void onSuccess(ListProviderConfigsPage<OidcProviderConfig> result) {
676676

677677
@Test
678678
public void testSamlProviderConfigLifecycle() throws Exception {
679-
// Create config provider
679+
// Create provider config
680680
String providerId = "saml.provider-id";
681681
SamlProviderConfig config = temporaryProviderConfig.createSamlProviderConfig(
682682
new SamlProviderConfig.CreateRequest()
@@ -698,14 +698,21 @@ public void testSamlProviderConfigLifecycle() throws Exception {
698698
assertEquals("RP_ENTITY_ID", config.getRpEntityId());
699699
assertEquals("https://projectId.firebaseapp.com/__/auth/handler", config.getCallbackUrl());
700700

701-
// TODO(micahstairs): Once implemented, add tests for getting and updating the SAML provider
702-
// config.
701+
config = auth.getSamlProviderConfig(providerId);
702+
assertEquals(providerId, config.getProviderId());
703+
assertEquals("DisplayName", config.getDisplayName());
704+
assertTrue(config.isEnabled());
705+
assertEquals("IDP_ENTITY_ID", config.getIdpEntityId());
706+
assertEquals("https://example.com/login", config.getSsoUrl());
707+
assertEquals(ImmutableList.of("certificate1", "certificate2"), config.getX509Certificates());
708+
assertEquals("RP_ENTITY_ID", config.getRpEntityId());
709+
assertEquals("https://projectId.firebaseapp.com/__/auth/handler", config.getCallbackUrl());
703710

704-
// Delete config provider
705-
temporaryProviderConfig.deleteSamlProviderConfig(providerId);
711+
// TODO(micahstairs): Once implemented, add tests for updating the SAML provider config.
706712

707-
// TODO(micahstairs): Once the operation to get a SAML config is implemented, add an assertion
708-
// that the SAML provider does not exist.
713+
// Delete provider config
714+
temporaryProviderConfig.deleteSamlProviderConfig(providerId);
715+
ProviderConfigTestUtils.assertSamlProviderConfigDoesNotExist(auth, providerId);
709716
}
710717

711718
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
@@ -1944,6 +1944,75 @@ public void testTenantAwareCreateSamlProvider() throws Exception {
19441944
checkUrl(interceptor, "POST", TENANTS_BASE_URL + "/TENANT_ID/inboundSamlConfigs");
19451945
}
19461946

1947+
@Test
1948+
public void testGetSamlProviderConfig() throws Exception {
1949+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
1950+
TestUtils.loadResource("saml.json"));
1951+
1952+
SamlProviderConfig config =
1953+
FirebaseAuth.getInstance().getSamlProviderConfig("saml.provider-id");
1954+
1955+
checkSamlProviderConfig(config, "saml.provider-id");
1956+
checkRequestHeaders(interceptor);
1957+
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/inboundSamlConfigs/saml.provider-id");
1958+
}
1959+
1960+
@Test
1961+
public void testGetSamlProviderConfigMissingId() throws Exception {
1962+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
1963+
TestUtils.loadResource("saml.json"));
1964+
1965+
try {
1966+
FirebaseAuth.getInstance().getSamlProviderConfig(null);
1967+
fail("No error thrown for missing provider ID.");
1968+
} catch (IllegalArgumentException e) {
1969+
// Expected.
1970+
}
1971+
}
1972+
1973+
@Test
1974+
public void testGetSamlProviderConfigInvalidId() throws Exception {
1975+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
1976+
TestUtils.loadResource("saml.json"));
1977+
1978+
try {
1979+
FirebaseAuth.getInstance().getSamlProviderConfig("oidc.invalid-saml-provider-id");
1980+
fail("No error thrown for invalid provider ID.");
1981+
} catch (IllegalArgumentException e) {
1982+
// Expected.
1983+
}
1984+
}
1985+
1986+
@Test
1987+
public void testGetSamlProviderConfigWithNotFoundError() throws Exception {
1988+
TestResponseInterceptor interceptor =
1989+
initializeAppForUserManagementWithStatusCode(404,
1990+
"{\"error\": {\"message\": \"CONFIGURATION_NOT_FOUND\"}}");
1991+
try {
1992+
FirebaseAuth.getInstance().getSamlProviderConfig("saml.provider-id");
1993+
fail("No error thrown for invalid response");
1994+
} catch (FirebaseAuthException e) {
1995+
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR, e.getErrorCode());
1996+
}
1997+
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/inboundSamlConfigs/saml.provider-id");
1998+
}
1999+
2000+
@Test
2001+
public void testGetTenantAwareSamlProviderConfig() throws Exception {
2002+
TestResponseInterceptor interceptor = initializeAppForTenantAwareUserManagement(
2003+
"TENANT_ID",
2004+
TestUtils.loadResource("saml.json"));
2005+
TenantAwareFirebaseAuth tenantAwareAuth =
2006+
FirebaseAuth.getInstance().getTenantManager().getAuthForTenant("TENANT_ID");
2007+
2008+
SamlProviderConfig config = tenantAwareAuth.getSamlProviderConfig("saml.provider-id");
2009+
2010+
checkSamlProviderConfig(config, "saml.provider-id");
2011+
checkRequestHeaders(interceptor);
2012+
String expectedUrl = TENANTS_BASE_URL + "/TENANT_ID/inboundSamlConfigs/saml.provider-id";
2013+
checkUrl(interceptor, "GET", expectedUrl);
2014+
}
2015+
19472016
@Test
19482017
public void testDeleteSamlProviderConfig() throws Exception {
19492018
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)