KEYCLOAK-12285 Add support for RestEasy 4 to admin client
This commit is contained in:
parent
dfb67c3aa4
commit
6978806a7e
4 changed files with 71 additions and 7 deletions
|
@ -30,18 +30,50 @@
|
||||||
<name>Keycloak Admin REST Client</name>
|
<name>Keycloak Admin REST Client</name>
|
||||||
<description/>
|
<description/>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<resteasy.versions>3.9.1.Final</resteasy.versions>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-core</artifactId>
|
<artifactId>keycloak-core</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>*</groupId>
|
||||||
|
<artifactId>*</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-common</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>*</groupId>
|
||||||
|
<artifactId>*</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
|
<artifactId>resteasy-client</artifactId>
|
||||||
|
<version>${resteasy.versions}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jboss.resteasy</groupId>
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
<artifactId>resteasy-multipart-provider</artifactId>
|
<artifactId>resteasy-multipart-provider</artifactId>
|
||||||
|
<version>${resteasy.versions}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jboss.resteasy</groupId>
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
<artifactId>resteasy-jackson2-provider</artifactId>
|
<artifactId>resteasy-jackson2-provider</artifactId>
|
||||||
|
<version>${resteasy.versions}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.resteasy</groupId>
|
||||||
|
<artifactId>resteasy-jaxb-provider</artifactId>
|
||||||
|
<version>${resteasy.versions}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.keycloak.admin.client;
|
||||||
|
|
||||||
|
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
|
||||||
|
|
||||||
|
public class ClientBuilderWrapper {
|
||||||
|
|
||||||
|
static Class clazz;
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
clazz = Class.forName("org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl");
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
try {
|
||||||
|
clazz = Class.forName("org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder");
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
throw new RuntimeException("RestEasy 3 or 4 not found on classpath");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResteasyClientBuilder create() {
|
||||||
|
try {
|
||||||
|
return (ResteasyClientBuilder) clazz.newInstance();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ import org.keycloak.admin.client.token.TokenManager;
|
||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
import javax.net.ssl.SSLSession;
|
import javax.net.ssl.SSLSession;
|
||||||
|
import javax.ws.rs.client.Client;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
|
||||||
|
@ -50,7 +51,8 @@ public class Keycloak implements AutoCloseable {
|
||||||
private final TokenManager tokenManager;
|
private final TokenManager tokenManager;
|
||||||
private final String authToken;
|
private final String authToken;
|
||||||
private final ResteasyWebTarget target;
|
private final ResteasyWebTarget target;
|
||||||
private final ResteasyClient client;
|
private final Client client;
|
||||||
|
private boolean closed = false;
|
||||||
|
|
||||||
Keycloak(String serverUrl, String realm, String username, String password, String clientId, String clientSecret, String grantType, ResteasyClient resteasyClient, String authtoken) {
|
Keycloak(String serverUrl, String realm, String username, String password, String clientId, String clientSecret, String grantType, ResteasyClient resteasyClient, String authtoken) {
|
||||||
config = new Config(serverUrl, realm, username, password, clientId, clientSecret, grantType);
|
config = new Config(serverUrl, realm, username, password, clientId, clientSecret, grantType);
|
||||||
|
@ -58,7 +60,7 @@ public class Keycloak implements AutoCloseable {
|
||||||
authToken = authtoken;
|
authToken = authtoken;
|
||||||
tokenManager = authtoken == null ? new TokenManager(config, client) : null;
|
tokenManager = authtoken == null ? new TokenManager(config, client) : null;
|
||||||
|
|
||||||
target = client.target(config.getServerUrl());
|
target = (ResteasyWebTarget) client.target(config.getServerUrl());
|
||||||
target.register(newAuthFilter());
|
target.register(newAuthFilter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +69,7 @@ public class Keycloak implements AutoCloseable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ResteasyClient newRestEasyClient(ResteasyJackson2Provider customJacksonProvider, SSLContext sslContext, boolean disableTrustManager) {
|
private static ResteasyClient newRestEasyClient(ResteasyJackson2Provider customJacksonProvider, SSLContext sslContext, boolean disableTrustManager) {
|
||||||
ResteasyClientBuilder clientBuilder = new ResteasyClientBuilder()
|
ResteasyClientBuilder clientBuilder = ClientBuilderWrapper.create()
|
||||||
.sslContext(sslContext)
|
.sslContext(sslContext)
|
||||||
.connectionPoolSize(10);
|
.connectionPoolSize(10);
|
||||||
|
|
||||||
|
@ -141,7 +143,7 @@ public class Keycloak implements AutoCloseable {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public <T> T proxy(Class<T> proxyClass, URI absoluteURI) {
|
public <T> T proxy(Class<T> proxyClass, URI absoluteURI) {
|
||||||
return client.target(absoluteURI).register(newAuthFilter()).proxy(proxyClass);
|
return ((ResteasyWebTarget) client.target(absoluteURI)).register(newAuthFilter()).proxy(proxyClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -149,6 +151,7 @@ public class Keycloak implements AutoCloseable {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
|
closed = true;
|
||||||
client.close();
|
client.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,6 +159,6 @@ public class Keycloak implements AutoCloseable {
|
||||||
* @return true if the underlying client is closed.
|
* @return true if the underlying client is closed.
|
||||||
*/
|
*/
|
||||||
public boolean isClosed() {
|
public boolean isClosed() {
|
||||||
return client.isClosed();
|
return closed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.keycloak.common.util.Time;
|
||||||
import org.keycloak.representations.AccessTokenResponse;
|
import org.keycloak.representations.AccessTokenResponse;
|
||||||
|
|
||||||
import javax.ws.rs.BadRequestException;
|
import javax.ws.rs.BadRequestException;
|
||||||
|
import javax.ws.rs.client.Client;
|
||||||
import javax.ws.rs.core.Form;
|
import javax.ws.rs.core.Form;
|
||||||
|
|
||||||
import static org.keycloak.OAuth2Constants.CLIENT_CREDENTIALS;
|
import static org.keycloak.OAuth2Constants.CLIENT_CREDENTIALS;
|
||||||
|
@ -46,9 +47,9 @@ public class TokenManager {
|
||||||
private final TokenService tokenService;
|
private final TokenService tokenService;
|
||||||
private final String accessTokenGrantType;
|
private final String accessTokenGrantType;
|
||||||
|
|
||||||
public TokenManager(Config config, ResteasyClient client) {
|
public TokenManager(Config config, Client client) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
ResteasyWebTarget target = client.target(config.getServerUrl());
|
ResteasyWebTarget target = (ResteasyWebTarget) client.target(config.getServerUrl());
|
||||||
if (!config.isPublicClient()) {
|
if (!config.isPublicClient()) {
|
||||||
target.register(new BasicAuthFilter(config.getClientId(), config.getClientSecret()));
|
target.register(new BasicAuthFilter(config.getClientId(), config.getClientSecret()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue