Skip to content

Commit 424d9ce

Browse files
committed
Add getOidcProviderConfig operation. (#401)
This adds an operation to get OIDC provider configs (can be done using either the tenant-aware or standard Firebase client). This work is part of adding multi-tenancy support (see issue #332).
1 parent db81c06 commit 424d9ce

File tree

4 files changed

+135
-14
lines changed

4 files changed

+135
-14
lines changed

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

+40
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,46 @@ protected OidcProviderConfig execute() throws FirebaseAuthException {
11151115
};
11161116
}
11171117

1118+
/**
1119+
* Gets the provider OIDC Auth config corresponding to the specified provider ID.
1120+
*
1121+
* @param providerId A provider ID string.
1122+
* @return An {@link OidcProviderConfig} instance.
1123+
* @throws IllegalArgumentException If the provider ID string is null or empty.
1124+
* @throws FirebaseAuthException If an error occurs while retrieving the provider config.
1125+
*/
1126+
public OidcProviderConfig getOidcProviderConfig(@NonNull String providerId)
1127+
throws FirebaseAuthException {
1128+
return getOidcProviderConfigOp(providerId).call();
1129+
}
1130+
1131+
/**
1132+
* Similar to {@link #getOidcProviderConfig(String)} but performs the operation asynchronously.
1133+
*
1134+
* @param providerId A provider ID string.
1135+
* @return An {@code ApiFuture} which will complete successfully with an
1136+
* {@link OidcProviderConfig} instance. If an error occurs while retrieving the provider
1137+
* config or if the specified provider ID does not exist, the future throws a
1138+
* {@link FirebaseAuthException}.
1139+
* @throws IllegalArgumentException If the provider ID string is null or empty.
1140+
*/
1141+
public ApiFuture<OidcProviderConfig> getOidcProviderConfigAsync(@NonNull String providerId) {
1142+
return getOidcProviderConfigOp(providerId).callAsync(firebaseApp);
1143+
}
1144+
1145+
private CallableOperation<OidcProviderConfig, FirebaseAuthException>
1146+
getOidcProviderConfigOp(final String providerId) {
1147+
checkNotDestroyed();
1148+
checkArgument(!Strings.isNullOrEmpty(providerId), "provider ID must not be null or empty");
1149+
final FirebaseUserManager userManager = getUserManager();
1150+
return new CallableOperation<OidcProviderConfig, FirebaseAuthException>() {
1151+
@Override
1152+
protected OidcProviderConfig execute() throws FirebaseAuthException {
1153+
return userManager.getOidcProviderConfig(providerId);
1154+
}
1155+
};
1156+
}
1157+
11181158
/**
11191159
* Deletes the provider config identified by the specified provider ID.
11201160
*

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
*/
7070
class FirebaseUserManager {
7171

72-
static final String CONFIGURATION_NOT_FOUND = "configuration-not-found";
72+
static final String CONFIGURATION_NOT_FOUND_ERROR = "configuration-not-found";
7373
static final String TENANT_ID_MISMATCH_ERROR = "tenant-id-mismatch";
7474
static final String TENANT_NOT_FOUND_ERROR = "tenant-not-found";
7575
static final String USER_NOT_FOUND_ERROR = "user-not-found";
@@ -79,7 +79,7 @@ class FirebaseUserManager {
7979
// SDK error codes defined at: https://firebase.google.com/docs/auth/admin/errors
8080
private static final Map<String, String> ERROR_CODES = ImmutableMap.<String, String>builder()
8181
.put("CLAIMS_TOO_LARGE", "claims-too-large")
82-
.put("CONFIGURATION_NOT_FOUND", CONFIGURATION_NOT_FOUND)
82+
.put("CONFIGURATION_NOT_FOUND", CONFIGURATION_NOT_FOUND_ERROR)
8383
.put("INSUFFICIENT_PERMISSION", "insufficient-permission")
8484
.put("DUPLICATE_EMAIL", "email-already-exists")
8585
.put("DUPLICATE_LOCAL_ID", "uid-already-exists")
@@ -380,6 +380,11 @@ OidcProviderConfig createOidcProviderConfig(
380380
return sendRequest("POST", url, request.getProperties(), OidcProviderConfig.class);
381381
}
382382

383+
OidcProviderConfig getOidcProviderConfig(String providerId) throws FirebaseAuthException {
384+
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/oauthIdpConfigs/" + providerId);
385+
return sendRequest("GET", url, null, OidcProviderConfig.class);
386+
}
387+
383388
void deleteProviderConfig(String providerId) throws FirebaseAuthException {
384389
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/oauthIdpConfigs/" + providerId);
385390
sendRequest("DELETE", url, null, GenericJson.class);

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

+44-11
Original file line numberDiff line numberDiff line change
@@ -1077,17 +1077,27 @@ public void testOidcProviderConfigLifecycle() throws Exception {
10771077
assertEquals("ClientId", config.getClientId());
10781078
assertEquals("https://oidc.com/issuer", config.getIssuer());
10791079

1080-
// TODO(micahstairs): Test getOidcProviderConfig and updateProviderConfig operations.
1080+
try {
1081+
// Get config provider
1082+
config = auth.getOidcProviderConfigAsync(providerId).get();
1083+
assertEquals(providerId, config.getProviderId());
1084+
assertEquals("DisplayName", config.getDisplayName());
1085+
assertEquals("ClientId", config.getClientId());
1086+
assertEquals("https://oidc.com/issuer", config.getIssuer());
1087+
1088+
// TODO(micahstairs): Test updateProviderConfig operation
10811089

1082-
// Delete config provider
1083-
auth.deleteProviderConfigAsync(providerId).get();
1084-
// TODO(micahstairs): Once getOidcProviderConfig operation is implemented, add a check here to
1085-
// double-check that the config provider was deleted.
1090+
} finally {
1091+
// Delete config provider
1092+
auth.deleteProviderConfigAsync(providerId).get();
1093+
}
1094+
1095+
assertOidcProviderConfigDoesNotExist(auth, providerId);
10861096
}
10871097

10881098
@Test
10891099
public void testTenantAwareOidcProviderConfigLifecycle() throws Exception {
1090-
// Create tenant to use.
1100+
// Create tenant to use
10911101
TenantManager tenantManager = auth.getTenantManager();
10921102
Tenant.CreateRequest tenantCreateRequest =
10931103
new Tenant.CreateRequest().setDisplayName("DisplayName");
@@ -1111,12 +1121,22 @@ public void testTenantAwareOidcProviderConfigLifecycle() throws Exception {
11111121
assertEquals("ClientId", config.getClientId());
11121122
assertEquals("https://oidc.com/issuer", config.getIssuer());
11131123

1114-
// TODO(micahstairs): Test getOidcProviderConfig and updateProviderConfig operations.
1124+
try {
1125+
// Get config provider
1126+
config = tenantAwareAuth.getOidcProviderConfigAsync(providerId).get();
1127+
assertEquals(providerId, config.getProviderId());
1128+
assertEquals("DisplayName", config.getDisplayName());
1129+
assertEquals("ClientId", config.getClientId());
1130+
assertEquals("https://oidc.com/issuer", config.getIssuer());
1131+
1132+
// TODO(micahstairs): Test updateProviderConfig operation
1133+
1134+
} finally {
1135+
// Delete config provider
1136+
tenantAwareAuth.deleteProviderConfigAsync(providerId).get();
1137+
}
11151138

1116-
// Delete config provider
1117-
tenantAwareAuth.deleteProviderConfigAsync(providerId).get();
1118-
// TODO(micahstairs): Once getOidcProviderConfig operation is implemented, add a check here to
1119-
// double-check that the config provider was deleted.
1139+
assertOidcProviderConfigDoesNotExist(tenantAwareAuth, providerId);
11201140
} finally {
11211141
// Delete tenant.
11221142
tenantManager.deleteTenantAsync(tenantId).get();
@@ -1253,6 +1273,19 @@ static RandomUser create() {
12531273
}
12541274
}
12551275

1276+
1277+
private static void assertOidcProviderConfigDoesNotExist(
1278+
AbstractFirebaseAuth firebaseAuth, String providerId) throws Exception {
1279+
try {
1280+
firebaseAuth.getOidcProviderConfigAsync(providerId).get();
1281+
fail("No error thrown for getting a deleted provider config");
1282+
} catch (ExecutionException e) {
1283+
assertTrue(e.getCause() instanceof FirebaseAuthException);
1284+
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR,
1285+
((FirebaseAuthException) e.getCause()).getErrorCode());
1286+
}
1287+
}
1288+
12561289
private static void assertUserDoesNotExist(AbstractFirebaseAuth firebaseAuth, String uid)
12571290
throws Exception {
12581291
try {

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

+44-1
Original file line numberDiff line numberDiff line change
@@ -1716,6 +1716,49 @@ public void testTenantAwareCreateOidcProvider() throws Exception {
17161716
checkUrl(interceptor, "POST", TENANTS_BASE_URL + "/TENANT_ID/oauthIdpConfigs");
17171717
}
17181718

1719+
@Test
1720+
public void testGetOidcProviderConfig() throws Exception {
1721+
TestResponseInterceptor interceptor = initializeAppForUserManagement(
1722+
TestUtils.loadResource("oidc.json"));
1723+
1724+
OidcProviderConfig config =
1725+
FirebaseAuth.getInstance().getOidcProviderConfig("oidc.provider-id");
1726+
1727+
checkOidcProviderConfig(config);
1728+
checkRequestHeaders(interceptor);
1729+
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/oauthIdpConfigs/oidc.provider-id");
1730+
}
1731+
1732+
@Test
1733+
public void testGetOidcProviderConfigWithNotFoundError() throws Exception {
1734+
TestResponseInterceptor interceptor =
1735+
initializeAppForUserManagementWithStatusCode(404,
1736+
"{\"error\": {\"message\": \"CONFIGURATION_NOT_FOUND\"}}");
1737+
try {
1738+
FirebaseAuth.getInstance().getOidcProviderConfig("oidc.provider-id");
1739+
fail("No error thrown for invalid response");
1740+
} catch (FirebaseAuthException e) {
1741+
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR, e.getErrorCode());
1742+
}
1743+
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/oauthIdpConfigs/oidc.provider-id");
1744+
}
1745+
1746+
@Test
1747+
public void testGetTenantAwareOidcProviderConfig() throws Exception {
1748+
TestResponseInterceptor interceptor = initializeAppForTenantAwareUserManagement(
1749+
"TENANT_ID",
1750+
TestUtils.loadResource("oidc.json"));
1751+
TenantAwareFirebaseAuth tenantAwareAuth =
1752+
FirebaseAuth.getInstance().getTenantManager().getAuthForTenant("TENANT_ID");
1753+
1754+
OidcProviderConfig config = tenantAwareAuth.getOidcProviderConfig("oidc.provider-id");
1755+
1756+
checkOidcProviderConfig(config);
1757+
checkRequestHeaders(interceptor);
1758+
checkUrl(interceptor, "GET", TENANTS_BASE_URL + "/TENANT_ID/oauthIdpConfigs/oidc.provider-id");
1759+
}
1760+
1761+
17191762
@Test
17201763
public void testDeleteProviderConfig() throws Exception {
17211764
TestResponseInterceptor interceptor = initializeAppForUserManagement("{}");
@@ -1735,7 +1778,7 @@ public void testDeleteProviderConfigWithNotFoundError() throws Exception {
17351778
FirebaseAuth.getInstance().deleteProviderConfig("UNKNOWN");
17361779
fail("No error thrown for invalid response");
17371780
} catch (FirebaseAuthException e) {
1738-
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND, e.getErrorCode());
1781+
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR, e.getErrorCode());
17391782
}
17401783
checkUrl(interceptor, "DELETE", PROJECT_BASE_URL + "/oauthIdpConfigs/UNKNOWN");
17411784
}

0 commit comments

Comments
 (0)