Java KeyClope管理客户端响应错误请求,试图列出域

Java KeyClope管理客户端响应错误请求,试图列出域,java,keycloak,Java,Keycloak,我试图通过使用Java管理客户机作为管理用户来列出领域,来测试Key斗篷的一个新实例的运行状况(在Docker容器中运行,这种情况经常发生)。但由于HTTP 400错误的请求,这会反复失败,显然是在客户端试图获取访问令牌时。我必须如何配置keydape或管理客户端来执行这个简单的查询 因此,故障的堆栈跟踪为: java.lang.AssertionError: Able to list realms at [MyClass].listRealms([MyClass].java:69)

我试图通过使用Java管理客户机作为管理用户来列出领域,来测试Key斗篷的一个新实例的运行状况(在Docker容器中运行,这种情况经常发生)。但由于HTTP 400错误的请求,这会反复失败,显然是在客户端试图获取访问令牌时。我必须如何配置keydape或管理客户端来执行这个简单的查询

因此,故障的堆栈跟踪为:

java.lang.AssertionError: Able to list realms
    at [MyClass].listRealms([MyClass].java:69)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
    [junit stack-trace]
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: javax.ws.rs.ProcessingException: javax.ws.rs.BadRequestException: HTTP 400 Bad Request
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.filterRequest(ClientInvocation.java:603)
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:440)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invokeSync(ClientInvoker.java:149)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:112)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
    at com.sun.proxy.$Proxy45.findAll(Unknown Source)
    at [MyClass].listRealms([MyClass].java:67)
    ... 67 more
Caused by: javax.ws.rs.BadRequestException: HTTP 400 Bad Request
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.handleErrorStatus(ClientInvocation.java:219)
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:195)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.extractors.BodyEntityExtractor.extractEntity(BodyEntityExtractor.java:62)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invokeSync(ClientInvoker.java:151)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:112)
    at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
    at com.sun.proxy.$Proxy43.grantToken(Unknown Source)
    at org.keycloak.admin.client.token.TokenManager.grantToken(TokenManager.java:90)
    at org.keycloak.admin.client.token.TokenManager.getAccessToken(TokenManager.java:70)
    at org.keycloak.admin.client.token.TokenManager.getAccessTokenString(TokenManager.java:65)
    at org.keycloak.admin.client.resource.BearerAuthFilter.filter(BearerAuthFilter.java:52)
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.filterRequest(ClientInvocation.java:590)
    ... 73 more
执行查询的关键代码如下:

   public void listRealms() {
      try (var keycloak = container.getKeycloakInstance()) {
         final List<RealmRepresentation> realms;
         try {
            realms = keycloak.realms().findAll();
         } catch (final Exception e) {// provide better diagnostics
            throw new AssertionError("Able to list realms", e);
         }
         assertThat(realms, not(empty()));
      }
   }

测试失败发生在Eclipse中运行测试时。但是,当我使用Maven运行测试时(也就是说,使用
Maven故障保护插件
)也会出现问题

如果我

  • 使用不存在的客户端ID,而不是空的客户端ID(我希望在这种情况下找不到HTTP 404)
  • 使用错误的密码(在这种情况下,我希望HTTP 401未经授权或HTTP 403被禁止)
我使用的URL似乎是正确的,因为如果我故意使用不正确的URL路径,我会得到预期的HTTP 404未找到故障模式,如果我故意使用不正确的主机名,我会得到预期的
UnknownHostException


密钥斗篷版本
11.0.2
(撰写本文时的当前版本)出现此问题,版本
11.0.0

也出现此问题,尽管密钥斗篷会自动创建具有多个客户端ID的
master
域,并且您可以自动设置管理员用户,似乎您不能将这些与Java管理客户端一起使用。您必须创建(或导入)一个领域和客户机ID,然后在创建
keydape
实例时可以指示该ID。Keyclope不会抱怨错误的请求。

尝试使用
admin cli
客户端和具有适当
领域管理
角色的用户。另外,请检查KeyClope服务器日志-您可能会发现有关HTTP 400错误请求原因的更多详细信息。
   private static final String ADMIN_USER = "admin";
   private static final String ADMIN_PASSWORD = "letmein";
   private static final String ADMIN_REALM = "master";
   private static final String ADMIN_CLIENT_ID = null;
...
   public Keycloak getKeycloakInstance() {
      return Keycloak.getInstance(getUri().toASCIIString(), ADMIN_REALM,
               ADMIN_USER, ADMIN_PASSWORD, ADMIN_CLIENT_ID);
   }