Keycloak与Google OAuth 2.0重定向URI不匹配问题求助
已注册域名https://fm.xxxxx.com,使用Nginx作为反向代理负载均衡Keycloak,当前Nginx配置如下:
server { listen 80; listen [::]:80; server_name fm.xxxxx.com; return 301 https://fm.xxxxx.com; } server { listen 443 ssl; server_name fm.xxxxx.com; ssl_certificate /etc/nginx/certificate/xxxxx.crt; ssl_certificate_key /etc/nginx/certificate/xxxxx.key; location /realms/fm-users/ { proxy_read_timeout 90; proxy_pass http://fm-keycloak:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Scheme $scheme; client_max_body_size 30m; } location /resources/ { proxy_read_timeout 90; proxy_pass http://fm-keycloak:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Scheme $scheme; client_max_body_size 30m; }
配置Google身份提供商时,Keycloak生成的重定向URI不被Google认可,且无法在Keycloak界面修改该URI;改用域名配置后登录出现Error 400: redirect_uri_mismatch错误。站点使用HTTPS,Keycloak内部用HTTP运行。尝试在Keycloak的import.json及数据库identity_provider_config表中添加redirectUri参数均无效,本地用127.0.0.1运行正常,需要解决生产环境下的重定向URI问题,询问是否需要调整Nginx配置或有其他解决办法。
1. 配置Keycloak的前端URL(核心解决步骤)
Keycloak不知道外部访问的完整HTTPS域名,才会生成错误的内部HTTP重定向URI,得这么改:
- 若使用standalone模式,打开
standalone.xml或standalone-ha.xml,找到<subsystem xmlns="urn:jboss:domain:undertow:12.0">下的<server name="default-server">,修改http-listener配置:
<http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="true"/>
同时在启动参数中添加:
-Dkeycloak.frontendUrl=https://fm.xxxxx.com/
(注意:Keycloak 17+版本默认路径为/,旧版本为/auth,请根据实际版本调整路径)
- 若使用Docker部署,直接在启动命令中添加环境变量:
-e KEYCLOAK_FRONTEND_URL=https://fm.xxxxx.com/ -e PROXY_ADDRESS_FORWARDING=true
此设置会让Keycloak生成基于外部HTTPS域名的重定向URI,而非内部HTTP地址。
2. 补全Nginx的代理路径
当前Nginx仅代理了/realms/fm-users/和/resources/,但Google回调会请求/realms/fm-users/broker/google/endpoint这类路径,缺少/broker/代理会导致请求失败或重定向URI错误。可选择两种方式调整:
- 若域名仅用于Keycloak,直接代理根路径:
location / { proxy_read_timeout 90; proxy_pass http://fm-keycloak:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Scheme $scheme; client_max_body_size 30m; }
- 若域名还有其他服务,至少补充
/broker/路径的代理:
location /broker/ { proxy_read_timeout 90; proxy_pass http://fm-keycloak:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Scheme $scheme; client_max_body_size 30m; }
3. 在Google Cloud控制台配置正确的重定向URI
登录Google Cloud控制台,找到对应的OAuth 2.0客户端ID,添加以下重定向URI:https://fm.xxxxx.com/realms/fm-users/broker/google/endpoint
(旧版Keycloak需添加/auth前缀,即https://fm.xxxxx.com/auth/realms/fm-users/broker/google/endpoint)
确保该URI与Keycloak生成的完全一致,包括HTTPS协议和完整路径。
4. 验证Keycloak的反向代理参数
进入Keycloak管理界面,选择fm-users realm,点击Realm Settings -> General -> Advanced,确认:
Frontend URL设置为https://fm.xxxxx.com/(对应实际路径)Proxy选项设置为edge
完成以上配置后,重启Keycloak和Nginx,测试Google登录流程即可解决redirect_uri_mismatch错误。
内容的提问来源于stack exchange,提问作者user22958704

