Keycloak异常:无法调用“Object.toString()”,因为“io.vertx.core.http.HttpServerRequest.authority()”的返回值为null

问题描述 投票:0回答:1

我在本地安装了Keycloak,我按照guide做了一切:我创建了一个领域“test-realm”,其中有一个客户端“test-client”和一个用户“user1”,密码为123456。 当我联系端点获取令牌(http://localhost:8180/realms/test-realm/protocol/openid-connect/token)时,我收到错误:

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 服务器响应

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

Keycloak启动时,服务器会写入以下日志:

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.

我尝试重新创建领域并安装不同版本的 Keycloak 服务器

jwt keycloak
1个回答
0
投票

尝试这些步骤。

1 安装适用于 Windows 或 Mac 的 Docker Desktop

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

2 通过 docker-compose 启动 Keycloak

另存为

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

3 以管理员身份登录

通过浏览器打开网址

http://localhost:8180/

用户名:admin 密码: 管理员

4 创建领域、客户端和用户

领域名称:测试领域

客户端 ID:测试客户端

用户名:user1 密码:123456

5 通过Postman获取Token

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

体内

x-www-form-urlencoded

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

© www.soinside.com 2019 - 2024. All rights reserved.