路径型反向代理下Quarkus OIDC/Keycloak重定向前缀重复问题
解决Quarkus OIDC在路径型反向代理下的重定向前缀重复问题
核心问题分析
你的问题根源在于:开启quarkus.http.proxy.enable-forwarded-prefix后,Quarkus会自动给所有生成的重定向URL添加X-Forwarded-Prefix的值,但OIDC流程中,state令牌保存的原始重定向目标已经是包含代理前缀的完整外部URL(比如https://oqm-test-us-24-04.local/core/base-station/overview),导致Quarkus二次重定向时重复添加前缀,最终出现路径重复的404错误。
解决方案
1. 调整Quarkus代理配置
关闭自动添加前缀的功能,避免重复拼接路径,同时保留其他代理相关配置以正确识别外部请求信息:
# Proxy配置 quarkus.http.proxy.proxy-address-forwarding=true quarkus.http.proxy.allow-x-forwarded=true quarkus.http.proxy.enable-forwarded-host=true # 关闭自动添加前缀,避免重复拼接 quarkus.http.proxy.enable-forwarded-prefix=false
2. 配置OIDC完整回调路径
指定包含代理前缀的完整回调路径,确保Quarkus生成正确的重定向URL给Keycloak,同时避免认证循环:
# OIDC配置 # 指定完整的外部回调路径,对应代理转发后的路径 quarkus.oidc.authentication.redirect-path=/core/base-station/oauth2/callback # 保持Cookie路径和后缀配置,避免跨路径认证问题 quarkus.oidc.authentication.cookie-path=/core/base-station/ quarkus.oidc.authentication.cookie-suffix=core-base-station
3. 验证Keycloak客户端配置
确保Keycloak中对应客户端的Valid Redirect URIs设置为:
https://<host>/core/base-station/*
这会允许Keycloak回调到代理前缀下的所有路径,避免回调被拒绝。
4. 确认代理头传递
确保反向代理正确传递以下请求头:
X-Forwarded-Proto: httpsX-Forwarded-Host: <host>X-Forwarded-Prefix: /core/base-station
Quarkus会通过proxy-address-forwarding=true信任这些头,生成正确的外部URL。
为什么之前的配置会出现循环?
当你关闭enable-forwarded-prefix但仅设置redirect-path=/core/base-station时,Quarkus生成的OIDC回调URL会不完整(缺少默认的/oauth2/callback后缀),导致Keycloak回调到错误路径,触发Quarkus重新发起认证请求,最终形成重定向循环。指定完整的/core/base-station/oauth2/callback路径后,回调流程会正常完成。
内容的提问来源于stack exchange,提问作者Snappawapa
相关产品推荐
相关产品推荐

