如何解决nodejs keycloak-connect-graphql 在 docker
最近我遇到了一个关于 docker 的问题,我一直在努力解决这个问题。这是故事的缩短版
在我的开发环境中(一切都在本地主机上运行),代码运行良好,每当我在标头中添加授权令牌时,keycloak-connect 都会检测到它并照常工作。当我在docker中使用它并添加自定义网络接口时出现问题。
当 docker 容器启动时,我让它通过 http://keycloak:8080/auth 连接到 keycloak 并生成领域。这工作正常,不是问题,因此我知道 keycloak 网络已按预期启动并运行。我能够远程进入容器,与 keycloak 通信,获取令牌等...
在我的 graphql 应用程序中,我使用 keycloak-connect-graphql 来设置 graphql 应用程序的上下文,然后使用 keycloak-connect 来设置所有标头。问题是,keycloak-connect-graphql 告诉我没有header。如果我简单地打印出请求,我可以清楚地知道有一个令牌被传入,只是出于某种原因,keycloak-connect- graphql/keycloak-connect 不想设置它,因为我正在使用除 localhost 之外的其他网络。
我实际上能够通过将 keycloak url 设置为公共 url (https://keycloak.DOMAINNAME.com) 来回避这个问题,这对我来说完全没有意义,因为 http://keycloak:8080/auth不起作用。我已经挖掘了 keycloak-connect 和 keycloak-connect-graphql 代码,但找不到与 CORS 问题或其他可疑内容相关的任何内容。如果有人有任何想法,请告诉我。这个错误让我发疯了。
keycloak: {
realm: process.env.KEYCLOAK_REALM,'auth-server-url': 'http://keycloak:8080/auth','ssl-required': 'none',resource: process.env.KEYCLOAK_RESOURCE,'public-client': true,'use-resource-role-mappings': true,'confidential-port': 0,},
配置keycloak.js
function configureKeycloak(app,graphqlPath) {
const keycloakConfig = require('../config/app.config').keycloak;
const memoryStore = new session.MemoryStore();
app.use(
session({
secret:
process.env.SESSION_SECRET_STRING || 'this should be a long secret',resave: false,saveUninitialized: true,store: memoryStore,}),);
const keycloak = new Keycloak(
{
store: memoryStore,keycloakConfig,);
// Install general keycloak middleware
app.use(
keycloak.middleware({
admin: graphqlPath,);
// Protect the main route for all graphql services
// disable unauthenticated access
app.use(graphqlPath,keycloak.middleware());
return { keycloak };
}
index.js
// perform the standard keycloak-connect middleware setup on our app
const { keycloak } = configureKeycloak(app,graphqlPath);
// Ensure entire GraphQL Api can only be accessed by authenticated users
app.use(playgroundpath,keycloak.protect());
const server = new ApolloServer({
gateway,// uploads: false,// Apollo Graph Manager (prevIoUsly kNown as Apollo Engine)
// When enabled and an `ENGINE_API_KEY` is set in the environment,// provides metrics,schema management and trace reporting.
engine: false,// Subscriptions are unsupported but planned for a future Gateway version.
subscriptions: false,// disable default playground
playground: true,context: ({ req }) => {
return {
kauth: new KeycloakContext({ req }),};
},// Tracing must be enabled for this plugin to add the headers
tracing: true,// Register the plugin
plugins: [ServerTimingPlugin],});
编辑: 将 network_mode 设置为 host 解决了这个问题,但我更喜欢使用 dockers 集成网络而不是使用 network_mode 主机,特别是对于生产
编辑2: 我能够在我的本地开发环境中重现该错误(无需进入 docker,然后从那里进行调试)。我能够使用 docker 提供的 IP 地址进行购买。这会产生相同的结果。我已将问题缩小到 keycloak-connect,出于某种原因,它不想连接到 keycloak 或其他东西。还是不确定
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。