From d87e39ca3aecdb01626592f392644f1cd4f006a2 Mon Sep 17 00:00:00 2001 From: Kay Ulbrich Date: Fri, 28 Feb 2025 11:42:26 +0100 Subject: [PATCH] Issue #669: Allow to create ManagementAPI with a custom TokenProvider --- .../com/auth0/client/mgmt/ManagementAPI.java | 36 +++++++++++++++++-- .../auth0/client/mgmt/ManagementAPITest.java | 9 ++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/auth0/client/mgmt/ManagementAPI.java b/src/main/java/com/auth0/client/mgmt/ManagementAPI.java index 6d4b03c21..45973f89a 100644 --- a/src/main/java/com/auth0/client/mgmt/ManagementAPI.java +++ b/src/main/java/com/auth0/client/mgmt/ManagementAPI.java @@ -67,6 +67,17 @@ public static ManagementAPI.Builder newBuilder(String domain, String apiToken) { return new ManagementAPI.Builder(domain, apiToken); } + /** + * Instantiate a new {@link Builder} to configure and build a new ManagementAPI client. + * + * @param domain the tenant's domain. Must be a non-null valid HTTPS domain. + * @param tokenProvider an implementation of {@link TokenProvider} + * @return a Builder for further configuration. + */ + public static ManagementAPI.Builder newBuilderForTokenProvider(String domain, TokenProvider tokenProvider) { + return new ManagementAPI.Builder(domain, tokenProvider); + } + private ManagementAPI(String domain, TokenProvider tokenProvider, Auth0HttpClient httpClient) { Asserts.assertNotNull(domain, "domain"); Asserts.assertNotNull(tokenProvider, "token provider"); @@ -402,6 +413,7 @@ public SelfServiceProfilesEntity selfServiceProfiles() { public static class Builder { private final String domain; private final String apiToken; + private final TokenProvider tokenProvider; private Auth0HttpClient httpClient = DefaultHttpClient.newBuilder().build(); /** @@ -409,9 +421,22 @@ public static class Builder { * @param domain the domain of the tenant. * @param apiToken the API token used to make requests to the Auth0 Management API. */ - public Builder(String domain, String apiToken) { + private Builder(String domain, String apiToken) { this.domain = domain; this.apiToken = apiToken; + this.tokenProvider = null; + } + + /** + * Create a new Builder, which is based on an implementation of {@link TokenProvider}. + * This allows for more flexibility, e.g. for transparent token renewal. + * @param domain the domain of the tenant. + * @param tokenProvider an implementation of {@link TokenProvider} + */ + private Builder(String domain, TokenProvider tokenProvider) { + this.domain = domain; + this.apiToken = null; + this.tokenProvider = tokenProvider; } /** @@ -430,7 +455,14 @@ public Builder withHttpClient(Auth0HttpClient httpClient) { * @return the configured {@code ManagementAPI} instance. */ public ManagementAPI build() { - return new ManagementAPI(domain, SimpleTokenProvider.create(apiToken), httpClient); + checkState(); + return new ManagementAPI(domain, tokenProvider == null ? SimpleTokenProvider.create(apiToken) : tokenProvider, httpClient); + } + + private void checkState() { + if((apiToken == null && tokenProvider == null) || (apiToken != null && tokenProvider != null)) { + throw new IllegalArgumentException("Exactly one of 'apiToken' or 'tokenProvider' must be non-null for Builder."); + } } } } diff --git a/src/test/java/com/auth0/client/mgmt/ManagementAPITest.java b/src/test/java/com/auth0/client/mgmt/ManagementAPITest.java index 45712d66c..954584e41 100644 --- a/src/test/java/com/auth0/client/mgmt/ManagementAPITest.java +++ b/src/test/java/com/auth0/client/mgmt/ManagementAPITest.java @@ -99,7 +99,7 @@ public void shouldThrowWhenDomainIsNull() { public void shouldThrowWhenApiTokenIsNull() { verifyThrows(IllegalArgumentException.class, () -> ManagementAPI.newBuilder(DOMAIN, null).build(), - "'api token' cannot be null!"); + "Exactly one of 'apiToken' or 'tokenProvider' must be non-null for Builder."); } @Test @@ -111,6 +111,13 @@ public void shouldThrowOnUpdateWhenApiTokenIsNull() { "'api token' cannot be null!"); } + @Test + public void shouldThrowWhenTokenProviderIsNull() { + verifyThrows(IllegalArgumentException.class, + () -> ManagementAPI.newBuilderForTokenProvider(DOMAIN, null).build(), + "Exactly one of 'apiToken' or 'tokenProvider' must be non-null for Builder."); + } + @Test public void shouldUpdateApiToken() throws Auth0Exception { //Initialize with a token