首页 > 解决方案 > 通过网络别名访问 Docker 内部的 Keycloak-Service

问题描述

设想

我已经保护了以开放自由运行的 Web 服务(JakartaEE + Microprofile + JWT)。作为 jwt 令牌的发行者,我使用 keycloak。对于测试和开发,我想在 docker 中运行这两个服务。因此我写了一个 docker-compose 文件。作为测试客户端,我将 JUnit 与 microprofile-client 一起使用。这是在 docker 之外运行的。

问题

我可以通过主机上的 localhost 检索 JWT-Token - 例如:

POST /auth/realms/DC/protocol/openid-connect/token HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

realm=DC&grant_type=password&client_id=dc&username=dc_editor&password=******

问题是,从 web 服务 localhost 的角度来看,它不是 keycloak 服务器。针对颁发者的 JWT-Token-Validation 失败。

目标

我想使用其 docker-internal 网络别名从主机访问 keycloak 服务器 - 例如dcAuthServer。JWT-Token 将被正确验证。

代码

docker-compose 文件如下所示:

version: "3.8"
services:
  dcWebservice:
    environment:
      - DC_AUTH_SERVER_HOST=dcAuthServer
      - DC_AUTH_SERVER_PORT=8080
      - DC_AUTH_SERVER_REALM=DC
    image: dc_webservice:latest
    ports:
    - "9080:9080"
    networks:
      - dcNetwork

  dcAuthServer:
    image: dc_keycloak:latest
    ports:
    - "8080:8080"
    networks:
      dcNetwork:
        aliases:
            - dcAuthServer
    healthcheck:
      test: "curl --fail http://localhost:8080/auth/realms/DC || false"

networks:
  dcNetwork:

该环境在 open liberty 服务器DC_AUTH*的 mpJwt-configuration 中使用:server.xml

<mpJwt id="dcMPJWT" audiences="dc" issuer="http://${DC_AUTH_SERVER_HOST}:${DC_AUTH_SERVER_PORT}/auth/realms/${DC_AUTH_SERVER_REALM}"
           jwksUri="http://${DC_AUTH_SERVER_HOST}:${DC_AUTH_SERVER_PORT}/auth/realms/${DC_AUTH_SERVER_REALM}/protocol/openid-connect/certs"/>

issuer是我必须为 JWT-Token 放置一个受信任的发行者的地方。

我希望我没有忘记重要信息 - 只要问!

在此先感谢罗伯特

标签: dockernetworkingjwtkeycloakopen-liberty

解决方案


推荐阅读