首页 > 解决方案 > 403 Forbidden,docker容器之间的通信

问题描述

我有一个由 react-client(前端)、express 服务器(后端)和 keycloak 组成的应用程序。出于开发目的,我在 docker-container 中运行 keycloak 并公开其相应的端口(8080);前端和后端在我的机器上本地运行。它们连接到上述端口上的 keycloak。后端服务于一些 REST 端点,这些端点受 keycloak 保护。一切正常。

但是,当我尝试通过将后端放入容器中并将我的应用程序容器化以用于生产目的并使用 docker-compose 运行所有内容(前端仍在我的本地计算机上运行)时,后端拒绝了来自前端的所有请求,尽管这些请求附加了有效的令牌。我想问题是后端无法连接 keycloak 来验证令牌,但我不知道为什么以及如何解决这个问题。

这是我的 docker-compose.yml:

version: "3.8"
services:
  
  backend:
    image: "backend"
    build:
      context: .
      dockerfile: ./backend/Dockerfile
    ports:
      - "5001:5001"

  keycloak:
    image: "jboss/keycloak"
    ports:
      - "8080:8080"
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin
      - KEYCLOAK_IMPORT=/tmp/realm-export.json
    volumes:
      - ./realm-export.json:/tmp/realm-export.json

  mongo_db:
    image: "mongo:4.2-bionic"
    ports:
      - "27017:27017"

  mongo_db_web_interface:
    image: "mongo-express"
    ports:
      - "4000:8081"
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongo_db

这是后端代码中的 keycloak 配置:

{
  "realm": "License-game",
  "bearer-only": true,
  "auth-server-url": "http://keycloak:8080/auth/",
  "ssl-required": "external",
  "resource": "backend",
  "confidential-port": 0
}

这是前端代码中的 keycloak 配置:

{
    URL: "http://localhost:8080/auth/",
    realm: 'License-game',
    clientId: 'react'
}

这是后端keycloak的配置

标签: node.jsdockerdocker-composekeycloak

解决方案


在您的情况下,后端和前端使用不同的 Keycloak URL - http://keycloak:8080/auth/vs http://localhost:8080/auth/,因此他们期望令牌中有不同的颁发者。

所以是的,来自前端的令牌是有效的,但不适用于后端。因为那个人期望令牌中有不同的发行人价值。在任何地方都使用相同的 keycloak 域,而您希望遇到这种问题。


推荐阅读