Keycloak docker 中的令牌颁发者无效

问题描述 投票:0回答:2

我对 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");

java reactjs spring docker keycloak
2个回答
6
投票

应用程序之间需要具有相同的 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 外部地址。


0
投票

您还可以使用入口点动态设置环境变量,该入口点将使用 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

© www.soinside.com 2019 - 2024. All rights reserved.