在Docker contain中运行时,Flask_-oidc给出“Errno 99 Cannot assign required address”(错误号99无法分配请求的地址)

2024-06-13 18:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

目标:

使用Docker容器中运行的Flask应用程序中的OIDC。在

背景:

我正在用Flask构建一个web应用程序,并希望使用keyclope来提供访问。为此,我使用Python库flask_-oidc。在

所有服务都在本地运行,其中包含docker compose文件:

  • 运行烧瓶应用程序的Gunicorn(端口5000)
  • 钥匙斗篷(端口8080)

我遵循了https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a的例子,甚至将我的应用程序简化为这样。在

问题:

  1. 启动所有服务
  2. 导航到需要登录的服务(/private在示例中)
  3. 用户被重新路由到Keycloud服务器,提示用户登录。在
  4. 用户登录。在
  5. keycloop将用户路由回应用程序(/oidc_callback
  6. !!!Flask应用程序崩溃,并出现OSError: [Errno 99] Cannot assign requested address错误。在

当cd6{cd6}连接到cd6}时,{>。在

我认为正在发生的事情是,库试图打开与keydocaper服务器的连接,但试图将其绑定到localhost。这可能会失败,因为在Docker容器中,应用程序被绑定到0.0.0.0。在

我尝试了:

[WORKS]在容器外运行Gunicorn/Flask应用程序,在容器内运行Keylcoak。在

这表明(对我来说)我的所有设置和代码都是好的,但问题出在Docker<;-->;flask_oidc+之间的交互中。在

问题: 有人能解释一下吗?我真的希望有人有一个工作设置(瓶内码头与烧瓶外罩),并愿意分享这个。在

更新[2018年5月12日] 我想我明白了。我使用PyOIDC手动完成所有步骤并能够进行调试。在

在您自己的计算机(localhost)上运行Docker中的两个服务时,您会遇到冲突:

  • 用户可以到localhost:8080找到keyclope,localhost:5000来查找应用程序。在
  • Flask应用程序在容器内运行,localhost不解析到主机,而是解析到容器中的自身。在
  • 您可以使用容器中的网络让Flask连接到http://keycloak/,但是然后它返回这个域下的所有配置。这是不好的,因为对外界来说它应该是localhost:8080。在

现在,如果你真的有域名(例如keycloop.awesome.app以及app.awesome.app)我认为它会很好地工作,因为它将使用外部DNS将其解析为IP地址,这是正确的机器。在

额外的好处是:PyOIDC可以从keydocaper中检索提供者配置,因此不再需要手动输入。耶!在

新设置 为了地方发展,我决定做一个小的设置如下:

(1)添加到/etc/hosts127.0.0.1 keycloak.dev.local 127.0.0.1 app.dev.local

(2)在docker-compose.yml中添加烧瓶服务: extra_hosts: #host.docker.internal is not accepted. - "keycloak.dev.local:<YOUR IP ADRESS>" - "app.dev.local:<YOUR IP ADRESS>"

(=)现在,您和Flask应用程序都可以访问keycloak.dev.local,并可以正确响应!在

请注意,我还是喜欢一个更好的解决方案。一旦我的ip地址改变,这个设置就失败了。在


Tags: docker用户devapp应用程序localhostflask烧瓶
1条回答
网友
1楼 · 发布于 2024-06-13 18:30:21

flask oidc从客户端机密文件获取令牌端点配置。在

我做了以下更改,成功地做到了这一点:

  1. flask应用程序keyclope容器创建了docker网络
  2. 编辑了属性userinfo_uritoken_uritoken_introspection_uri,将主机名替换为key斗篷容器主机名(我使用的是docker compose,在本例中key斗篷容器主机名是服务名称)。在

示例:

{
  "web": {
    "auth_uri": "http://localhost:8080/auth/realms/REMOVED/protocol/openid-connect/auth",
    "client_id": "flask-client",
    "client_secret": "REMOVED",
    "redirect_uris": ["http://localhost:5000/oidc_callback"],
    "userinfo_uri": "http://keycloak:8080/auth/realms/REMOVED/protocol/openid-connect/userinfo",
    "token_uri": "http://keycloak:8080/auth/realms/REMOVED/protocol/openid-connect/token",
    "token_introspection_uri": "http://keycloak:8080/auth/realms/REMOVED/protocol/openid-connect/token/introspect"
  }
}

现在它通过docker网络连接来交换令牌信息。在

相关问题 更多 >