I am encountering a persistent issue when trying to create a user in Keycloak using the Keycloak Admin Client. Despite ensuring that the userProfileMetadata field is not present in the JSON payload, the Keycloak server responds with a 400 Bad Request error, indicating that the field is unrecognized. No matter whether the userProfileMetadata field is in the User json or not, I keep getting the error!
I am using Spring boot 3.2.5 but my Keycloak server itself is 16.1.1
<properties>
<java.version>17</java.version>
<keycloak.version>22.0.3</keycloak.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<lombok.version>1.18.26</lombok.version>
</properties>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
<version>24.0.4</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>25.0.2</version>
</dependency>
Response from Keycloak: status=400, body=Unrecognized field "userProfileMetadata" (class org.keycloak.representations.idm.UserRepresentation), not marked as ignorable
I have added global configuration to ignore unknown properties.
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
}
and the class to ignore unknown props:
@JsonIgnoreProperties(ignoreUnknown = true)
public class FilteredUserRepresentation extends UserRepresentation {
// No additional fields or methods needed
}
User creation methode:
public ResponseEntity<String> createUserInKeycloak(String email, String password) {
Keycloak keycloak = getKeycloak();
UserRepresentation user = getUserRepresentation(email, password);
log.debug("Creating user in Keycloak: {}", user);
try {
ObjectNode userNode = objectMapper.convertValue(user, ObjectNode.class);
userNode.remove("userProfileMetadata");
String userJson = objectMapper.writeValueAsString(userNode);
log.info("Cleaned User JSON: {}", userJson);
try (Response response = keycloak
.realm(applicationProperties.getKeycloakAdminUser().getRealm())
.users()
.create(objectMapper.readValue(userJson, UserRepresentation.class))) {
int status = response.getStatus();
String responseBody = response.readEntity(String.class);
log.info("Response from Keycloak: status={}, body={}", status, responseBody);
if (status == HttpStatus.CREATED.value()) {
return new ResponseEntity<>("User created successfully", HttpStatus.CREATED);
} else {
return new ResponseEntity<>(responseBody, HttpStatus.valueOf(status));
}
}
} catch (Exception e) {
log.error("Exception while creating user in Keycloak", e);
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}