我对 keycloak 有疑问。所以,我有带有 keycloak 的 spring-microservices。如果它从本地开始,那么干得好。但是如果我在 docker 中启动 spring 和 keycloak,那么我就会遇到安全问题。我收到401错误:(Bearer Realm =“bingo”,error =“invalid_token”,error_description =“无效的令牌发行者。预期为'http://keycloak:8080/realms/bingo',但为'http://本地主机:8090/realms/bingo'")。我不明白,如何向 localhost keycloak:8080 发送请求。 请帮助我。
spring-app 中的Application.properties:
keycloak.auth-server-url=http://keycloak:8080
keycloak.realm=bingo
keycloak.resource=user
keycloak.ssl-required=external
keycloak.public-client=true
keycloak.bearer-only=true
keycloak.use-resource-role-mappings=true
keycloak_auth.password=FXpJokhP8ACMo9h53Hl6NSJXHSk395YG
我的 keycloak docker-compose:
keycloak:
container_name: 'keycloak'
image: quay.io/keycloak/keycloak:18.0
environment:
DB_VENDOR: POSTGRES
DB_ADDR: kc_postgres
DB_DATABASE: keycloak
DB_USER: keycloak
DB_SCHEMA: public
DB_PASSWORD: password
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
ports:
- '8090:8080'
depends_on:
- kc_postgres
command: start-dev
networks:
- spring
- kc_postgres
所以,我从react-app获得了令牌。我的配置 keyclaok 文件 - keycloak.json:
{
"realm": "bingo",
"auth-server-url": "http://localhost:8090/",
"ssl-required": "external",
"resource": "user",
"public-client": true,
"credentials": {
"secret": "FXpJokhP8ACMo9h53Hl6NSJXHSk395YG"
}
}
const keycloak = new Keycloak("keycloak.json");
应用程序之间需要具有相同的 Keycloak 服务器 url。
问题是,您在与 Keycloak 相同的网络中运行 Spring 应用程序(使用
keycloak:8080
访问它),而 React 应用程序正在使用 localhost:8090
。
如果您尝试在本地运行 Spring 应用程序
keycloak.auth-server-url=http://localhost:8090
应该可以。
要在 docker-compose 文件中运行 Spring 应用程序,可以尝试使用此配置
keycloak:
container_name: 'keycloak'
image: quay.io/keycloak/keycloak:18.0
environment:
DB_VENDOR: POSTGRES
DB_ADDR: kc_postgres
DB_DATABASE: keycloak
DB_USER: keycloak
DB_SCHEMA: public
DB_PASSWORD: password
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
KC_HTTP_PORT: 8090
ports:
- '8090:8090'
depends_on:
- kc_postgres
command: start-dev
networks:
- spring
- kc_postgres
然后更改 Spring 属性
keycloak.auth-server-url=http://keycloak:8090
和 React 属性
auth-server-url": "http://keycloak:8090/",
最后在
127.0.0.1 keycloak
文件 (Linux) 或 /etc/hosts
(Windows) 中设置 C:\Windows\System32\drivers\etc\hosts
,以便 React 应用程序可以解析它。
最好的办法是为 Keycloak 定义一个 DNS 条目,然后将
KC_HOSTNAME
和 KC_HOSTNAME_PORT
设置为 Keycloak 外部地址。
您还可以使用入口点动态设置环境变量,该入口点将使用 IP 地址而不是容器名称。 Keycloak 或任何其他服务都可以通过其原始端口 (8080) 从 docker 和主机网络访问。
your-application:
...
entrypoint:
- /bin/sh
- -c
- |
export KEYCLOAK_URL=http://$(getent hosts keycloak | awk '{ print $1 }'):8080/realms/[your-claim-name]
[your-original-entrypoint]
示例:
react-app:
entrypoint:
- /bin/sh
- -c
- |
export KEYCLOAK_URL=http://$(getent hosts keycloak | awk '{ print $1 }'):8080/realms/react
npm start
就我而言,解析的地址是:http://172.20.0.14:8080/realms/react。