gpt4 book ai didi

python - Flask_oidc 在 Docker 容器中运行时给出 `Errno 99 Cannot assign requested address`

转载 作者:太空宇宙 更新时间:2023-11-03 21:29:29 26 4
gpt4 key购买 nike

目标:

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

背景:

我正在使用 Flask 构建一个 Web 应用程序,并希望使用 Keycloak 来提供访问权限。为此,我使用 Python 库flask_oidc。

所有服务都使用 docker-compose 文件在本地运行:

  • 运行 Flask 应用程序的 Gunicorn(端口 5000)
  • Keycloak(端口 8080)

我按照https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a的例子进行操作甚至将我的应用程序简化为这样。

问题:

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

这是由flask_oidc内心深处引起的> oauth2client > httplib2当尝试连接到 Keycloak 服务器时。

认为正在发生的是,库尝试打开与Keycloak服务器的连接,但尝试将其绑定(bind)到localhost 。这可能会失败,因为在 Docker 容器内,应用程序绑定(bind)到 0.0.0.0 .

我尝试过的:

[有效] 在容器外部运行 Gunicorn/Flask 应用程序,并在容器内部运行 Keylcoak。

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

问题:谁能解释一下吗?我真的希望有人有一个工作设置(docker 内的 Flask 和 Flask_oidc),并且愿意分享这个。

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

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

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

现在,如果您确实拥有域名(例如 keycloak.awesome.app 和 app.awesome.app),我认为它会正常工作,因为它会使用外部 DNS 将其解析为 IP 地址,这是正确的机器。

奖励:PyOIDC 可以从 Keycloak 检索提供程序配置,因此无需再手动输入。耶!

新设置对于本地开发,我决定进行一些设置,如下所示:

(1) 添加至 /etc/hosts : 127.0.0.1 keycloak.dev.local
127.0.0.1 app.dev.local

(2) 添加到您的 Flask 服务中 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并能做出正确的 react !

请注意,我仍然更喜欢更好的解决方案。一旦我的 IP 地址发生变化,此设置就会失败。

最佳答案

flask-oidc 从客户端 secret 文件获取 token 端点配置。

我设法通过进行以下更改使其工作:

  1. flask 应用keycloak 容器创建了 docker 网络;
  2. 编辑了属性 userinfo_uritoken_uritoken_introspection_uri,将主机名替换为 keycloak 容器主机名(我正在使用 docker-compose,在本例中,keycloak 容器主机名是服务名称)。

示例:

{
"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 网络连接来交换 token 信息。

关于python - Flask_oidc 在 Docker 容器中运行时给出 `Errno 99 Cannot assign requested address`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com