Авторизация Keycloak в режиме сетевого моста докеров: как получить доступ к localhost?

Контекст приложения - это приложение node js с mongo db, использующее сервер keycloak для авторизации с открытым идентификатором. Для среды разработки у нас есть контейнер mongo, контейнер keycloak и контейнер сервера приложений.

Контейнер Keycloak имеет отображение портов на 8080, так что я могу получить доступ к консоли конфигурации keycloak на http://localhost:8080.

Контейнер приложения имеет отображение портов на 9000 для доступа к самому приложению на http://localhost:9000.

Все 3 контейнера находятся внутри сети докеров, например application_default (запускается с помощью docker compose).

Внутри приложения информация, необходимая для аутентификации openid с помощью keycloak, управляется следующими переменными среды:

# KEYCLOAK CREDENTIALS
APP_KEYCLOAK_REALM="http://localhost:8080/auth/realms/myrealm"
APP_KEYCLOAK_RETURN_URL="http://localhost:9000/api/auth/openid/return"
APP_KEYCLOAK_CLIENT_ID=myapplication
APP_KEYCLOAK_CLIENT_SECRET="00d5c908-eade-4e26-bcf0-b9341ghie197"

Эти настройки не работают, как правило, внутри контейнера приложения значение APP_KEYCLOAK_REALM для localhost:8080 относится не к моему компьютеру (и ключевике), а к контейнеру приложения.

Теперь, когда я заменяю на

APP_KEYCLOAK_REALM="http://keycloak:8080/auth/realms/myrealm"

приложение может перейти в keycloak, но затем для аутентификации мой браузер застревает, пытаясь перенаправить меня для авторизации на URL-адрес, который для него ничего не значит, начиная с http://keycloak:8080/auth/realms...

Единственный способ, которым мне удалось заставить работать конфигурацию, - это поместить фактический IP-адрес моего ПК в файл среды:

# KEYCLOAK CREDENTIALS
APP_KEYCLOAK_REALM="http://192.168.1.34:8080/auth/realms/myrealm"
APP_KEYCLOAK_RETURN_URL="http://192.168.1.34:9000/api/auth/openid/return"
APP_KEYCLOAK_CLIENT_ID=myapplication
APP_KEYCLOAK_CLIENT_SECRET="00d5c908-eade-4e26-bcf0-b9341ghie197"

Это работает, но не кажется идеальным для переносимости (IP-адрес постоянно меняется).

Есть ли стандартный способ сделать это? Может быть, перенаправить localhost в docker dns на docker host? другие?


person Yves Nicolas    schedule 23.07.2017    source источник
comment
Было ли решение этой проблемы?   -  person bdparrish    schedule 15.01.2019


Ответы (1)


Вы можете сделать несколько вещей. Один из них - использовать записи хоста на вашем локальном компьютере для хоста keycloak. Таким образом, ваш браузер на хосте распознает хост keycloak и будет использовать его для аутентификации.

В противном случае вам не следует так поступать. Вы должны поместить контейнер nginx, для которого порт 80 сопоставлен с хостом. И затем вы можете использовать шаблоны на основе URL-адресов для перенаправления на порт 8000 или 9000.

person Tarun Lalwani    schedule 23.07.2017