Nginx反向代理下Keycloak与Spring Boot集成时redirect_uri被截断问题求助
问题根因
你的Nginx反向代理在转发请求到Spring Boot应用时,剥离了/oauth路径前缀,且未将路径前缀信息通过请求头传递给后端Spring Boot服务,导致Spring Boot侧的Keycloak适配器生成重定向地址时,无法感知到外层的/oauth路径前缀,最终生成的redirect_uri缺失该前缀。
解决步骤
1. 修正Nginx配置
调整Nginx的location块,新增X-Forwarded-Prefix请求头传递路径前缀,同时修正错误的X-Forwarded-For头配置:
location ~ ^/oauth(.*)$ { proxy_pass http://11.11.11.11$1?$query_string; proxy_buffering off; proxy_redirect off; # 修正X-Forwarded-For为正确的客户端IP传递规则 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 新增路径前缀传递头 proxy_set_header X-Forwarded-Prefix /oauth; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; }
修改后执行nginx -s reload重载配置生效。
2. 修正Spring Boot配置
添加Tomcat识别X-Forwarded-Prefix头的相关配置,替换已废弃的server.use-forward-headers配置:
# 原有keycloak基础配置保持不变 keycloak.auth-server-url=https://example.com/auth/ keycloak.realm =realm keycloak.ssl-required =external keycloak.resource =resource keycloak.credentials.secret =111111-111111-111111-1111 keycloak.securityConstraints[0].authRoles[0] =role keycloak.securityConstraints[0].securityCollections[0].name=test keycloak.securityConstraints[0].securityCollections[0].patterns[0] =/idp # 替换原有转发头配置 server.forward-headers-strategy=native server.tomcat.remote_ip_header=X-Forwarded-For server.tomcat.protocol_header=X-Forwarded-Proto # 开启对X-Forwarded-Prefix头的识别 server.tomcat.use-relative-redirects=true # 可选配置:如果上述配置后仍未生效,可强制指定Keycloak适配器的路径前缀 # keycloak.base-path=/oauth
3. 校验Keycloak客户端配置
登录Keycloak管理后台,进入你使用的对应客户端配置页,确认有效重定向URI字段配置包含https://example.com/oauth/*,避免重定向地址被Keycloak安全策略拦截。
验证
重启Spring Boot应用后访问受保护路径,此时生成的redirect_uri会自动带上/oauth前缀,符合预期。
内容的提问来源于stack exchange,提问作者simonerg
相关产品推荐
相关产品推荐

