Keycloak经Nginx认证后iss声明使用内网IP问题求助
解决Keycloak JWT中iss字段显示内部IP的问题
核心问题排查
你当前的curl请求直接访问Keycloak内部IP,完全绕过了Nginx代理,导致Keycloak接收不到配置的X-Forwarded-*请求头,自然会用内部IP作为iss字段的值。
解决步骤
通过Nginx公网域名发起请求
必须使用公网域名访问Keycloak的token端点,而非直接调用内部IP。修正后的curl命令示例:curl --location 'https://your-public-domain/auth/realms/demo1/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=rest-client' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'username=user1' \ --data-urlencode 'password=pass1'配置Keycloak强制使用公网域名
根据Keycloak版本选择对应配置:- Quarkus版本(Keycloak 17+):
替换原有PROXY_ADDRESS_FORWARDING配置,改用以下环境变量:- name: KC_PROXY value: "edge" - name: KC_HOSTNAME value: "your-public-domain"KC_HOSTNAME就是你需要的类似KEYCLOAK_SERVER_NAME的配置项,会强制Keycloak在iss字段及所有公开端点中使用指定公网域名。 - WildFly版本(Keycloak 16及以下):
保留PROXY_ADDRESS_FORWARDING=true,同时添加KEYCLOAK_SERVER_NAME环境变量:- name: PROXY_ADDRESS_FORWARDING value: "true" - name: KEYCLOAK_SERVER_NAME value: "your-public-domain"
- Quarkus版本(Keycloak 17+):
确认Nginx代理配置生效
确保Nginx的location块正确代理Keycloak,示例配置如下:location /auth { proxy_pass http://internal-ip-of-keycloak/auth; 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-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Request-ID $request_id; }
验证
配置完成后重启Keycloak和Nginx,通过公网域名发起登录请求,检查JWT的iss字段是否已变为指定的公网域名。
内容的提问来源于stack exchange,提问作者Li Ming
相关产品推荐
相关产品推荐

