Keycloak Redirect URI добавляет нулевой порт к URL
Обнаружена ошибка redirect_uri в keycloak. Обнаружена та же проблема, зарегистрированная в JIRA KEYCLOAK-7237, просто хотите проверить, как это обойти? Кто-нибудь может помочь? Заранее спасибо.
2018-06-30 11: 34: 13,996 WARN [org.keycloak.events] (задача-8 по умолчанию) type = LOGIN_ERROR, realmId = Victz, clientId = portal, userId = null, ipAddress =, error = invalid_redirect_uri, redirect_uri = https://www.example.com/home
Я использую Apache HTTP обратный прокси-сервер работает на centos7, дико 10, Keycloak 3.4.3. также пробовал в ниже окружающей среды, но та же ошибка.
Пробовал дико 10, дико 11, jboss 7.1, Keycloak 3.4.3, а также keycloak 4.0
Также попытался отключить Apache http и получить доступ непосредственно к http://www.example.org:8080/home, но, кажется, return_uri автоматически преобразован в https с портом 0.
Пожалуйста, смотрите ниже standalone.xml, попытался удалить ниже настройки прокси-peer и request-dumper, но не повезло.
<subsystem xmlns="urn:jboss:domain:undertow:4.0">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http" proxy-address-forwarding="true" enable-http2="true"/>
<https-listener name="https" socket-binding="https" proxy-address-forwarding="true" security-realm="ApplicationRealm" enable-http2="true"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<location name="/drive" handler="drive"/>
<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" "%{i,COOKIE}" "%{o,SET-COOKIE}" %S "%I %T"" prefix="access."/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
<http-invoker security-realm="ApplicationRealm"/>
</host>
<host name="example1" alias="example.com1,www.example.com1" default-web-module=“example1-0.1.war">
<location name="/drive" handler="drive”/>
<filter-ref name="proxy-peer"/>
<filter-ref name="request-dumper" priority="30"/>
</host>
<host name="example2" alias="example.com2,www.example.com2" default-web-module="example2-0.1.war">
<location name="/drive" handler="drive"/>
<filter-ref name="proxy-peer"/>
<filter-ref name="request-dumper" priority="30"/>
</host>
<host name="example3" alias="example.com3,www.example.com3" default-web-module="example3-0.1.war">
<location name="/drive" handler="drive"/>
<filter-ref name="proxy-peer"/>
<filter-ref name="request-dumper" priority="30"/>
</host>
</server>
<servlet-container name="default">
<jsp-config/>
<websockets/>
</servlet-container>
<handlers>
<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
<file name="drive" path="/app/drive"/>
</handlers>
<filters>
<response-header name="server-header" header-name="Server" header-value="JBoss-EAP/7"/>
<response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
<filter name="proxy-peer" class-name="io.undertow.server.handlers.ProxyPeerAddressHandler" module="io.undertow.core"/>
<filter name="request-dumper" class-name="io.undertow.server.handlers.RequestDumpingHandler" module="io.undertow.core"/>
</filters>
</subsystem>
3 ответа
Контекст
При использовании клиентского адаптера Keycloak Spring Boot за обратным прокси-сервером параметр запроса URL-адреса, заданный OAuthRequestAuthenticator.java , может содержать суффикс порта из-за неполной или ложной конфигурации.
Основная проблема
Для того, чтобы построить
redirect_uri
, приложению Spring Boot необходимо угадать свой общедоступный URL-адрес, включая как минимум протокол и имя хоста, а также, возможно, IP-порт. За обратным прокси-сервером это требует взаимодействия с прокси-сервером и/или явной настройки.
Пояснение к :0
The
:0
, если он присутствует, вероятно, был установлен OAuthRequestAuthenticator.java (эта свободная обработка может считаться ошибкой, но в данном случае связана с неполной конфигурацией.): Keycloak распознал, что приложение Spring Boot использует HTTPS, но не нашел порт HTTPS. конфигурации, поэтому по умолчанию он равен нулю.
Шаги решения
При условии, что:
- это о приложении Spring Boot
- работает за обратным прокси
- действует как клиент Keycloak
вам необходимо обеспечить следующие вещи, чтобы решить проблему:
- настроить обратный прокси, чтобы добавить следующие заголовки
- сообщая имя хоста
- говорит, является ли соединение безопасным или нет
- настроить приложение Spring Boot для правильной работы
- просто прочитайте текущее руководство Spring Boot «С практическими рекомендациями» по работе за прокси-сервером (одна краткая экранная страница)
- настроить адаптер Keycloak Spring Boot
- возможно, вам нужно явно установить
confidential-port
к443
- возможно, вам нужно явно установить
Поиск и устранение неисправностей/перекрестная проверка
Только один момент: если предположить, что речь идет о приложении Spring Boot за обратным прокси-сервером, вы должны иметь возможность использовать
tcpdump
или аналогичный для мониторинга незашифрованного трафика (например,
-i lo -s0 -A
) и увидеть заголовки HTTP. Любые запросы, отправленные в приложение Spring Boot, должны содержать заголовки, необходимые в соответствии с инструкциями Spring Boot Security, упомянутыми выше (
x-forwarded-for
а также
x-forwarded-proto
), в противном случае прокси настроен неправильно.
У меня была точно такая же проблема. Мое весеннее загрузочное приложение находится за nginx. Я обновил nginx для прохождения через заголовки x-forwarded и обновил конфигурацию весенней загрузки с помощью
Конфигурация yaml для весенней загрузки:
server:
use-forward-headers: true
keycloak:
realm: myrealm
public-client: true
resource: myclient
auth-server-url: https://sso.example.com:443/auth
ssl-required: external
confidential-port: 443
Конфигурация nginx:
upstream app {
server 1.2.3.4:8042 max_fails=1 fail_timeout=60s;
server 1.2.3.5:8042 max_fails=1 fail_timeout=60s;
}
server {
listen 443;
server_name www.example.com;
...
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 2;
proxy_pass http://app;
}
}
Конкретное изменение, которое заставило меня работать, добавляло keycloak.confidential-port
, Как только я добавил, что он больше не добавляет порт 0 в redirect_uri.
Надеюсь, это поможет.
Я столкнулся с аналогичной проблемой. Чтобы заставить его работать, я обновил standalone.xml, как показано ниже.
Конфигурация сервера
<http-listener name="default" socket-binding="http" allow-unescaped-characters-in-url="true" redirect-socket="https" proxy-address-forwarding="true" enable-http2="true"/>
Конфигурация системы единого входа
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
<realm name="myrealm">
<auth-server-url>https://sso.example.com:443/auth</auth-server-url>
<ssl-required>external</ssl-required>
<enable-cors>true</enable-cors>
<confidential-port>0</confidential-port>
</realm>
<secure-deployment name="mywar.war">
<realm>myrealm</realm>
<ssl-required>external</ssl-required>
<resource>myclient</resource>
<public-client>true</public-client>
</secure-deployment>
</subsystem>