diff --git a/packages/keycloak-extensions/conditional-authenticators/pom.xml b/packages/keycloak-extensions/conditional-authenticators/pom.xml
index 991c076ddb3..43fab75af21 100644
--- a/packages/keycloak-extensions/conditional-authenticators/pom.xml
+++ b/packages/keycloak-extensions/conditional-authenticators/pom.xml
@@ -46,6 +46,11 @@ SPDX-License-Identifier: AGPL-3.0-only
message-otp-authenticator
${project.version}
+
+ sequent
+ oauth2-client
+ ${project.version}
+
org.keycloak
@@ -184,6 +189,7 @@ SPDX-License-Identifier: AGPL-3.0-only
javax:*
software.amazon.awssdk:*
org.reactivestreams:reactive-streams
+ sequent:oauth2-client
diff --git a/packages/keycloak-extensions/conditional-authenticators/src/main/java/sequent/keycloak/protocol/oidc/mappers/AuthorizedElectionsUserAttributeMapper.java b/packages/keycloak-extensions/conditional-authenticators/src/main/java/sequent/keycloak/protocol/oidc/mappers/AuthorizedElectionsUserAttributeMapper.java
index 751ca3d7bc1..82f1df29db2 100644
--- a/packages/keycloak-extensions/conditional-authenticators/src/main/java/sequent/keycloak/protocol/oidc/mappers/AuthorizedElectionsUserAttributeMapper.java
+++ b/packages/keycloak-extensions/conditional-authenticators/src/main/java/sequent/keycloak/protocol/oidc/mappers/AuthorizedElectionsUserAttributeMapper.java
@@ -18,7 +18,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -36,7 +35,7 @@
import org.keycloak.protocol.oidc.mappers.UserInfoTokenMapper;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.IDToken;
-import org.keycloak.util.JsonSerialization;
+import sequent.keycloak.oauth2.ClientCredentialsTokenClient;
/**
* Mappings UserModel.attribute to an ID Token claim. Token claim name can be a full qualified
@@ -312,44 +311,17 @@ public static ProtocolMapperModel createClaimMapper(
}
public String authenticate(String tenantId) {
- HttpClient client = HttpClient.newHttpClient();
String url =
this.keycloakUrl
+ "/realms/"
+ getTenantRealmName(tenantId)
+ "/protocol/openid-connect/token";
- Map
+
+ sequent
+ oauth2-client
+ ${project.version}
+
org.junit.jupiter
junit-jupiter
diff --git a/packages/keycloak-extensions/voter-enrollment/src/main/java/sequent/keycloak/voter_enrollment/LookupAndUpdateUser.java b/packages/keycloak-extensions/voter-enrollment/src/main/java/sequent/keycloak/voter_enrollment/LookupAndUpdateUser.java
index 81816938395..55bf266e1eb 100644
--- a/packages/keycloak-extensions/voter-enrollment/src/main/java/sequent/keycloak/voter_enrollment/LookupAndUpdateUser.java
+++ b/packages/keycloak-extensions/voter-enrollment/src/main/java/sequent/keycloak/voter_enrollment/LookupAndUpdateUser.java
@@ -32,7 +32,6 @@
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
-import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.extern.jbosslog.JBossLog;
@@ -62,11 +61,11 @@
import org.keycloak.representations.userprofile.config.UPAttribute;
import org.keycloak.services.resources.LoginActionsService;
import org.keycloak.theme.Theme;
-import org.keycloak.util.JsonSerialization;
import sequent.keycloak.authenticator.MessageOTPAuthenticator;
import sequent.keycloak.authenticator.Utils.MessageCourier;
import sequent.keycloak.authenticator.credential.MessageOTPCredentialModel;
import sequent.keycloak.authenticator.credential.MessageOTPCredentialProvider;
+import sequent.keycloak.oauth2.ClientCredentialsTokenClient;
/** Lookups an user using a field */
@JBossLog
@@ -994,36 +993,12 @@ public void authenticate(String tenantId) {
+ "/realms/"
+ getTenantRealmName(tenantId)
+ "/protocol/openid-connect/token";
- Map data = new HashMap<>();
- data.put("client_id", this.clientId);
- data.put("scope", "openid");
- data.put("client_secret", this.clientSecret);
- data.put("grant_type", "client_credentials");
-
- String form =
- data.entrySet().stream()
- .map(entry -> entry.getKey() + "=" + entry.getValue())
- .reduce((entry1, entry2) -> entry1 + "&" + entry2)
- .orElse("");
- log.info(form);
- HttpRequest request =
- HttpRequest.newBuilder()
- .uri(URI.create(url))
- .header("Content-Type", "application/x-www-form-urlencoded")
- .POST(HttpRequest.BodyPublishers.ofString(form))
- .build();
-
- CompletableFuture> responseFuture;
- responseFuture = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
- String responseBody = responseFuture.join().body();
- Object accessToken;
try {
- log.info("responseBody " + responseBody);
- accessToken = JsonSerialization.readValue(responseBody, Map.class).get("access_token");
- log.info("authenticate " + accessToken.toString());
- this.access_token = accessToken.toString();
- } catch (IOException e) {
- e.printStackTrace();
+ this.access_token =
+ ClientCredentialsTokenClient.requestAccessToken(
+ client, url, this.clientId, this.clientSecret);
+ } catch (IOException | IllegalStateException e) {
+ throw new RuntimeException("Failed to retrieve Keycloak access token", e);
}
}