Адаптер Keycloak NodeJS игнорирует X-Forwarded-Proto - PullRequest
0 голосов
/ 06 декабря 2018

keycloak-connect , который является рекомендуемым адаптером NodeJS из документов Keycloak, не учитывает заголовок X-Forwarded-Proto , когдаЗащищенное приложение находится за обратным прокси-сервером Apache.

Действительно, redirectUri создается следующим образом:

let host = request.hostname;
let headerHost = request.headers.host.split(':');
let port = headerHost[1] || '';
let protocol = request.protocol;*
let hasQuery = ~(request.originalUrl || request.url).indexOf('?');

let redirectUrl = protocol + '://' + host + (port === '' ? '' : ':' + port) + (request.originalUrl || request.url) + (hasQuery ? '&' : '?') + 'auth_callback=1';

request.protocol всегда является "http" из-за обратного прокси-сервера, таким образом, redirectUriне имеет ожидаемого протокола (HTTPS).

Если это преднамеренно и не является ошибкой, является ли использование HTTP в redirectUri недостатком безопасности, даже если клиент перенаправляет на HTTPS?Разве токен не мог быть выставлен в это время?

1 Ответ

0 голосов
/ 13 декабря 2018

Оказывается, проблема конфигурации на стороне защищенного приложения , которая также касается других адаптеров Keycloak, таких как Фильтр сервлетов Java или Spring .

По умолчанию любое защищенное приложение будет игнорировать заголовок X-Forwarded-Proto.

NodeJS

Используемая веб-платформа (например, Express) должна быть настроена научитывайте заголовки прокси.

Для Express в документации указано, что приложение должно доверять прокси, например:

app.set('trust proxy', 'loopback');

Адаптеры Java

Для Spring очень мало настроек, которые можно сделать как для документов , в application.properties :

server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto 

Для фильтра сервлетов Java естьНесколько решений:

Клапан Tomcat может быть добавлен к server.xml :

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
           internalProxies="127.0.0.1" 
           remoteIpHeader="x-forwarded-for" 
           proxiesHeader="x-forwarded-by" 
           protocolHeader="x-forwarded-proto" /> 

Возможно также реализовать новый фильтр сервлетов перед Адаптер фильтра Keycloak, зарегистрированный в web.xml , как в в этом примере .

...