java - 使用 JAVA 通过 REST API 集成 Keycloak 时在 toRepresentation() 处获取 404
问题描述
我正在尝试连接到在 localhost 上运行的 Keycloak 实例并使用userid
. 我已经在 Keycloak 中创建了相关的领域、用户等。
TestKeycloakConnection.java
package org.keycloak.pkg.test;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.admin.client.resource.UsersResource;
public class TestKeycloakConnection {
public static final String KEYCLOAK_URL = "https://localhost/auth";
public static final String KEYCLOAK_REALM = "myreaml";
public static final String KEYCLOAK_USER = "admin";
public static final String KEYCLOAK_PASSWORD = "admin";
public static final String KEYCLOAK_ADMIN_CLI = "admin-cli";
public static void main(String[] args) {
Keycloak keycloak = KeycloakBuilder
.builder()
.serverUrl(KEYCLOAK_URL)
.realm(KEYCLOAK_REALM)
.username(KEYCLOAK_USER)
.password(KEYCLOAK_PASSWORD)
.clientId(KEYCLOAK_ADMIN_CLI)
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
.build();
UsersResource usersResource = keycloak.realm(KEYCLOAK_REALM).users();
UserResource userResource = usersResource.get("8af231bd-0305-4921-a52d-6c0dda224e24");
////////////////////// GETTING 404 IN FOLLOWING LINE ////////////////////
System.out.println("userResource:"+userResource.toRepresentation().getUsername());
}
}
pom.xml
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>12.0.2</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.15.0.Alpha1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.26.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.1.0.Final</version>
</dependency>
错误堆栈:
线程“主”javax.ws.rs.ProcessingException 中的异常:javax.ws.rs.NotFoundException:在 org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436) 处未找到 HTTP 404 org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:106) at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76) at com.sun.proxy.$Proxy27.toRepresentation(Unknown Source) at org.keycloak.pkg.providers.config.TestKeycloakConnection.main(TestKeycloakConnection.java:41) 原因:javax.ws.rs.NotFoundException: HTTP 404 Not Found在 org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.handleErrorStatus(ClientInvocation.java:200)
类似的问题:
https://keycloak.discourse.group/t/404-when-calling-torepresentation/3606
解决方案
问题是在这部分:
Keycloak keycloak = KeycloakBuilder
.builder()
.serverUrl(KEYCLOAK_URL)
.realm(KEYCLOAK_REALM) // <----- this is wrong
.username(KEYCLOAK_USER)
.password(KEYCLOAK_PASSWORD)
.clientId(KEYCLOAK_ADMIN_CLI)
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
.build();
.realm(..)
你应该通过,master
因为那通常是客户所在的地方admin-cli
。
正在运行的解决方案:
package org.keycloak.pkg.test;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.keycloak.admin.client.Keycloak;
import org.keycloak.admin.client.KeycloakBuilder;
import org.keycloak.admin.client.resource.UserResource;
import org.keycloak.admin.client.resource.UsersResource;
public class TestKeycloakConnection {
public static final String KEYCLOAK_URL = "https://localhost/auth";
public static final String KEYCLOAK_REALM = "myreaml";
public static final String KEYCLOAK_USER = "admin";
public static final String KEYCLOAK_PASSWORD = "admin";
public static final String KEYCLOAK_ADMIN_CLI = "admin-cli";
public static void main(String[] args) {
Keycloak keycloak = KeycloakBuilder
.builder()
.serverUrl(KEYCLOAK_URL)
.realm("master")
.username(KEYCLOAK_USER)
.password(KEYCLOAK_PASSWORD)
.clientId(KEYCLOAK_ADMIN_CLI)
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
.build();
UsersResource usersResource = keycloak.realm(KEYCLOAK_REALM).users();
UserResource userResource = usersResource.get("8af231bd-0305-4921-a52d-6c0dda224e24");
System.out.println("userResource:"+userResource.toRepresentation().getUsername());
}
}
推荐阅读
- elasticsearch - 带有 gke 网络策略的 Elastic.co APM
- python - 模块“scipy.sparse”没有属性“linalg”
- algorithm - 平安夜问题:动态规划
- java - 如何在 ubuntu 中为 VS 代码配置和下载 Java JDK
- raspberry-pi2 - 使用 Raspi 2B 在 SonicPi 中没有音频
- r - 摘要功能不打印错误测量和准确性功能打印错误
- c++ - 两个应用程序的包装模块
- facebook - Facebook API 范围已删除
- php - 更改移动设备上 WooCommerce 产品的评论数量
- javascript - 基本反应原生问题隐蔽类到函数