#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. Проведя немного больше исследований, похоже, это ошибка с их стороны. Я пока оставлю этот вопрос открытым, так как, возможно, кто-то еще столкнулся с такой же проблемой и нашел обходной путь