我正在尝试通过 Java API 在 Red Hat Single Sign On 7.3 (Keycloak behind the scene) 上创建一个具有临时密码的用户。
在本地(使用标准 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。在“服务帐户角色”中,“领域管理”中的所有角色都已分配并生效。
我正在使用这个 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,但问题仍然存在。
提前感谢您提供的所有帮助或建议!我被困在那里,现在没有更多的想法......