I have configured a CustomEventListener on my keycloak local instance
In onEvent(Event event) method of EvenListener ,
when Event type of REGISTER occurs - I have made a call to an external service with some data of the new registered user.
That external service sends back some data as response.
then I want to store that response data into the custom user attributes of keycloak user.
the problem here I am facing is whenever event type is REGISTER , the data is not getting stored into the DB ,but when event type is LOGIN the data is getting stored into DB .
Here to persist attributes to the user profile I am using UserModel.setSingleAttribute(Key ,Value) in both event types.
if (EventType.REGISTER.equals(event.getType())) {
System.out.println("Event Occurred of type :" + event.getType());
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++");
RealmModel realm = this.model.getRealm(event.getRealmId());
UserModel newRegisteredUser = this.session.users().getUserById(realm, event.getUserId());
HashMap<String, String> values = new HashMap<String, String>();
values.put("email", newRegisteredUser.getEmail());
values.put("name", newRegisteredUser.getUsername());
ObjectMapper objectMapper = new ObjectMapper();
String requestBody;
try {
requestBody = objectMapper.writeValueAsString(values);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(//extrernal service url string))
.POST(HttpRequest.BodyPublishers.ofString(requestBody)).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
Map<String, String> map = new HashMap<String, String>();
// convert JSON string to Map
map = objectMapper.readValue(response.body(), new TypeReference<HashMap<String, String>>() {
});
System.out.println(map);
System.out.println("+++++++++++++++++++++++++setting the user attribute values +++++++++++++++====+++++++++++");
newRegisteredUser.setSingleAttribute("webid", map.get("unique_id"));
newRegisteredUser.setSingleAttribute("pod_url", map.get("service_url"));
newRegisteredUser.setSingleAttribute("password", map.get("code"));
} catch (IOException | InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
the same above code written for EventType LOGIN , the flow is executing fine and data is persisting to the database.
Here
I want to set the custom atttributes to the user profile only once when the user registers to the app , not every time he/she logins.
Can anyone suggest how to implement my requirement.