为啥 keycloak 会删除重定向 uri 中的 SSL?
Posted
技术标签:
【中文标题】为啥 keycloak 会删除重定向 uri 中的 SSL?【英文标题】:why is keycloak removing the SSL in the redirect uri?为什么 keycloak 会删除重定向 uri 中的 SSL? 【发布时间】:2015-11-12 02:38:08 【问题描述】:我们有一个简单的要求: PS:https://=== https://
当用户点击 https:/company_landing.company.com 时,他们应该被重定向到 keycloak 登录页面(在 https:/ourcompany-keycloak.company.com) .用户输入他/她的 keycloak 登录凭据。成功登录 keycloak 后,它们将显示到 company_landing 页面。
麻烦的是:
当用户输入 - https:/company_landing.company.com
Keycloak 尝试打开登录页面,但出现 500 Internal server error 并显示“Incorrect redirect uri”,在浏览器中我看到:
https://ourcompany-keycloak.company.com/auth/realms/realm1/tokens/login?client_id=company_dev&state=aaaafffff-559d-4312-a8be-123412341234&redirect_uri=http%3A%2F%2Fcompany_landing。 company.com%3A8081%2F%3Fauth_callback%3D1
如果您观察上面的重定向 uri,我认为问题在于重定向 uri 以 http 开头,而不是 https,并且 http:/company-landing.company.com 不存在。
设置: keycloak 设置: -
领域 --> 设置 --> 登录:需要 SSL = 所有请求(也尝试使用“外部”)
应用程序-->realm1-->设置-->重定向 URI = https://company_landing.company.com/*
AWS 负载均衡器: 端口配置:443(https) 转发到 8443
我对它为什么要剥离 SSL 感到困惑?以上在本地环境中测试时工作正常(可能是因为它的http://localhost),但是当尝试访问任何经过 ssl 加密的链接时,这总是会给出无效的重定向 url。
-mm
【问题讨论】:
这个问题你解决了吗? 抱歉忘记更新了。我认为问题在于 AWS 负载均衡器设置不正确。我通过为负载均衡器侦听器设置选择以下内容来解决此问题:负载均衡器端口和协议的 443 和 https 以及实例端口和协议的 80 和 https。 端口 80 和 HTTPS?好的,所以你也在ELB后面的实例上安装了证书? 是的,我们也在ELB后面的实例上初始化了证书 所以你现在有这个工作了吗?我有同样的问题。我使用 nginx 作为负载均衡器/反向代理 【参考方案1】:您必须在代理配置 json 文件中添加以下属性,(默认为 proxy.json)作为应用程序属性(与“adapter-config”级别相同):
"proxy-address-forwarding" : true,
此配置属性未记录在案,但存在于代理配置的来源中:https://github.com/keycloak/keycloak/blob/master/proxy/proxy-server/src/main/java/org/keycloak/proxy/ProxyConfig.java
【讨论】:
我正在为 kubernetes 使用 helm 图表,其中设置了此项,但我仍然错过了 'https' 中的 's'。有没有办法检查?【参考方案2】:您不需要安装证书或使用适配器配置中的更改。
这需要在您的 standalone.xml
、standalone-ha
或 domain.xml
(视情况而定)中完成,如 Keycloak 文档反向代理部分 https://www.keycloak.org/docs/latest/server_installation/index.html#_setting-up-a-load-balancer-or-proxy 中所述
假设您的反向代理不使用端口 8443 进行 SSL,您还需要配置 HTTPS 流量重定向到的端口。
<subsystem xmlns="urn:jboss:domain:undertow:4.0">
...
<http-listener name="default" socket-binding="http"
proxy-address-forwarding="true" redirect-socket="proxy-https"/>
...
</subsystem>
将redirect-socket 属性添加到http-listener 元素。该值应该是 proxy-https,它指向您还需要定义的套接字绑定。
然后给socket-binding-group元素添加一个新的socket-binding元素:
<socket-binding-group name="standard-sockets" default-interface="public"
port-offset="$jboss.socket.binding.port-offset:0">
...
<socket-binding name="proxy-https" port="443"/>
...
</socket-binding-group>
【讨论】:
这样,您可以将 https/ssl/tls 处理卸载到负载均衡器/反向代理,并且仍然使用 https/sslredirect-socket="proxy-https"
成功了以上是关于为啥 keycloak 会删除重定向 uri 中的 SSL?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot 不会重定向到 403 上的 Keycloak 登录页面?
Keycloak 登录页面显示“无效参数:redirect_uri”
为啥我的 .htaccess 仅针对 https / ssl 不将 uri 路径重定向到 index.php?