From 0763af318ecb67193f6ffee74cfef46e613f5692 Mon Sep 17 00:00:00 2001 From: marcossegovia Date: Thu, 8 May 2025 18:36:22 +0200 Subject: [PATCH 1/4] providing new method to enable patch clients credential endpoint --- .../com/auth0/client/mgmt/ClientsEntity.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/com/auth0/client/mgmt/ClientsEntity.java b/src/main/java/com/auth0/client/mgmt/ClientsEntity.java index 06bbf1233..6a61078cf 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:clients is needed. If you also need to update the client_secret and encryption_key attributes the token must have update:client_keys scope. + * 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; + } } From 2b522cfd719fbf88d756455b75db9d66eba20516 Mon Sep 17 00:00:00 2001 From: marcossegovia Date: Thu, 8 May 2025 18:41:12 +0200 Subject: [PATCH 2/4] updating description --- src/main/java/com/auth0/client/mgmt/ClientsEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/auth0/client/mgmt/ClientsEntity.java b/src/main/java/com/auth0/client/mgmt/ClientsEntity.java index 6a61078cf..e44fab74c 100644 --- a/src/main/java/com/auth0/client/mgmt/ClientsEntity.java +++ b/src/main/java/com/auth0/client/mgmt/ClientsEntity.java @@ -267,7 +267,7 @@ public Request deleteCredential(String clientId, String credentialId) { } /** - * Update an existing client credential. A token with scope update:clients is needed. If you also need to update the client_secret and encryption_key attributes the token must have update:client_keys scope. + * 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. From 68c9192705230c0e8b5dbbad0d8019501603d72e Mon Sep 17 00:00:00 2001 From: marcossegovia Date: Sat, 26 Jul 2025 14:24:02 +0200 Subject: [PATCH 3/4] Add comprehensive test coverage and documentation for updateCredential method - Add test cases for updateCredential method including null parameter validation - Add comprehensive client credential management documentation to EXAMPLES.md - Include examples for all credential CRUD operations with required scopes - Document the new updateCredential functionality with proper usage examples --- EXAMPLES.md | 54 +++++++++++++++++++ .../auth0/client/mgmt/ClientsEntityTest.java | 43 +++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/EXAMPLES.md b/EXAMPLES.md index 5f1dd6957..b04c9d002 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/test/java/com/auth0/client/mgmt/ClientsEntityTest.java b/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java index 4e574254a..e36448f1b 100644 --- a/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java +++ b/src/test/java/com/auth0/client/mgmt/ClientsEntityTest.java @@ -426,4 +426,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!"); + } } From ced7c2b203c50a60c8a2ca0c4ed89150b6657a56 Mon Sep 17 00:00:00 2001 From: tanya732 Date: Mon, 15 Sep 2025 15:59:40 +0530 Subject: [PATCH 4/4] Providing new method to enable patch clients credential endpoint --- EXAMPLES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EXAMPLES.md b/EXAMPLES.md index 3721693cf..e599e0108 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -177,7 +177,7 @@ Credential createdCredential = request.execute().getBody(); ```java Credential updates = new Credential(); -updates.setName("Updated credential name"); +updates.setExpiresAt(""); // 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();