Docker中的Keycloak“无法将代码转换为令牌”

Gen*_*nKa 5 docker keycloak docker-compose

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

> 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)
Run Code Online (Sandbox Code Playgroud)

无论我代理什么类型的应用程序,或者我在 Docker-compose 中运行它还是仅仅作为一个节点运行它,我都会收到这个错误。当我尝试使用 python 适配器而不是安全代理时,它也可能出现。

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

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

HTTP://本地主机:8080 /状态= 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"
               ]
            }
         ]
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

在 Keycloak 中:

Access Type: confidential
Standard Flow Enabled: ON
Direct Access Grands: ON
The Valid Redirect URI: * 
Run Code Online (Sandbox Code Playgroud)

Gen*_*nKa 7

经过一段时间的搜索,我找到了解决方案。这是一个网络问题。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 容器必须为 true。