Keycloak API createUser Java

13,495

I finally got it to work. Here is the solution for future reference.

UserRepresentation userRepresentation = new UserRepresentation();
userRepresentation.setUsername("randomUser");
Response response = usersResource.create(userRepresentation);
logger.info("Response |  Status: {} | Status Info: {}", response.getStatus(), response.getStatusInfo());
String userId = response.getLocation().getPath().replaceAll(".*/([^/]+)$", "$1");
UserResource userResource = usersResource.get(userId);

I then update the userResource with further information.

Share:
13,495
Bouramas
Author by

Bouramas

Currently working as a Software Engineer MSc Software Development graduate from the University of Glasgow.

Updated on June 17, 2022

Comments

  • Bouramas
    Bouramas about 2 years

    Sample Java Code I use:

    public static AjaxResponse createUser(User newUser) {
    
        Keycloak keycloak = Keycloak.getInstance(
                SERVER_URL,
                REALM,
                USERNAME,
                PASSWORD,
                CLIENT_ID);
    
        // Get Realm
        RealmResource realmResource = keycloak.realm(REALM);
        UsersResource userResource = realmResource.users();
    
        // Create User Representation
        UserRepresentation user = getUserRepresentation(newUser);
    
        // Create user (requires manage-users role)
        try {
            System.out.println("Username: {}", userResource.get("USER-ID-HERE").toRepresentation().getUsername());            
            System.out.println("Count: " + userResource.count());
            Response response = userResource.create(user);
            System.out.println("Response: " + response.getStatusInfo());
            System.out.println("Response: " + response.getStatus());
            System.out.println("Response: " + response.getMetadata());
    
        } catch (Exception e) {
            System.out.println(ExceptionUtils.getStackTrace(e));
            return new AjaxResponse("Fail", false);
        }
    
        return new AjaxResponse("Successful User Creation", true);
    }
    
    private static UserRepresentation getUserRepresentation(User newUser) {
    
        UserRepresentation user = new UserRepresentation();
        user.setEnabled(true);
        user.setUsername(newUser.getUsername());
        user.setFirstName(newUser.getFirstName());
        user.setLastName(newUser.getLastName());
        user.setEmail(newUser.getEmail());
    
        CredentialRepresentation credentialRepresentation = new CredentialRepresentation();
        credentialRepresentation.setTemporary(true);
        credentialRepresentation.setType(CredentialRepresentation.PASSWORD);
        credentialRepresentation.setValue(newUser.getUsername());
        user.setCredentials(Collections.singletonList(credentialRepresentation));
    
    }
    

    The response I get when I run the code:

    Username: USERNAME Correctly Identified here
    Count: 98
    Response: Conflict
    Response: 409
    Response: [Connection=keep-alive,Content-Length=46,Content-Type=application/json,Date=Tue, 03 Jul 2018 15:27:58 GMT,Server=WildFly/10,X-Powered-By=Undertow/1]`
    

    Some thoughts: I added the count so to identify if the whole connection works at all. And it seems that the count returned is correct. So I successfully connect to keycloak but something else goes wrong when I try to create a user.

    The dependencies in my pom.xml

        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-servlet-filter-adapter</artifactId>
            <version>3.2.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-admin-client</artifactId>
            <version>3.2.1.Final</version>   (Have also tried 3.1.0.Final and 3.2.0.Final)
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>3.1.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson2-provider</artifactId>
            <version>3.1.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.1.4.Final</version>
        </dependency>
    

    As I understood those dependencies are related as well:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-version}</version>
        </dependency>
    
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson-version}</version>
        </dependency>
    

    Other info:

    Keycloak Version I use: 3.2.0

    The Keycloak API can be found here

    More information on the HTTP 409 Code can be found here

    I would much appreciate any help or any guidance. Note Credentials and all variables have been checked, once, twice, thrice, and 10 times again. I've been searching for a complete working example. But most fail to specify the dependencies required and thus my code fails.

    Note: I am also using Tomcat-8 and as I am searching deeper into the issue. I see that there are probably some special configurations for Tomcat8. Note that the authentication sign-in sign-out for my web-app already works as expected.

  • Bouramas
    Bouramas almost 6 years
    Thanks for the answer. I have checked that already. Unfortunately its something else.