【发布时间】: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:
【问题讨论】:
-
尝试在领域设置中或通过hostname provider配置固定的frontendUrl