Keycloak管理控制台无法访问。

23

我正在尝试在根服务器上设置Keycloak,但我无法从互联网访问管理控制台。我已经安装了Keycloak服务器,并将其放置在同一台机器的nginx反向代理后面。 我为该域设置了letsencrypt证书。我还通过脚本设置了keycloak的管理员用户。

当我使用域名访问服务器https://<my-domain>时,会被重定向到 https://<my-domain>/auth,这是keycloak欢迎页面,包含一个指向“管理控制台”的链接。此链接指向https://<my-domain>/admin,但显示404错误。

一开始我认为这可能是nginx的问题,因此我按照文档中的指导设置了负载均衡器(https://www.keycloak.org/docs/latest/server_installation/index.html#_setting-up-a-load-balancer-or-proxy)。在那里,在“验证配置”下,它告诉您打开路径https://<my-domain>/auth/realms/master/.well-known/openid-configuration,这按预期工作,并且我得到一个包含多个链接和其他信息的JSON文件。然而,这些链接都无法正常工作-全部返回404错误。

当我尝试https://<my-domain>/auth/realms/master时,我得到了一个JSON响应,因此一些链接确实起作用,所以我认为这不是nginx的问题,而是keycloak本身的问题。

因此,基本问题是:如何配置Keycloak,以便可以通过互联网访问管理控制台?我已经阅读到默认情况下只能在本地主机上访问它,但一定有一种方法可以覆盖此默认设置吗?

相关的nginx配置:

upstream keycloak {
    server 127.0.0.1:8080;
}

server {
    listen 443 ssl http2;
    # some ssl configuration for letsencrypt

    location / {
        proxy_pass          http://keycloak;
        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-Port    $server_port;
        proxy_set_header    X-Forwarded-Proto   $scheme;
    }
}

我编辑过的keycloak/standalone/configuration/standalone.xml中的一些部分:

<subsystem xmlns="urn:jboss:domain:undertow:10.0" ...>
    ...
    <server name="default-server">
        <http-listener name="default" 
            socket-binding="http" 
            redirect-socket="proxy-https"
            enable-http2="true"
            proxy-address-forwarding="true" />
        ...
    </server>
    ...
</subsystem>
...
<interfaces>
    <interface name="management">
        <any-address />
    </interface>
    <interface name="public">
        <any-address />
    </interface>
</interfaces>
<socket-binding-group name="standard-sockets" ...>
    ...
    <socket-binding name="proxy-https" port="443" />
    ...
</socket-binding-group>

编辑

我已经解决了这个问题。问题在于keycloak将初始页面从https://<my-domain>/重定向到https://<my-domain>/auth,但是所有其他链接都缺少此额外的/auth。因此,管理员链接指向https://<my-domain>/admin/master/console而没有/auth部分,因此该页面不存在。当我手动键入带有/auth的URL时,我得到了一个“加载中...”的页面,但是所有与之链接的样式和JavaScript文件的URL也缺少/auth部分,因此什么都无法工作。

为了解决这个问题,我现在已经在standalone.xml中更改了该行:<web-context>auth</web-context>,将其更改为<web-context>/</web-context>,现在一切都按预期运行。开始页面不再重定向,所有链接都可以正常工作,而无需其中的/auth部分。但是,如果/auth重定向是有意的,那么为什么一开始它不能正常工作,以及如何解决此问题,这可能会很有趣。


1
我很喜欢你加入的想法@Manuel。对于排除"/auth"部分,我也同意。但是对于我的情况,将该部分添加到frontendUrl似乎有所帮助。 - mraxus
这个 standalone.xml 文件在哪里,我该如何编辑它? - MoonLight
@MoonLight 我相信 standalone.xml 文件是 Keycloak 旧版 WildFly 的一部分,在 Quarkus 版本中不存在。 - silvertiger
4个回答

21
你帮我解决了问题。我设置了Java系统属性keycloak.frontendUrl(或环境变量KEYCLOAK_FRONTEND_URL),显然它需要一个完整的URL,而不仅仅是主机名。添加/auth解决了我的重定向问题。
如果没有附加/authkeycloak.hostname.fixed.hostnameKEYCLOAK_HOSTNAME)也可能会引起问题。
有关主机名提供程序的详细信息,请参见此处的文档:https://www.keycloak.org/docs/latest/server_installation/index.html#hostname

1
页面不可用 - MoonLight
1
可能只是迁移到这里:https://www.keycloak.org/server/hostname - undefined

12

在我的 Kubernetes 集群中,我发现使用 Nginx 反向代理 Keycloak 实例时遇到了相同的问题。我通过将环境变量 PROXY_ADDRESS_FORWARDING 设置为 true 来解决它。

PROXY_ADDRESS_FORWARDING=true

3
当我将Docker版本部署到Azure应用服务时,我需要添加这个。 - chris
非常感谢!我尝试了不同的设置,但只有这个在AWS上与应用程序负载均衡器(带SSL)+ nginx反向代理 + keycloak 19.0.1一起工作。 - costigator

0
请加入以下代码:ENV KC_TRANSACTION_XA_ENABLED=false

-3

5
当我打开/auth/admin/master/console/时,我看到 "{{notification.header}} {{notification.message}} Loading..."。在浏览器的开发工具中,我可以看到许多脚本和CSS文件因为404而无法加载。 - Manuel Mauky
1
我认为问题在于生成的链接中缺少“/auth”。例如,styles.css文件的链接是https://<my-domain>/resources/ik361/admin/keycloak/css/styles.css,但该链接无法使用。但是,如果我直接在域名后面添加“/auth”,就像这样https://<my-domain>/auth/resources/ik361/admin/keycloak/css/styles.css,那么它就可以使用了。所以问题是:为什么Keycloak(或Nginx?)会从URL中删除这一部分? - Manuel Mauky
我认为这可能是一个 Nginx 问题。你能否尝试从机器本身访问 Keycloak?那么你就知道它与 Nginx 有关了。 - Julian Egner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接