spring - dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序

标签 spring spring-boot docker oauth-2.0 keycloak

考虑以下环境:

  • 一个 docker 容器是 keycloak
  • 另一个 docker 容器是我们使用 keycloak 进行身份验证的 Web 应用程序

  • 该网络应用程序是一个应用了“keycloak-spring-boot-starter”的 Spring Boot 应用程序。在 application.properties 中:

    keycloak.auth-server-url = http://localhost:8028/auth



    访问我们的 Web 应用程序的用户将使用 keycloak docker 容器的公开端口的 URL 重定向到 keycloak。登录在 keycloak 中没有问题,并且用户(浏览器)再次被重定向到我们的 Web 应用程序。现在,需要将授权码交换为访问 token 。因此,我们的 Web 应用程序(keycloak 客户端)尝试连接到 keycloak.auth-server-url 中配置的相同主机和端口。但这是一个问题,因为 Web 应用程序驻留在 docker 容器中,而不是在主机上,所以它应该访问 http://keycloak:8080或者keycloak是链接的keycloak docker容器的东西。

    所以问题是:如何配置 keycloak 客户端以应用不同的 URL 进行浏览器重定向和访问 token 端点?

    最佳答案

    曾经有另一处房产auth-server-url-for-backend-requests但是是 removed by pull request #2506作为 issue #2623 on Keycloak's JIRA 的解决方案.在此问题的描述中,您将找到原因和可能的解决方法:这应该在 DNS 级别或通过向主机文件添加条目来解决。

    所以在客户端配置中你能做的不多,除非你改变代码并制作你自己版本的适配器,但是你可以在 Docker 级别做一些事情。为了使其正常工作,首先我建议您使用完全限定域名而不是 localhost对于公共(public)主机名,就像您在生产中一样,例如。 keycloak.mydomain.com .如果您只是将其添加到主机的/etc/hosts 中,则可以使用假的(未在 DNS 服务器中注册)文件(或 Windows 等效文件)作为 localhost 旁边的别名.

    然后,如果你使用 Docker Compose,你可以设置 aliases (替代主机名)用于容器连接到的 docker 网络上的 keycloak 服务(请参阅文档:撰写文件引用/服务配置引用/网络/别名)。例如:

    version: "3.7"
    
    services:
      keycloak:
        image: jboss/keycloak
        networks:
          # Replace 'mynet' with whatever user-defined network you are using or want to use
          mynet:
            aliases:
              - keycloak.mydomain.com
    
      webapp:
        image: "nginx:alpine"
        networks:
          - mynet
    
    networks:
      mynet:
    
    

    如果你只是使用普通的 Docker,你可以做 the equivalent--alias docker network connect 的标志命令(参见文档:容器网络/IP 地址和主机名)。

    关于spring - dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57213611/

    相关文章:

    java - Autowiring 不起作用,Spring Boot 1.5.8,NoSuchBeanDefinitionException :BCryptPasswordEncoder,

    java - Spring Boot 应用程序可以向自身发出 HTTP 请求吗?

    docker - Docker多个端口(前端和后端)不起作用

    docker run [9] 系统错误: exec format error

    java - 在请求之间用 spring 保持状态

    java - 如何在 Kepler IDE 中创建 MVC 项目

    java - 使用 JUnit 测试 Spring 安全性时如何删除 "ROLE_"前缀?

    java - 使用rest来通信两个基于表单的springboot应用程序

    docker - 找不到 Hyperledger Docker 端点

    java - Spring Websocket、RabbitMQ 和 STOMP 的性能问题