nodejs keycloak-connect-graphql не работает в docker

#node.js #docker #graphql #keycloak #keycloak-connect

#node.js #docker #graphql #keycloak #keycloak-подключение

Вопрос:

Я столкнулся с проблемой, которую я пытался выяснить в последнее время в отношении docker. Вот сокращенная версия истории

В моей среде разработки (все работает на локальном хосте) код работает отлично, всякий раз, когда я добавляю свой токен авторизации в свои заголовки, keycloak-connect обнаруживает его и работает как обычно. Проблема возникает, когда я использую его в docker и добавляю пользовательские сетевые интерфейсы.

Когда контейнер docker загружается, я подключаю его к keycloak через http://keycloak:8080/auth и сгенерируйте царство. Это работает нормально, не проблема, поэтому я знаю, что сеть keycloak запущена и работает, как ожидалось. Я могу удаленно входить в контейнер, связываться с keycloak, получать токен и т. Д…

В моем приложении graphql я использую keycloak-connect-graphql для установки контекста приложения graphql, которое, в свою очередь, использует keycloak-connect для настройки всех заголовков. Проблема в том, что keycloak-connect-graphql сообщает мне, что заголовка нет.Если я просто распечатаю запрос, я могу четко сказать, что передается токен, просто по какой-то причине keycloak-connect-graphql / keycloak-connect не хочет его устанавливать, потому что я использую другую сеть, кроме localhost.

На самом деле я смог обойти эту проблему в процессе производства, установив URL-адрес keycloak в качестве общедоступного URL-адреса (https://keycloak .DOMAINNAME.com ), что не имеет для меня абсолютно никакого смысла, потому что http://keycloak:8080/auth не работает. Я просмотрел keycloak-connect и код keycloak-connect-graphql и не смог найти ничего, относящегося к проблеме CORS или чему-то еще подозрительному. Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать. Эта ошибка сводит меня с ума.

Фрагмент кода: конфигурация keycloak (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,
  },
 

configurekeycloak.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 устраняет проблему, но я предпочитаю использовать встроенные сети docker, а не использовать network_mode host, особенно для производства

Редактировать 2: я смог воспроизвести ошибку в своей локальной среде разработки (без запуска в docker и последующей отладки оттуда). Я смог сделать это, используя IP-адрес, предоставленный docker. Это дает те же результаты. Я сузил проблему до keycloak-connect, который по какой-то причине не хочет подключаться к keycloak или чему-то еще. Все еще не уверен

Комментарии:

1. ping keycloak из node.js ? знает ли этот сервер, что keycloak такое, правильно преобразует это имя в IP? использовать IP в конфигурации? файл docker-compose?

2. @xadm да, я использовал necat, и сервер сообщает, что он открыт. Также Keycloak admin (другой модуль nodejs) работает без проблем. Это просто адаптер keycloak. Проведя немного больше исследований, похоже, это ошибка с их стороны. Я пока оставлю этот вопрос открытым, так как, возможно, кто-то еще столкнулся с такой же проблемой и нашел обходной путь