diff --git a/EXAMPLES.md b/EXAMPLES.md index 5f1dd695..b04c9d00 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -4,6 +4,7 @@ - [HTTP Client configuration](#http-client-configuration) - [Verifying an ID token](#verifying-an-id-token) - [Organizations](#organizations) +- [Client credential management](#client-credential-management) - [Asynchronous operations](#asynchronous-operations) ## Error handling @@ -131,6 +132,59 @@ String url = auth.authorizeUrl("https://me.auth0.com/callback") .build(); ``` +## Client credential management + +The SDK provides comprehensive support for managing client credentials used for machine-to-machine authentication and API access. + +### List client credentials + +```java +ManagementAPI mgmt = ManagementAPI.newBuilder("{YOUR_DOMAIN}", "{YOUR_API_TOKEN}").build(); +Request> request = mgmt.clients().listCredentials("{CLIENT_ID}"); +List credentials = request.execute().getBody(); +``` + +### Get a specific client credential + +```java +Request request = mgmt.clients().getCredential("{CLIENT_ID}", "{CREDENTIAL_ID}"); +Credential credential = request.execute().getBody(); +``` + +### Create a new client credential + +```java +Credential newCredential = new Credential("public_key", "{PEM_CONTENT}"); +newCredential.setName("My API Credential"); +Request request = mgmt.clients().createCredential("{CLIENT_ID}", newCredential); +Credential createdCredential = request.execute().getBody(); +``` + +### Update an existing client credential + +```java +Credential updates = new Credential(); +updates.setName("Updated credential name"); +// Note: expires_at can also be updated by setting a Date object +Request request = mgmt.clients().updateCredential("{CLIENT_ID}", "{CREDENTIAL_ID}", updates); +Credential updatedCredential = request.execute().getBody(); +``` + +### Delete a client credential + +```java +Request request = mgmt.clients().deleteCredential("{CLIENT_ID}", "{CREDENTIAL_ID}"); +request.execute(); +``` + +**Required Scopes**: +- `read:client_credentials` - for listing and getting credentials +- `create:client_credentials` - for creating new credentials +- `update:client_credentials` - for updating existing credentials +- `delete:client_credentials` - for deleting credentials + +For more information, see the [Auth0 Management API documentation](https://auth0.com/docs/api/management/v2/clients). + ## Asynchronous operations Requests can be executed asynchronously, using the `executeAsync()` method, which returns a `CompletableFuture`. diff --git a/src/main/java/com/auth0/client/mgmt/ClientsEntity.java b/src/main/java/com/auth0/client/mgmt/ClientsEntity.java index 06bbf123..e44fab74 100644 --- a/src/main/java/com/auth0/client/mgmt/ClientsEntity.java +++ b/src/main/java/com/auth0/client/mgmt/ClientsEntity.java @@ -265,4 +265,32 @@ public Request deleteCredential(String clientId, String credentialId) { .toString(); return new VoidRequest(client, tokenProvider, url, HttpMethod.DELETE); } + + /** + * Update an existing client credential. A token with scope update:client_credentials is needed. + * See https://auth0.com/docs/api/management/v2/clients/patch-credentials-by-credential-id + * + * @param clientId the application's client id. + * @param credentialId the ID of the credential. + * @param credential the credential to update. + * @return a Request to execute. + */ + public Request updateCredential(String clientId, String credentialId, Credential credential) { + Asserts.assertNotNull(clientId, "client id"); + Asserts.assertNotNull(credentialId, "credential id"); + Asserts.assertNotNull(credential, "credential"); + + String url = baseUrl + .newBuilder() + .addPathSegments("api/v2/clients") + .addPathSegment(clientId) + .addPathSegment("credentials") + .addPathSegment(credentialId) + .build() + .toString(); + BaseRequest request = new BaseRequest<>(this.client, tokenProvider, url, HttpMethod.PATCH, new TypeReference() { + }); + request.setBody(credential); + return request; + } } diff --git a/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java b/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java index 8c656d9c..d4600866 100644 --- a/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java +++ b/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java @@ -461,4 +461,47 @@ public void shouldThrowOnDeleteCredentialsWithNullCredentialId() { () -> api.clients().deleteCredential("clientId", null), "'credential id' cannot be null!"); } + + @Test + public void shouldUpdateClientCredential() throws Exception { + Credential credential = new Credential(); + credential.setName("Updated credential name"); + Request request = api.clients().updateCredential("clientId", "credId", credential); + assertThat(request, is(notNullValue())); + + server.jsonResponse(MGMT_CLIENT_CREDENTIAL, 200); + Credential response = request.execute().getBody(); + RecordedRequest recordedRequest = server.takeRequest(); + + assertThat(recordedRequest, hasMethodAndPath(HttpMethod.PATCH, "/api/v2/clients/clientId/credentials/credId")); + assertThat(recordedRequest, hasHeader("Content-Type", "application/json")); + assertThat(recordedRequest, hasHeader("Authorization", "Bearer apiToken")); + + Map body = bodyFromRequest(recordedRequest); + assertThat(body.size(), is(1)); + assertThat(body, hasEntry("name", "Updated credential name")); + + assertThat(response, is(notNullValue())); + } + + @Test + public void shouldThrowOnUpdateCredentialWithNullClientId() { + verifyThrows(IllegalArgumentException.class, + () -> api.clients().updateCredential(null, "credId", new Credential()), + "'client id' cannot be null!"); + } + + @Test + public void shouldThrowOnUpdateCredentialWithNullCredentialId() { + verifyThrows(IllegalArgumentException.class, + () -> api.clients().updateCredential("clientId", null, new Credential()), + "'credential id' cannot be null!"); + } + + @Test + public void shouldThrowOnUpdateCredentialWithNullCredential() { + verifyThrows(IllegalArgumentException.class, + () -> api.clients().updateCredential("clientId", "credId", null), + "'credential' cannot be null!"); + } }