使用docker和java spring时keycloak认证问题

Posted

技术标签:

【中文标题】使用docker和java spring时keycloak认证问题【英文标题】:Keycloak authentication problems when using docker and java spring 【发布时间】:2020-04-24 22:40:34 【问题描述】:

所以我有一个弹簧启动应用程序。我也使用 swagger 进行测试。 我在 docker-compose 中定义了一个 keycloak,如下所示:

  keycloak:
    image: jboss/keycloak
    ports:
      - "18080:8080"
    volumes:
        - ../keycloak:/opt/jboss/keycloak/imports
    command: 
        - "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/realm-export.json"
    environment:
        - KEYCLOAK_USER=admin
        - KEYCLOAK_PASSWORD=admin

当我尝试运行我的 Spring Boot 应用程序时,我使用 http://localhost:18080/auth 作为 keycloak_auth_url。从我的机器上运行时,一切正常。 通过 docker-compose 运行时,我将 keycloak url 更改为:http://keycloak:18080/auth 但是 swaggers 用于将用户重定向到 keycloak 的 url 保持不变 http://localhost:18080/auth

通过大摇大摆的“作品”进行身份验证。但是当我尝试以经过身份验证的用户身份调用 API 端点时,我的服务器返回以下错误:

Error when sending request to retrieve realm keys
myApp  | 
myApp  | org.keycloak.adapters.HttpClientAdapterException: IO error
Didn't find publicKey for kid: U7a58q_oR3zXWSAwVUIa_7FvhdA7IncCQ2IfKQKDGfI
myApp  | 2020-01-07 11:58:40.615 ERROR 1 --- [nio-8082-exec-1] o.k.a.BearerTokenRequestAuthenticator    : Failed to verify token

现在我不确定我的应用程序无法连接到 keycloak 以检查令牌的问题。还是检查令牌失败了? 感谢大家的帮助

【问题讨论】:

您是否也更改了 spring-service 应用程序属性中的 auth-url?未找到公钥表明您的服务无法获取 keycloak 的代码(公钥),因为 url 错误 是的,我将其更改为:http://keycloak:18080/auth 我认为 docker 网络将密钥斗篷部分替换为 IP。我对数据库和数据库连接成功做了同样的事情,但是 keycloak 失败了 应该是http://keycloak:8080/auth,因为8080 用于容器,18080 暴露给主机。 现在有意义了...所以如果我想让容器使用 18080,我只需将 docker compose 更改为:18080:18080 ? 仅当容器中的应用程序真正运行在18080 端口上时。但是我假设默认情况下 keycloak 在 8080 端口上运行。所以你必须改变它的(keycloak)配置才能在 18080 上运行。 【参考方案1】:

如果您想从其他已设置的容器连接到它,则必须将 keycloak_auth_url 更改为 http://keycloak:8080/auth(如果您使用的是 spring-boot,您可以使用环境变量而不是硬编码来完成)通过撰写。

8080 端口是 keycloack 在 keycloak 容器中运行的端口,18080 端口是发布到 host 的端口。

【讨论】:

正确。它有助于在网络中思考。为了获取验证令牌的代码,spring 服务将在 docker 网络中调用 auth url,而无需离开网络。因此,因为您不是从主机请求,所以您必须使用 docker 内部 url。 这个答案确实帮助我找到了解决方案,并更好地帮助我了解我到底做错了什么。谢谢!

以上是关于使用docker和java spring时keycloak认证问题的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile 和 Docker Compose 与 Java Spring Boot、Gradle 和 PostgreSQL [重复]

Docker Compose 与 Zookeeper、Kafka、Redis 和 Java Spring Boot

docker上的Spring启动无法从资源中读取属性文件,但可以在没有Docker的情况下使用java -jar

Docker 中的 Consul 和 Spring Boot 服务 - 不取消注册

使用 spring 和 docker 引发运行时异常时出现 cors 问题

将 MySQL 和 Spring Boot 应用程序与 docker 一起使用时出错