Keycloak 重定向 URI 正在向 URL 添加端口零



在钥匙斗篷中遇到redirect_uri错误。在JIRA KEYCLOAK-7237上发现相同的问题,只是想检查任何解决方法?有人可以帮忙吗?提前谢谢你。

2018-06-30 11:34:13,996 WARN [org.keycloak.events] (default task-8( type=LOGIN_ERROR, realmId=Victz, clientId=portal, userId=null, ipAddress=, error=invalid_redirect_uri, redirect_uri=https://www.example.com:0/home

我正在使用在 centos7、疯狂 10、keycloak 3.4.3 上运行的 apache http 反向代理。 在下面的环境中也尝试过,但同样的错误。

试过 狂野 10, 狂野 11, JBoss 7.1, 钥匙斗篷 3.4.3 以及钥匙斗篷 4.0

还尝试关闭 apache http 并直接访问 http://www.example.org:8080/home ,但似乎return_uri自动转换为端口为 0 的 https。

请参阅下面的独立.xml,尝试在代理对等和请求转储程序配置下方删除,但没有运气。

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http" proxy-address-forwarding="true" enable-http2="true"/>
<https-listener name="https" socket-binding="https" proxy-address-forwarding="true" security-realm="ApplicationRealm" enable-http2="true"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<location name="/drive" handler="drive"/>
<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; &quot;%{i,COOKIE}&quot; &quot;%{o,SET-COOKIE}&quot; %S &quot;%I %T&quot;" prefix="access."/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
<http-invoker security-realm="ApplicationRealm"/>
</host>
<host name="example1" alias="example.com1,www.example.com1" default-web-module=“example1-0.1.war">
<location name="/drive" handler="drive”/>
<filter-ref name="proxy-peer"/>
<filter-ref name="request-dumper" priority="30"/>
</host>
<host name="example2" alias="example.com2,www.example.com2" default-web-module="example2-0.1.war">
<location name="/drive" handler="drive"/>
<filter-ref name="proxy-peer"/>
<filter-ref name="request-dumper" priority="30"/>
</host>
<host name="example3" alias="example.com3,www.example.com3" default-web-module="example3-0.1.war">
<location name="/drive" handler="drive"/>
<filter-ref name="proxy-peer"/>
<filter-ref name="request-dumper" priority="30"/>
</host>
</server>
<servlet-container name="default">
<jsp-config/>
<websockets/>
</servlet-container>
<handlers>
<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
<file name="drive" path="/app/drive"/>
</handlers>
<filters>
<response-header name="server-header" header-name="Server" header-value="JBoss-EAP/7"/>
<response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
<filter name="proxy-peer" class-name="io.undertow.server.handlers.ProxyPeerAddressHandler" module="io.undertow.core"/>
<filter name="request-dumper" class-name="io.undertow.server.handlers.RequestDumpingHandler" module="io.undertow.core"/>
</filters>
</subsystem>

上下文

在反向代理后面使用 Keycloak 的 Spring Boot 客户端适配器时,由于配置不完整或错误.javaredirect_uri由 OAuthRequestAuthenticator 设置的 URL 查询参数可能包含端口后缀:0

基本问题

为了构造redirect_uri,Spring Boot 应用程序需要猜测其公共 URL,至少包括协议和主机名,可能还包括 IP 端口。在反向代理后面,这需要与代理合作和/或显式配置。

对 :0 的说明

:0,如果存在,可能是由OAuthRequestAuthenticator设置的.java(这种松散的处理可能被认为是一个错误,但在本例中源于不完整的配置(。 Keycloak 认识到 Spring Boot 应用程序正在使用 HTTPS,但它没有发现 HTTPS 端口配置,因此默认为零。

解决方案步骤

假设:

  • 这是关于 Spring 启动应用程序
  • 在反向代理后面运行
  • 充当钥匙斗篷客户端

您需要确保以下事项来解决问题:

  1. 配置反向代理以添加以下标头
    • x-forwarded-for告诉主机名
    • x-forwarded-proto判断连接是否安全
  2. 配置 Spring 启动应用程序以正确运行
    • 只需阅读当前的 Spring 引导"操作方法"指南,了解如何在代理服务器后面运行(一个简洁的屏幕页面(
  3. 配置 Keycloak 的 Spring 引导适配器
    • 也许您需要将confidential-port显式设置为443

故障排除/交叉检查

只有一点:假设这是关于反向代理后面的Spring Boot应用程序,您应该能够使用tcpdump或类似工具来监视未加密的流量(如-i lo -s0 -A(并查看HTTP标头。发送到 Spring Boot 应用程序的任何请求都应具有根据上述 Spring Boot 安全操作方法(x-forwarded-forx-forwarded-proto(所需的标头,否则代理配置错误。

我遇到了同样的问题。我的春季启动应用程序位于nginx后面。我更新了 nginx 以通过 x 转发的标头,并更新了 spring 启动配置

弹簧启动 YAML 配置:

server:
use-forward-headers: true    
keycloak:
realm: myrealm
public-client: true
resource: myclient
auth-server-url: https://sso.example.com:443/auth
ssl-required: external
confidential-port: 443

nginx配置:

upstream app {
server 1.2.3.4:8042 max_fails=1 fail_timeout=60s;
server 1.2.3.5:8042 max_fails=1 fail_timeout=60s;
}
server {
listen 443;
server_name www.example.com;
...
location / {
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-Host $host;
proxy_set_header        X-Forwarded-Port   443;
proxy_next_upstream     error timeout invalid_header http_500;
proxy_connect_timeout   2;
proxy_pass          http://app;
}
}

使它对我有用的具体变化是添加keycloak.confidential-port.一旦我添加了它不再在redirect_uri中添加端口 0。

希望有帮助。

我遇到了类似的问题。为了使它工作,我已经独立更新了.xml如下所示

服务器配置

<http-listener name="default" socket-binding="http" allow-unescaped-characters-in-url="true" redirect-socket="https" proxy-address-forwarding="true" enable-http2="true"/>

单点登录配置

<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
<realm name="myrealm">
<auth-server-url>https://sso.example.com:443/auth</auth-server-url>
<ssl-required>external</ssl-required>
<enable-cors>true</enable-cors>
<confidential-port>0</confidential-port>
</realm>
<secure-deployment name="mywar.war">
<realm>myrealm</realm>
<ssl-required>external</ssl-required>
<resource>myclient</resource>
<public-client>true</public-client>
</secure-deployment>
</subsystem>

相关内容

  • 没有找到相关文章

最新更新