I have the following situation. I have implemented in a Spring Boot application a user management system using keycloak. Its working perfectly fine on my test systems. Only in Production I always get an 404 error when trying to create a keylcoak user.
com.example.solar.frontend.usecase.exceptions.KeycloakException: Error creating Keycloak user. Get Response 404
Sep 14 08:34:08 solar[23098]: at com.example.solar.frontend.adapter.outgoing.KeycloakUserService.createUser(KeycloakUserService.java:59) ~[classes!/:0.0.4]
This is my service:
public class KeycloakUserService implements UserService {
private final RealmResource realmResource;
@Autowired
public KeycloakUserService(KeycloakProvider keycloakProvider, @Value("${keycloak.realm}") String realm) {
realmResource = keycloakProvider.keycloak().realm(realm);
}
public String createUser(KeycloakUserRequest userRequest) throws KeycloakException {
UsersResource usersResource = realmResource.users();
CredentialRepresentation credentialRepresentation = createPasswordCredentials(userRequest.getPassword());
UserRepresentation kcUser = new UserRepresentation();
kcUser.setUsername(userRequest.getUsername());
kcUser.setCredentials(Collections.singletonList(credentialRepresentation));
kcUser.setFirstName(userRequest.getFirstname());
kcUser.setLastName(userRequest.getLastname());
kcUser.setEmail(userRequest.getEmail());
kcUser.setEnabled(true);
kcUser.setEmailVerified(false);
Response response = usersResource.create(kcUser);
if (response.getStatus() == HttpStatus.SC_CREATED) {
String userId = response.getLocation().getPath().replaceAll(".*/([^/]+)$", "$1");
log.info("Successfully created user in Keycloak userId: {}, email: {}, firstname: {}, lastname: {}", userId,
kcUser.getEmail(), kcUser.getFirstName(), kcUser.getLastName());
return userId;
} else {
throw new KeycloakException("Error creating Keycloak user. Get Response " + response.getStatus() + " " + response.getStatusInfo().getReasonPhrase());
}
}
This is my configuration in application.properties:
keycloak.realm=<realm>
keycloak.auth-server-url=http://<loadbalancer-keycloak-url>/auth/
keycloak.resource=solar
keycloak.credentials.secret=<secret>
This config is working on dev perfectly, but there I calling keycloak auth url directly instead over a loadbalancer. (http protocol is correct). Calling the url via browser, the keycloak admin index page is returned, so url is correct.
Any idea, which config I am missing, or what else I can do?
best regards Michael