为啥 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.xmlstandalone-hadomain.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/ssl redirect-socket="proxy-https" 成功了

以上是关于为啥 keycloak 会删除重定向 uri 中的 SSL?的主要内容,如果未能解决你的问题,请参考以下文章

keycloak,为啥后端频道需要重定向 url

为啥 Spring Boot 不会重定向到 403 上的 Keycloak 登录页面?

Keycloak 登录页面显示“无效参数:redirect_uri”

为啥我的 .htaccess 仅针对 https / ssl 不将 uri 路径重定向到 index.php?

从 Keycloak 帐户页面注销时更改 redirect_uri

如何使用 Spring Boot 在 Keycloak 中设置 redirect_uri