Search code examples
jwtkeycloak

Keycloak exception: Cannot invoke "Object.toString()" because the return value of "io.vertx.core.http.HttpServerRequest.authority()" is null


I installed Keycloak locally, I did everything according to the guide: I created a realm “test-realm”, in it there was a client “test-client” and a user “user1” with the password 123456. When I contact the endpoint to get a token (http://localhost:8180/realms/test-realm/protocol/openid-connect/token) I get an error:

2024-04-10 16:20:26,836 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-1) Uncaught server error: java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "io.vertx.core.http.HttpServerRequest.authority()" is null
    at org.jboss.resteasy.reactive.server.vertx.VertxResteasyReactiveRequestContext.getRequestHost(VertxResteasyReactiveRequestContext.java:194)
    at org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext.getAuthority(ResteasyReactiveRequestContext.java:481)
    at org.jboss.resteasy.reactive.server.jaxrs.UriInfoImpl.getBaseUri(UriInfoImpl.java:131)
    at org.keycloak.urls.HostnameProvider.getScheme(HostnameProvider.java:51)
    at org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider.fromFrontEndUrl(DefaultHostnameProvider.java:181)
    at org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider.getScheme(DefaultHostnameProvider.java:90)
    at org.keycloak.models.KeycloakUriInfo.<init>(KeycloakUriInfo.java:51)
    at org.keycloak.services.DefaultKeycloakContext.getUri(DefaultKeycloakContext.java:78)
    at org.keycloak.services.DefaultKeycloakContext.getUri(DefaultKeycloakContext.java:85)
    at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.checkSsl(TokenEndpoint.java:156)
    at org.keycloak.protocol.oidc.endpoints.TokenEndpoint.processGrantRequest(TokenEndpoint.java:129)
    at org.keycloak.protocol.oidc.endpoints.TokenEndpoint$quarkusrestinvoker$processGrantRequest_6408e15340992839b66447750c221d9aaa837bd7.invoke(Unknown Source)
    at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
    at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
    at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
    at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582)
    at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
    at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
    at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:1583)

Post request with body

Keycloak server response

{
    "error": "unknown_error",
    "error_description": "For more on this error consult the server log at the debug level."
}

When Keycloak starts, the server writes the following logs:

2024-04-10 16:19:46,573 INFO  [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: <unset>, Hostname: <request>, Strict HTTPS: false, Path: <request>, Strict BackChannel: false, Admin URL: <unset>, Admin: <request>, Port: -1, Proxied: false
2024-04-10 16:19:46,818 WARN  [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled
2024-04-10 16:19:46,915 INFO  [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
2024-04-10 16:19:49,314 WARN  [io.quarkus.agroal.runtime.DataSources] (JPA Startup Thread) Datasource <default> enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly
2024-04-10 16:19:51,153 INFO  [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
2024-04-10 16:19:51,180 INFO  [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_692571, Site name: null
2024-04-10 16:19:52,155 INFO  [io.quarkus] (main) Keycloak 24.0.2 on JVM (powered by Quarkus 3.8.3) started in 7.393s. Listening on: http://0.0.0.0:8180
2024-04-10 16:19:52,155 INFO  [io.quarkus] (main) Profile dev activated.
2024-04-10 16:19:52,155 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]
2024-04-10 16:19:52,161 WARN  [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.

I tried to recreate the realms and install different versions of the Keycloak server


Solution

  • Try These steps.

    1 Install Docker Desktop for Windows or Mac

    https://www.docker.com/products/docker-desktop/
    

    Run Docker Desktop

    enter image description here

    2 Launch Keycloak by docker-compose

    Save as docker-compose.yml

    version: '3.8'
    
    services:
      postgres:
        image: postgres:15.6
        container_name: postgres_db
        volumes:
          - postgres_data:/var/lib/postgresql/data
        environment:
          POSTGRES_DB: keycloak
          POSTGRES_USER: keycloak
          POSTGRES_PASSWORD: password
    
      keycloak_web:
        image: quay.io/keycloak/keycloak:24.0.2
        container_name: keycloak_web
        environment:
          KC_DB: postgres
          KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
          KC_DB_USERNAME: keycloak
          KC_DB_PASSWORD: password
    
          KC_HOSTNAME: localhost
          KC_HOSTNAME_STRICT: false
          KC_HOSTNAME_STRICT_HTTPS: false
    
          KC_LOG_LEVEL: info
          KC_METRICS_ENABLED: true
          KC_HEALTH_ENABLED: true
          KEYCLOAK_ADMIN: admin
          KEYCLOAK_ADMIN_PASSWORD: admin
        command: start-dev
        depends_on:
          - postgres
        ports:
          - 8180:8080
    
    volumes:
      postgres_data:
    
    docker compose up -d
    

    enter image description here

    3 log in as master admin

    Open URL by Browser

    http://localhost:8180/
    

    Master Admin Credential

    username: admin
    password: admin
    

    enter image description here

    4 Create Realm , Client and User

    Realm name: test-realm

    enter image description here

    Client ID: test-client

    enter image description here

    User Credential

    username: user1
    password: 123456
    

    enter image description here

    5 Get Token by Postman

    POST http://localhost:8180/realms/test-realm/protocol/openid-connect/token
    

    In body x-www-form-urlencoded

    grant_type: password
    username: user1
    password: 123456
    client_id: test-client
    

    enter image description here

    6 Get master token by cURL

    MASTER_TOKEN=$(curl --location --request POST http://localhost:8180/realms/master/protocol/openid-connect/token \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'client_id=admin-cli' \
    --data-urlencode 'username=admin' \
    --data-urlencode 'password=admin' \
    --data-urlencode 'grant_type=password' | jq -r '.access_token')
    echo $MASTER_TOKEN
    

    enter image description here

    7 Get client token by cURL

    curl --location 'http://localhost:8180/realms/test-realm/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=password' \
    --data-urlencode 'username=user1' \
    --data-urlencode 'password=123456' \
    --data-urlencode 'client_id=test-client'
    

    enter image description here