2017-12-16 12 views
0

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.

Antwort

0

Ich bin nicht wirklich vertraut mit Haproxy oder Keycloak, aber es sieht aus wie ein Problem mit Session Stickiness. Also meine Vermutung ist, klebrige Sitzungen sollten auf der Seite haproxy aktiviert werden, so dass er auf dem gleichen Backend bleiben konnte wie Umleitung auftritt. Hoffe es gibt dir einen Hinweis.