0 java spring docker reactjs keycloak
我对keycloak有问题。所以,我有带有 keycloak 的 spring-microservices。如果它从本地开始,那么干得好。但是如果我在 docker 中启动 spring 和 keycloak,那么我就会遇到安全问题。我收到401 错误:(Bearer Realm =“bingo”,error =“invalid_token”,error_description =“无效的令牌发行者。预期为'http://keycloak:8080/realms/bingo',但为'http://localhost: 8090/领域/宾果'")。我不明白,如何向 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
Run Code Online (Sandbox Code Playgroud)
我的 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
Run Code Online (Sandbox Code Playgroud)
所以,我从react-app 获取令牌。我的配置 keyclaok 文件 - keycloak.json:
{
"realm": "bingo",
"auth-server-url": "http://localhost:8090/",
"ssl-required": "external",
"resource": "user",
"public-client": true,
"credentials": {
"secret": "FXpJokhP8ACMo9h53Hl6NSJXHSk395YG"
}
}
Run Code Online (Sandbox Code Playgroud)
const keycloak = new Keycloak("keycloak.json");
您需要在应用程序之间具有相同的 Keycloak 服务器 url。
问题是,您在与 Keycloak (用于keycloak:8080访问它)相同的网络中运行 Spring 应用程序,而 React 应用程序正在使用localhost:8090.
如果您尝试在本地运行 Spring 应用程序
keycloak.auth-server-url=http://localhost:8090
Run Code Online (Sandbox Code Playgroud)
它应该有效。
要在 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
Run Code Online (Sandbox Code Playgroud)
然后更改 Spring 属性
keycloak.auth-server-url=http://keycloak:8090
Run Code Online (Sandbox Code Playgroud)
和反应属性
auth-server-url": "http://keycloak:8090/",
Run Code Online (Sandbox Code Playgroud)
最后127.0.0.1 keycloak在您的/etc/hosts文件 (Linux) 或C:\Windows\System32\drivers\etc\hosts(Windows) 中进行设置,以便 React 应用程序可以解析它。
然而,最好的办法是为 Keycloak 定义一个 DNS 条目,然后将KC_HOSTNAME和设置KC_HOSTNAME_PORT为 Keycloak 外部地址。