Docker "Failed to turn code into token" 中的 Keycloak

Keycloak in Docker "Failed to turn code into token"

我正在 运行ning Keycloak、keycloak 安全代理和 ui 应用程序 Docker-compose 网络中。当我尝试访问该网页时,我得到了一个可以使用的登录页面 - 但我没有成功重定向,而是收到以下错误:

> Aug 03, 2018 1:13:24 PM org.keycloak.adapters.OAuthRequestAuthenticator resolveCode
ERROR: failed to turn code into token
java.net.ConnectException: Connection refused (Connection refused)
      at java.net.PlainSocketImpl.socketConnect(Native Method)
      at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
      at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
      at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
      at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
      at java.net.Socket.connect(Socket.java:589)

无论我代理哪种应用程序,或者如果我 运行 它在 Docker-compose 中或只是作为一个节点,我都会收到此错误。当我尝试使用 python 适配器而不是安全代理时,它也可能出现。

整个网络运行都在公司代理后面,这可能是原因吗?

考虑到代码似乎已发送(见下文),Keycloak 似乎至少可以验证用户。但我对如何解决这个问题感到困惑。有人有什么想法吗?

http://localhost:8080/?state=84736978-afe6-43eb-a554-aedf86717415session_state=8a231709-5ef3-45fd-8e36-103e521ba49ecode=eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..4GewkGISgYEXeGPuCxupsA.V939JivWRaNltjnjT4r2CJGT4oj1HEX9iXycJFoAb_qhI4ietRc5Z2wQO6ekF9MOZ0VtMcLAyX0zASY-NPEcf3byX0INP-2zJDSF4TOEXNbMbMnVeKFgmLgQKDseUsl1ieofPVY7df8QVvpTs98VAw2_g2XwTsLemBcpxfalvMRBwViN6PyJI8A-gJJToolyDafHbzIco7bH4X4y5bzZsUh5yB6ZUMy0goBkAV_KPLepnA8X2OjEJef8GHyqgHVi.QQtjD-E_MZq72hb4g0BEbw

我的 proxy.json 文件是:

{
   "target-url": "http://localhost:7005",
   "bind-address":"0.0.0.0",
   "http-port":"8080",
   "applications":[
      {
        "base-path":"/",
        "adapter-config":{
            "realm":"realm",
            "resource":"realm_ui",
            "auth-server-url":"http://localhost:8800/auth",
            "ssl-required":"external",
            "credentials": {
             "secret":"secret"
            },
            "confidential-port":0
        },
        "constraints":[
            {
               "pattern":"/*",
               "roles-allowed":[
                  "user"
               ]
            }
         ]
      }
   ]
}

在 Keycloak 中:

Access Type: confidential
Standard Flow Enabled: ON
Direct Access Grands: ON
The Valid Redirect URI: * 

确保凭据机密和 auth-server-url 值在 keycloak.json 和 proxy.json 文件中相同。另外,尝试删除 proxy.json 文件中的 "confidential-port":0。

我认为有公司代理不是这个错误的原因。

找了一段时间,找到了解决办法。这是一个网络问题。 Keycloak OpenIDConnect 身份验证流程遵循 3 个步骤,如下所述:https://www.keycloak.org/docs/3.3/server_admin/topics/sso-protocols/oidc.html

第 1 步和第 2 步已完成,但从浏览器收到临时代码后,应用程序无法与 Keycloak 连接。在第 1 步和第 2 步中,始终是浏览器连接到应用程序或 Keycloak,而不是它们相互交谈。

发生这种情况,因为在我的 docker-compose 文件中,我声明了覆盖 Keycloak 和代理的自动绑定到 0.0.0.0 的网络。此外,连接到 Keycloak 的 auth-server-url 必须对浏览器以及 Keycloak 安全代理的 docker 容器为真。