Как настроить роутер OpenShift для KeyCloak? - PullRequest
0 голосов
/ 11 февраля 2020

Я создал два проекта в OpenShift.

browser ---> apps/router ---> apps/gw ---> apps
   \                                \
    \                        (/auth) \---> kc/router ---> kc
     \                                     ^
      \-----------------------------------/
           (kc login page)

Первый проект ( apps ) содержит приложение микросервиса, а также шлюз, реализованный с использованием прокси Netflix Zuul. Второй проект ( k c) имеет работающий экземпляр KeyCloak, который также может быть доступен извне по настроенному маршруту.

Zuul-прокси в apps имеет маршрут от / auth до kc / auth .

Пользовательский интерфейс использует для аутентификации адаптер KeyCloak. Когда я звоню apps / ui , получается SPA, и меня перенаправляют на apps / auth для аутентификации. После ввода имени пользователя / пароля меня следует перенаправить обратно в интерфейс, но он не работает. Я получаю страницу с ошибкой, URL которой указывает на k c. В журнале KeyCloak я получаю следующую запись:

10:15:24,969 WARN [org.keycloak.events] (default task-2) type=LOGIN_ERROR, realmId=NUSS, clientId=null, userId=null, ipAddress=10.3.47.12, error=invalid_code

Из документации KeyCloak я узнал, что с настройкой прокси-сервера что-то не так. Когда я звоню apps / auth / realms / master / .well-known / openid-configuration , все URL-адреса указывают на k c. В разделе документа о конфигурации прокси-сервера говорится, что этот ответ должен содержать URL-адреса apps .

. Я думаю, что маршрут к KeyCloak настроен в k c заменяет заголовок x-forwarded-host и другие заголовки прокси на k c вместо того, чтобы просто оставить заголовки, уже установленные в apps . Я уже подтвердил, что запрос о выходе из прокси Zuul содержит правильные заголовки перенаправления прокси.

Теперь у меня есть несколько вопросов:

  • Что мне нужно сделать, чтобы KeyCloak работал в отдельном проект?
  • Мой анализ в любом случае корректен?
  • Как в конечном итоге настроить маршрут в k c, чтобы не заменять заголовки прокси?
  • Есть ли в конечном итоге лучшая практика, как это сделать?

1 Ответ

0 голосов
/ 17 февраля 2020

Мне удалось заставить его работать. Но мне пришлось установить пользовательскую конфигурацию маршрутизатора ( Развертывание настраиваемого маршрутизатора HAProxy ). Я настроил, что заголовки x-forwarded-host и x-forwarded-port проходят маршрутизатор без изменений, если он присутствует.

  # preserve X-Forwarded-Host Header if already set
  acl no_xhost res.hdr(X-Forwarded-Host) -m len 0
  http-request set-header X-Forwarded-Host %[req.hdr(host)] if no_xhost

  # preserve X-Forwarded-Port Header if already set
  acl no_xport res.hdr(X-Forwarded-Port) -m len 0
  http-request set-header X-Forwarded-Port %[dst_port] if no_xport

Мне также пришлось установите следующее свойство в конфигурации Zuul.

zuul.add-proxy-headers=true

Интересно, почему конфигурация маршрутизатора по умолчанию перезаписывает заголовки в любом случае. Как правило, я бы сказал, что если запрос проходит различные обратные прокси, заголовки прокси не должны быть изменены при их передаче. В противном случае служба в конце цепочки никогда не сможет узнать, какой URL был использован для исходного запроса. Правильно?

...