尝试使用 Java API 在 Red Hat SSO 7.3 (Keycloak) 上重置用户密码时出现错误 400

Posted

技术标签:

【中文标题】尝试使用 Java API 在 Red Hat SSO 7.3 (Keycloak) 上重置用户密码时出现错误 400【英文标题】:Error 400 when trying to reset user password on Red Hat SSO 7.3 (Keycloak) with Java API 【发布时间】:2021-04-04 09:25:04 【问题描述】:

我正在尝试通过 Java API 在 Red Hat Single Sign On 7.3(Keycloak 后台)上创建一个具有临时密码的用户。

在本地(使用标准 Keycloak,jboss/keycloak:9.0.0 Docker 映像),它工作正常。 但是在 Openshift 4.4 项目上部署相同的内容时,我从 Red Hat SSO (7.3) 收到 400 错误。 不幸的是,我在日志中没有太多内容,而且我无法在 Red Hat SSO 服务器上配置任何内容以使其更详细。

在 Red Hat SSO 服务器上,已在应用程序 Realm 中创建了一个专用的“keycloak-admin”客户端。 客户端启用时仅将“服务帐户启用”选项设置为 ON。 在“Service Account Roles”中,“realm-management”中的所有角色都已分配并生效。

我正在使用这个 Maven 依赖项来处理 Keycloak Java API:

<dependency>
   <groupId>org.keycloak</groupId>
   <artifactId>keycloak-admin-client</artifactId>
   <version>9.0.0</version>
</dependency>

这是我如何通过 Java 代码创建与 Keycloak 的连接:

Keycloak keycloak = KeycloakBuilder.builder()
            .serverUrl(keycloakProperties.getHost())
            .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
            .realm("app_realm")
            .clientId("keycloak-admin")
            .clientSecret(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx)
            .resteasyClient(
                new ResteasyClientBuilder()
                    .connectionPoolSize(10).build()
            ).build();
keycloak.tokenManager().getAccessToken();
RealmResource realmResource = keycloak.realm("app_realm");

客户端密码集与“凭据”部分中“keycloak-admin”客户端中的密码匹配。

这是我通过 Java 代码创建用户的方法:

final UserRepresentation user = new UserRepresentation();
user.setEnabled(true);
user.setEmailVerified(true);
user.setUsername(username);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEmail(email);

try 
   final Response response = realmResource.users().create(user);
   final String userId = CreatedResponseUtil.getCreatedId(response);
 catch (final Exception exception) 
   log.error("Exception when createKeycloakUser",exception);

这部分在本地和 Red Hat SSO 中都可以正常工作。用户已创建并可在 Keycloak 上检索。

然后我尝试像这样重置密码:

final UserResource userResource = realmResource.users().get(userId );

final CredentialRepresentation passwordCred = new CredentialRepresentation();
passwordCred.setTemporary(true);
passwordCred.setType(CredentialRepresentation.PASSWORD);
passwordCred.setValue(generateRandomPassword());
userResource.resetPassword(passwordCred);

generateRandomPassword 是一种生成随机密码的方法,该密码与本地 Keycloak 和 Red Hat SSO(身份验证/密码策略)上定义的密码策略相匹配。

代码的最后一部分在本地运行良好,但在 Red Hat SSO 上出现 400 错误。

为了您知道,我也尝试直接使用密码创建用户,但行为完全相同。 我还尝试使用“admin-cli”客户端和管理员帐户连接到 Keycloak,但问题仍然存在。

提前感谢您提供的所有帮助或建议!我被困住了,现在没有更多的想法......

【问题讨论】:

您能否查看服务器日志以了解 400 错误的详细信息? 您好,很遗憾,我在 Openshift 上的 Red Hat SSO pod 的日志中没有看到与此错误相关的任何内容。在我的应用程序 pod 上,只会收到 400 Bad Request 错误,仅此而已。 【参考方案1】:

我最近遇到了同样的问题。只是因为密码为空。也许你应该检查 generateRandomPassword() 的返回。如果您仍然遇到此问题,希望这对您有所帮助

【讨论】:

以上是关于尝试使用 Java API 在 Red Hat SSO 7.3 (Keycloak) 上重置用户密码时出现错误 400的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 pip install Red Hat 安装软件包时出错

VMware Workstation 安装Red Hat Enterprise Linux 6 64 位

Red Hat Linux redis 安装配置

从 OS X 迁移到 linux Red-Hat 时出错

Red Hat JBoss Data Grid 7.1 的新特性

在 Eclipse、Red Hat Linux 中运行 c++ 项目时出现问题