Keycloak部署于Apache2反向代理后重定向异常求助
1. 检查Keycloak客户端的回调URI配置
登录Keycloak控制台,找到对应客户端,确认Valid Redirect URIs配置为客户端实际回调地址:https://localhost:8080/login/oauth2/code/my-realm(或通配符https://localhost:8080/*)。若该配置误设为https://public.authserver/*,会直接导致重定向到代理地址。
2. 修正Apache反向代理的ProxyPassReverse配置
当前配置中的ProxyPassReverse "/" "http://localhost:8080/"会将Keycloak返回的所有包含http://localhost:8080/前缀的Location头替换为代理地址https://public.authserver/,这是客户端回调地址被篡改的核心原因。
调整方案:仅针对Keycloak自身核心路径设置ProxyPassReverse,避免影响客户端回调地址:
ProxyPass "/" "http://localhost:8080/" # 仅替换Keycloak自身路径,不修改客户端回调地址 ProxyPassReverse "/realms" "http://localhost:8080/realms" ProxyPassReverse "/admin" "http://localhost:8080/admin" ProxyPassReverse "/protocol" "http://localhost:8080/protocol" HostnameLookups Off RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME} RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS} RequestHeader set "X-Forwarded-Host" expr=%{HTTP_HOST} RequestHeader set "X-Forwarded-Port" expr=%{SERVER_PORT} UseCanonicalName Off ProxyPreserveHost On
3. 完善Keycloak的代理模式配置
当前启动命令仅指定--proxy-headers forwarded,缺少代理模式的明确配置。由于你的场景是Apache处理SSL后转发到HTTP的Keycloak,应使用edge代理模式:
修改启动命令为:
/opt/keycloak/keycloak-24.0.3/bin/kc.sh start --proxy edge --proxy-headers forwarded
4. 验证客户端请求的redirect_uri参数
检查客户端发起授权请求的完整URL,确认其中的redirect_uri参数是否为https://localhost:8080/login/oauth2/code/my-realm。若该参数被错误设置为代理地址,需修正客户端代码或配置中的redirect_uri值。
5. 测试验证
完成上述配置调整后,重启Apache和Keycloak,重新发起登录流程,确认重定向地址是否符合预期。
内容的提问来源于stack exchange,提问作者Ace of Spade

