Существует развернутый Keycloak, который должен аутентифицировать пользователей с помощью OAuth2.
Фронтенд — ReactJS. приложение, которое в основном взаимодействует с серверной частью. А серверная часть — это приложение Spring Boot, в котором поставщик OAuth2 настроен как Keycloak.
Предположим, приложение доступно на https://myapp.mydomain.com. Когда пользователь проходит аутентификацию, сохраняются access_token иrefresh_token. Поле iss токенов — https://myapp.mydomain.com/realms/MYREALM.
Связь с внешним интерфейсом работает, поскольку шлюз API заголовки пересылки, такие как X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Scheme и т. д. И Keycloak, хотя и работает на keycloak-service:8080, может динамически обновлять информацию.
Пока все хорошо.
Проблема в том, что серверная часть хотел бы обновить токен. URL-адрес токена отличается от того, что записано в поле iss, поскольку серверная часть взаимодействует внутри K8s со службой Keycloak по адресу http://keycloak-service:8080. И из-за этого я всегда получаю сообщение об ошибке. Не удалось обновить токен: [invalid_grant] Неверный эмитент токена. Ожидается https://myapp.mydomain.com/realms/MYREALM'.
Я использую Keycloak версии 24.0.2, используя quay.io/keycloak/keycloak:24.0 .2-0 image.
И переменные настроены так, чтобы обеспечить динамическое разрешение хоста для работы во внешнем интерфейсе:
Код: Выделить всё
- name: KC_HOSTNAME_STRICT
value: 'false'
- name: KC_HOSTNAME_STRICT_HTTPS
value: 'false'
- name: JAVA_OPTS_APPEND
value: '-Djgroups.dns.query=keycloak-service-headless'
- name: KC_PROXY
value: edge
- name: KC_HTTP_PORT
value: '8080'
- name: KC_HTTP_ENABLED
value: 'true'
- name: PROXY_ADDRESS_FORWARDING
value: 'true'
Единственный способ сделать его работа заключается в том, чтобы разрешить связь через настроенные записи DNS и установить URL-адрес токена в том же домене, т. е. https://myapp.mydomain.com/realms/MYREA ... nect/token вместо http://keycloak-service:8080/realms/MYR ... nect/token.
Это нормально, однако я не хочу маршрутизировать связь за пределами K8, а затем обратно внутри K8 для службы Keycloak. Это создает задержку и затраты на облако, в которых нет необходимости, когда обе службы работают в одном пространстве имен.
Любой, у кого есть опыт правильной настройки этого, чтобы он работал из внешнего интерфейса, работающего в браузере, и серверная часть, использующая внутренние имена служб K8s?
Подробнее здесь: https://stackoverflow.com/questions/792 ... al-network
Мобильная версия