Контекст приложения - это приложение 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? другие?