node.js - 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 URL - http://keycloak:8080/auth/
vs http://localhost:8080/auth/
,因此他们期望令牌中有不同的颁发者。
所以是的,来自前端的令牌是有效的,但不适用于后端。因为那个人期望令牌中有不同的发行人价值。在任何地方都使用相同的 keycloak 域,而您希望遇到这种问题。
推荐阅读
- c# - WPF 在另一个形状内绘制一个形状
- javascript - 将 3d 对象定位在画布的角落 - three.js
- android - Kotlin:抑制以大写字母开头的函数的警告
- python - 通过python中的索引和数组对数据框进行切片
- azure - 如何在 azure function app 中过滤来自不同设备的 IOT 消息?
- javascript - 单击单词时获取单词的值
- php - 计数器根据目标输入在一天内增加,随机增加
- html - Safari (iPhone) 上未显示 Gif 背景
- javascript - 如何只在元素集合上注册一次点击事件?
- node.js - Windows 上的 NPM 安装