【问题标题】:Accessing Keycloak within a docker-compose network fails在 docker-compose 网络中访问 Keycloak 失败
【发布时间】:2021-08-25 18:53:52
【问题描述】:

我在 docker-compose 编排的环境中使用 Keycloak 进行用户管理。 访问令牌由 javascript 前端客户端生成,通过 HTTP Authorization 标头发送到后端。

当我尝试从用 Python 编写的微服务中获取用户信息时,我运行了以下代码:

# Base URL: http://keycloak:8080 (Internal in Docker. Doesn't work)
url = 'http://keycloak:8080/auth/realms/master/protocol/openid-connect/userinfo' 
headers = {'Authorization': 'Bearer <token>'}
r = requests.get(url, headers=headers, verify=False)

令人惊讶的是,这导致了401 Unauthorized 错误。

我终于发现,如果我将 URL 更改为(主机的)外部 URL,那么一切都会按预期工作:

# Base URL: https://202.97.95.108:8443 (External. Works. Note: 202.97.95.108 was randomly generated)
url = 'https://202.97.95.108:8443/auth/realms/master/protocol/openid-connect/userinfo'
headers = {'Authorization': 'Bearer <token>'}
r = requests.get(url, headers=headers, verify=False)

这会按预期返回200 OK 和用户信息。

我非常想知道为什么会这样,以及我是否可以并且应该更改某些内容以便内部 docker 主机名能够正常工作。

我的 docker-compose.yml 文件:

version: '3.7'

services:  
  backend-micro-service:
    build:
      network: host
      context: .
      dockerfile: ./backend-micro-service/Dockerfile
    expose:
      - "5080"
    networks:
      - intranet
    depends_on:
      - keycloak

  keycloak:
    image: quay.io/keycloak/keycloak:15.0.1
    expose:
      - "8080"
    ports:
      - "8443:8443"
    environment:
      - KEYCLOAK_USER
      - KEYCLOAK_PASSWORD
      - DB_VENDOR=POSTGRES
      - DB_ADDR=keycloak-db
      - DB_SCHEMA=public
      - DB_DATABASE=${KEYCLOAK_DB}
      - DB_USER=${POSTGRES_USER}
      - DB_PASSWORD=${POSTGRES_PASSWORD}
    depends_on:
      - keycloak-db
    networks:
      - intranet

  keycloak-db:
    image: postgres:13
    volumes:
      - keycloak-database:/var/lib/postgresql/data
    expose:
      - "5432"
    environment:
      - POSTGRES_DB=${KEYCLOAK_DB}
      - POSTGRES_USER
      - POSTGRES_PASSWORD
    networks:
      - intranet
 
networks:
  intranet:
    driver: bridge

volumes:
  keycloak-database:

【问题讨论】:

标签: docker-compose keycloak


【解决方案1】:

我的最佳猜测是,令牌颁发者 URL 正在与令牌验证时 HTTP 请求的 Keycloak 服务器 URL 进行比较。

  • 令牌的颁发者 URL 以 https://202.97.95.108 开头,因为它是由使用外部地址与 Keycloak 连接的客户端适配器(用于 JavaScript)生成的。
  • HTTP 请求的 Keycloak 服务器 URL 以 http://keycloak 开头。

可能由于这种不匹配,令牌验证失败。但是,到目前为止,我无法验证此解释(将日志级别设置为 DEBUG 并没有提供更多信息)。

【讨论】:

    【解决方案2】:

    我遇到了和你一样的问题,我的解决方案是在领域设置中的“常规”标签中设置 Frontend URL 字段,在我的添加地址“http://localhost:28080/auth”的情况,该地址由运行keycloak的docker容器公开。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-14
      • 2020-01-22
      • 2018-05-07
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多