Skip to content

Add operation to get OIDC provider configs. #401

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions src/main/java/com/google/firebase/auth/AbstractFirebaseAuth.java
Original file line number Diff line number Diff line change
Expand Up @@ -978,6 +978,46 @@ protected OidcProviderConfig execute() throws FirebaseAuthException {
};
}

/**
* Gets the provider OIDC Auth config corresponding to the specified provider ID.
*
* @param providerId A provider ID string.
* @return An {@link OidcProviderConfig} instance.
* @throws IllegalArgumentException If the provider ID string is null or empty.
* @throws FirebaseAuthException If an error occurs while retrieving the provider config.
*/
public OidcProviderConfig getOidcProviderConfig(@NonNull String providerId)
throws FirebaseAuthException {
return getOidcProviderConfigOp(providerId).call();
}

/**
* Similar to {@link #getOidcProviderConfig(String)} but performs the operation asynchronously.
*
* @param providerId A provider ID string.
* @return An {@code ApiFuture} which will complete successfully with an
* {@link OidcProviderConfig} instance. If an error occurs while retrieving the provider
* config or if the specified provider ID does not exist, the future throws a
* {@link FirebaseAuthException}.
* @throws IllegalArgumentException If the provider ID string is null or empty.
*/
public ApiFuture<OidcProviderConfig> getOidcProviderConfigAsync(@NonNull String providerId) {
return getOidcProviderConfigOp(providerId).callAsync(firebaseApp);
}

private CallableOperation<OidcProviderConfig, FirebaseAuthException>
getOidcProviderConfigOp(final String providerId) {
checkNotDestroyed();
checkArgument(!Strings.isNullOrEmpty(providerId), "provider ID must not be null or empty");
final FirebaseUserManager userManager = getUserManager();
return new CallableOperation<OidcProviderConfig, FirebaseAuthException>() {
@Override
protected OidcProviderConfig execute() throws FirebaseAuthException {
return userManager.getOidcProviderConfig(providerId);
}
};
}

/**
* Deletes the provider config identified by the specified provider ID.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
*/
class FirebaseUserManager {

static final String CONFIGURATION_NOT_FOUND = "configuration-not-found";
static final String CONFIGURATION_NOT_FOUND_ERROR = "configuration-not-found";
static final String TENANT_ID_MISMATCH_ERROR = "tenant-id-mismatch";
static final String TENANT_NOT_FOUND_ERROR = "tenant-not-found";
static final String USER_NOT_FOUND_ERROR = "user-not-found";
Expand All @@ -75,7 +75,7 @@ class FirebaseUserManager {
// SDK error codes defined at: https://firebase.google.com/docs/auth/admin/errors
private static final Map<String, String> ERROR_CODES = ImmutableMap.<String, String>builder()
.put("CLAIMS_TOO_LARGE", "claims-too-large")
.put("CONFIGURATION_NOT_FOUND", CONFIGURATION_NOT_FOUND)
.put("CONFIGURATION_NOT_FOUND", CONFIGURATION_NOT_FOUND_ERROR)
.put("INSUFFICIENT_PERMISSION", "insufficient-permission")
.put("DUPLICATE_EMAIL", "email-already-exists")
.put("DUPLICATE_LOCAL_ID", "uid-already-exists")
Expand Down Expand Up @@ -330,6 +330,11 @@ OidcProviderConfig createOidcProviderConfig(
return sendRequest("POST", url, request.getProperties(), OidcProviderConfig.class);
}

OidcProviderConfig getOidcProviderConfig(String providerId) throws FirebaseAuthException {
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/oauthIdpConfigs/" + providerId);
return sendRequest("GET", url, null, OidcProviderConfig.class);
}

void deleteProviderConfig(String providerId) throws FirebaseAuthException {
GenericUrl url = new GenericUrl(idpConfigMgtBaseUrl + "/oauthIdpConfigs/" + providerId);
sendRequest("DELETE", url, null, GenericJson.class);
Expand Down
55 changes: 44 additions & 11 deletions src/test/java/com/google/firebase/auth/FirebaseAuthIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -976,17 +976,27 @@ public void testOidcProviderConfigLifecycle() throws Exception {
assertEquals("ClientId", config.getClientId());
assertEquals("https://oidc.com/issuer", config.getIssuer());

// TODO(micahstairs): Test getOidcProviderConfig and updateProviderConfig operations.
try {
// Get config provider
config = auth.getOidcProviderConfigAsync(providerId).get();
assertEquals(providerId, config.getProviderId());
assertEquals("DisplayName", config.getDisplayName());
assertEquals("ClientId", config.getClientId());
assertEquals("https://oidc.com/issuer", config.getIssuer());

// TODO(micahstairs): Test updateProviderConfig operation

// Delete config provider
auth.deleteProviderConfigAsync(providerId).get();
// TODO(micahstairs): Once getOidcProviderConfig operation is implemented, add a check here to
// double-check that the config provider was deleted.
} finally {
// Delete config provider
auth.deleteProviderConfigAsync(providerId).get();
}

assertOidcProviderConfigDoesNotExist(auth, providerId);
}

@Test
public void testTenantAwareOidcProviderConfigLifecycle() throws Exception {
// Create tenant to use.
// Create tenant to use
TenantManager tenantManager = auth.getTenantManager();
Tenant.CreateRequest tenantCreateRequest =
new Tenant.CreateRequest().setDisplayName("DisplayName");
Expand All @@ -1010,12 +1020,22 @@ public void testTenantAwareOidcProviderConfigLifecycle() throws Exception {
assertEquals("ClientId", config.getClientId());
assertEquals("https://oidc.com/issuer", config.getIssuer());

// TODO(micahstairs): Test getOidcProviderConfig and updateProviderConfig operations.
try {
// Get config provider
config = tenantAwareAuth.getOidcProviderConfigAsync(providerId).get();
assertEquals(providerId, config.getProviderId());
assertEquals("DisplayName", config.getDisplayName());
assertEquals("ClientId", config.getClientId());
assertEquals("https://oidc.com/issuer", config.getIssuer());

// TODO(micahstairs): Test updateProviderConfig operation

} finally {
// Delete config provider
tenantAwareAuth.deleteProviderConfigAsync(providerId).get();
}

// Delete config provider
tenantAwareAuth.deleteProviderConfigAsync(providerId).get();
// TODO(micahstairs): Once getOidcProviderConfig operation is implemented, add a check here to
// double-check that the config provider was deleted.
assertOidcProviderConfigDoesNotExist(tenantAwareAuth, providerId);
} finally {
// Delete tenant.
tenantManager.deleteTenantAsync(tenantId).get();
Expand Down Expand Up @@ -1152,6 +1172,19 @@ static RandomUser create() {
}
}


private static void assertOidcProviderConfigDoesNotExist(
AbstractFirebaseAuth firebaseAuth, String providerId) throws Exception {
try {
firebaseAuth.getOidcProviderConfigAsync(providerId).get();
fail("No error thrown for getting a deleted provider config");
} catch (ExecutionException e) {
assertTrue(e.getCause() instanceof FirebaseAuthException);
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR,
((FirebaseAuthException) e.getCause()).getErrorCode());
}
}

private static void assertUserDoesNotExist(AbstractFirebaseAuth firebaseAuth, String uid)
throws Exception {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1491,6 +1491,49 @@ public void testTenantAwareCreateOidcProvider() throws Exception {
checkUrl(interceptor, "POST", TENANTS_BASE_URL + "/TENANT_ID/oauthIdpConfigs");
}

@Test
public void testGetOidcProviderConfig() throws Exception {
TestResponseInterceptor interceptor = initializeAppForUserManagement(
TestUtils.loadResource("oidc.json"));

OidcProviderConfig config =
FirebaseAuth.getInstance().getOidcProviderConfig("oidc.provider-id");

checkOidcProviderConfig(config);
checkRequestHeaders(interceptor);
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/oauthIdpConfigs/oidc.provider-id");
}

@Test
public void testGetOidcProviderConfigWithNotFoundError() throws Exception {
TestResponseInterceptor interceptor =
initializeAppForUserManagementWithStatusCode(404,
"{\"error\": {\"message\": \"CONFIGURATION_NOT_FOUND\"}}");
try {
FirebaseAuth.getInstance().getOidcProviderConfig("oidc.provider-id");
fail("No error thrown for invalid response");
} catch (FirebaseAuthException e) {
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR, e.getErrorCode());
}
checkUrl(interceptor, "GET", PROJECT_BASE_URL + "/oauthIdpConfigs/oidc.provider-id");
}

@Test
public void testGetTenantAwareOidcProviderConfig() throws Exception {
TestResponseInterceptor interceptor = initializeAppForTenantAwareUserManagement(
"TENANT_ID",
TestUtils.loadResource("oidc.json"));
TenantAwareFirebaseAuth tenantAwareAuth =
FirebaseAuth.getInstance().getTenantManager().getAuthForTenant("TENANT_ID");

OidcProviderConfig config = tenantAwareAuth.getOidcProviderConfig("oidc.provider-id");

checkOidcProviderConfig(config);
checkRequestHeaders(interceptor);
checkUrl(interceptor, "GET", TENANTS_BASE_URL + "/TENANT_ID/oauthIdpConfigs/oidc.provider-id");
}


@Test
public void testDeleteProviderConfig() throws Exception {
TestResponseInterceptor interceptor = initializeAppForUserManagement("{}");
Expand All @@ -1510,7 +1553,7 @@ public void testDeleteProviderConfigWithNotFoundError() throws Exception {
FirebaseAuth.getInstance().deleteProviderConfig("UNKNOWN");
fail("No error thrown for invalid response");
} catch (FirebaseAuthException e) {
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND, e.getErrorCode());
assertEquals(FirebaseUserManager.CONFIGURATION_NOT_FOUND_ERROR, e.getErrorCode());
}
checkUrl(interceptor, "DELETE", PROJECT_BASE_URL + "/oauthIdpConfigs/UNKNOWN");
}
Expand Down