Ich habe eine HAProxy als Load Balancer vor 2 Maschinen mit Keycloak im Standalone-Modus.HAProxy + Keycloak Redirect Problem
Versionen
- HAProxy Version 1.6.3, veröffentlicht 2015/12/25
- Keycloak Version 2.4.0.Final
HAProxy Config
global
user haproxy
group haproxy
log /dev/log local0
log-tag WARDEN
chroot /var/lib/haproxy
daemon
quiet
stats socket /var/lib/haproxy/stats level admin
maxconn 256
pidfile /var/run/haproxy.pid
tune.bufsize 262144
defaults
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms
log global
mode http
option httplog
option dontlognull
option redispatch
retries 5
stats uri /haproxy-status
frontend http-in
mode http
bind *:80
maxconn 2000
redirect scheme https code 301 if !{ ssl_fc }
frontend https
mode http
default_backend servers
bind *:443 ssl crt /etc/letsencrypt/live/authhomolog2.portaltecsinapse.com.br/combined.pem
maxconn 2000
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-For %[src]
http-request set-header X-Forwarded-Proto https
backend servers
mode http
balance source
cookie JSESSIONID prefix
server master 172.30.0.74:8080 maxconn 32 check cookie master
server slave 172.30.0.124:8080 maxconn 32 check cookie slave
Keycloak relevant configs
<subsystem xmlns="urn:jboss:domain:undertow:3.0">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default"
socket-binding="http"
proxy-address-forwarding="true"
redirect-socket="proxy-https"/>
...
...
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="proxy-https" port="443"/>
...
...
Wenn ich versuche, in einer Java-Anwendung anmelden, die Keycloak als Single Sign-On verwendet, habe ich die 403 Forbidden Fehler auf dem Bildschirm:
HAProxy log
16 Dezember 13.18.49 keycloak-haproxy-Test WARDEN [8714]: 191.205.78.16:35794 [16/Dec/2017: 13: 18: 48,582] https ~ Server/Master 487/0/0/72/559 2765 - - --NN 2/2/0/1/0 0/0 "ABRUFEN /realms/BMW/Protokoll/openid-connect/auth? Response_type = Code & client_id = BMWGestaoDealer & redirect_uri = https% 3A% 2F% 2Fhomolog2gd.bmwbic.com.br% 2Ffavicon.ico & state = 81% 2F4ad46389-fe45-4dec-b804-5563c29c51db & Login = true & scope = openid
HTTP/1.1 "16. Dezember 13:18:49 keycloak-haproxy-test WARDEN [8714]: 54.233.89.231:54608 [16/Dez/2017: 13: 18: 48.606] https ~ server/slave 552/0/0/4/556 457 - - --NN 2/2/0/1/0 0/0 "POST /Realms/BMW/Protokoll/openid-connect/Token HTTP/1.1"
Ich erkannte, dass die Anforderung, die Die auf meinem Computer gestartete GET-Anforderung (191.205.78.16) wurde von Master Keycloak-Maschine beantwortet, und die umgeleitete POST-Anforderung, die vom Anwendungsserver (54.233.89.231) gestartet wurde, wurde vom Slave Keycloak-Gerät beantwortet. Ich möchte, dass alle diese Anfragen von derselben Maschine (Master oder Slave) beantwortet werden. Weißt du wie ich das mache? Ich habe viele verschiedene Konfigurationen in HAProxy ohne Erfolg ausprobiert. :-(
Nur eine weitere Informationen, wenn es mir gut es funktioniert einfach den Master oder den Slave Keycloak Instanz bis verlassen
Keycloak Slave
2017-12-16 14 loggt sein. 43: 13.235 WARN [org.keycloak.events] (Standardaufgabe 1) type = CODE_TO_TOKEN_ERROR, RealmId = BMW, clientId = BMWGestaoDealer, userId = null, ipAddress = 54.233.89.231, error = invalid_code, grant_type = authorization_code, code_id = 52204563-53c8-4c72-bd8c-cb7540ebda3b, client_auth_method = Client-Geheimnis
ich hier jede Hilfe dankbar würde.