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 问题或其他可疑内容相关的任何内容。如果有人有任何想法,请告诉我。这个错误让我发疯了。

代码片段: 密钥斗篷配置(app.config

  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 (将#修改为@)