Keycloak docker中无效的令牌颁发者

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

F. *_*ini 6

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