在 Docker 容器中运行时,Flask_oidc 给出“Errno 99 无法分配请求的地址”

2024-02-18

Goal:

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

背景:

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

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

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

我效仿了https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a https://gist.github.com/thomasdarimont/145dc9aa857b831ff2eff221b79d179a甚至将我的应用程序简化为这样。

Problem:

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

这是在内心深处造成的flask_oidc > oauth2client > httplib2当尝试连接到 Keycloak 服务器时。

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

我尝试过的:

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

这(对我来说)表明我的所有设置和代码都是fine,但问题出在 Dockerflask_oidc+ 之间的交互中。

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

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

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

  • 用户前往localhost:8080找到钥匙斗篷并localhost:5000找到该应用程序。
  • Flask 应用程序在容器内运行,并且localhost不解决host而是容器内的自身。
  • You can让 Flask 连接到http://keycloak/使用容器中的网络,but然后返回该域下的所有配置。这很糟糕,因为对于外界来说这应该是localhost:8080.

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

Bonus: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并能正确应对!

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


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

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

  1. 创建了一个 docker 网络烧瓶应用程序 and keycloak容器;
  2. 编辑了属性用户信息_uri, token_uri and token_introspection_uri,将主机名替换为 keycloak 容器主机名(我正在使用 docker-compose,在本例中 keycloak 容器主机名是服务名称)。

Example:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Docker 容器中运行时,Flask_oidc 给出“Errno 99 无法分配请求的地址” 的相关文章

  • cv2.face.mindistancepredictcollector() 错误

    我已经安装了带有额外模块的 opencv 3 1 0 但是当我尝试使用 gt gt gt s cv2 face MinDistancePredictCollector 它返回一个错误 Traceback most recent call l
  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • Python - 包和设置文件

    我有一个 python 包 需要从我的项目目录中提取设置 这是我的项目当前的结构 Project bin mypackage package files Project myproject project files start py se
  • Pygame 玩家精灵没有出现

    我一直在为学校计算机课做这个项目 但无法让玩家精灵出现 有人可以帮忙吗 当我运行主游戏循环时 除了玩家精灵之外 所有内容都正确显示 它应该由于箭头输入而在屏幕上移动并受到重力的影响 当我删除图像并仅使用对象类和矩形时 该代码也有效 impo
  • WTForms 中的小数字段舍入

    我有一个包含价格小数字段的表单 如下所示 from flask ext wtf import Form import wtforms from wtforms validators import DataRequired from deci
  • 将列表传递给 PyCrypto 中的 AES 密钥生成器

    我尝试使用 Pycrypto 生成 AES 密钥 但收到以下错误 类型错误 列表 不支持缓冲区接口 对于以下声明 aescipher AES new mykey AES MODE ECB mykey 属于类型list并包含 18854347
  • int 对象在尝试对数字的数字求和时不可迭代? [复制]

    这个问题在这里已经有答案了 我有这个代码 inp int input Enter a number for i in inp n n i print n 但它抛出一个错误 int object is not iterable 我想通过将每个
  • numpy 数组最快的保存和加载选项

    我有一个生成二维的脚本numpy数组与dtype float和形状的顺序 1e3 1e6 现在我正在使用np save and np load对数组执行 IO 操作 然而 这些函数对于每个数组都需要几秒钟的时间 是否有更快的方法来保存和加载
  • 在 Windows 上将 NumPy 与 BLAS 链接

    我正在尝试在 Windows 系统上安装 Theano 并且需要安装 BLAS 和 LAPACK 我的 System32 文件夹中有这些的 dll 文件 当我运行 numpy config来自 Anaconda 的 show 库的路径正确显
  • Cython:为什么 size_t 比 int 快?

    更改某些 Cython 变量的类型int输入size t可以显着减少某些功能的时间 30 但我不明白为什么 例如 cimport numpy as cnp import numpy as np def sum int cnp int64 t
  • 为图例中的点设置固定大小

    我正在制作一些散点图 我想将图例中的点的大小设置为固定的相等值 现在我有这个 import matplotlib pyplot as plt import numpy as np def rand data return np random
  • Python unittest - 与assertRaises相反?

    我想编写一个测试来确定在给定情况下不会引发异常 测试是否有异常很简单is上调 sInvalidPath AlwaysSuppliesAnInvalidPath self assertRaises PathIsNotAValidOne MyO
  • 具有条件的重复行 pandas dataframe python

    我的数据框有问题 我的 df 是 product power brand product 1 3 x 1500W brand A product 2 2x1000W 1x100W product 3 1x1500W 1x500W brand
  • 在Python中引用不带换行符的长字符串

    我正在尝试在 Python 中编写一个长字符串 该字符串显示为 OptParser 选项的帮助项 在我的源代码 py 文件中 我想放置换行符 以便我的代码不会花费新行 但是 我不希望这些换行符影响代码运行时该字符串的显示方式 例如 我想写
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • python pandas如何在多个条件下过滤字符串

    我有以下数据框 import pandas as pd data 5Star FiveStar five star fiv estar data pd DataFrame data columns columnName 当我尝试用一 种条件
  • Python列表问题

    我在使用 python 列表时遇到问题 简化版本是 mylist1 some items in a list mylist2 mylist1 mylist1 pop i mylist insert i item print mylist1
  • Pandas 替换特定列上的值

    我知道这两个类似的问题 熊猫替换值 https stackoverflow com questions 27117773 pandas replace values Pandas 替换数据框中的列值 https stackoverflow
  • Tensorflow ctc_loss_calculator:找不到有效路径

    当运行我的神经网络 双向 LSTM 进行音频识别时 我使用连接主义时间分类 CTC 但在某些时候 训练网络时我几乎每批都会收到来自 Tensorflow 的警告 W tensorflow core util ctc ctc loss cal
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla

随机推荐

  • 存储和检索 SHA-256 散列和加盐密码的正确方法

    这是我第一次尝试安全地存储密码 我想确保一切都正确完成 建议我将 SHA 256 哈希与 salt 一起使用 假设用户通过表单提交了密码 我们通过以下方式获取密码 password POST password 对 password 加盐并对
  • ASP.NET MVC 和 IIS 5

    让 ASP NET MVC 应用程序托管在 IIS 5 6 或 7 上运行的最佳方法是什么 当我尝试发布 ASP NET MVC 应用程序时 我收到的似乎只是 404 错误 我做了一些谷歌搜索并找到了一些解决方案 但看起来都不是超级优雅 而
  • 如何从 Jena API Eclipse 项目启动 Fuseki 服务器?

    您好 我也是语义 Web 域和 Apache Jena 环境的新手 这就是我发布此问题的原因 我有一个使用 Jena API 的项目 当我运行它时 它会在控制台中显示输出 我确实从命令行运行了 Fuseki 服务器 它作为本地服务器运行 我
  • 运行 crontab 时出现权限被拒绝错误[重复]

    这个问题在这里已经有答案了 我在文件夹 csv file 中创建了一个 r 脚本 marc Marc Linux csv file ls 8388 26580527145 csv csv file Rproj excel source wr
  • Spark Dataframes UPSERT 到 Postgres 表

    我正在使用 Apache Spark DataFrames 来连接两个数据源并将结果作为另一个 DataFrame 获取 我想将结果写入另一个 Postgres 表 我看到这个选项 myDataFrame write jdbc url ta
  • Postman - 使用密钥文件进行 JWT 身份验证

    我正在尝试使用 Postman 来测试在 Google Cloud Platform 上开发的 API API 端点后面的 App Engine 我有 JSON 格式的密钥文件 type service account project id
  • BlackBerry 是否支持其应用程序开发人员的演示/测试版?

    我有兴趣为 BlackBerry 设备开发应用程序 想知道他们是否支持应用程序开发人员的演示版或测试版概念 我的意思是能够将我的应用程序的测试版或演示版部署给有限 受限的受众 例如业务合作伙伴 客户 外部测试人员等 他们中没有任何内容测试和
  • ASP.NET MVC - 如何抛出类似于 StackOverflow 上的 404 页面

    我目前有一个继承自的 BaseController 类System Web Mvc Controller 在那堂课上我有HandleError将用户重定向到 500 哎呀 我们搞砸了 页面的属性 目前这正在按预期进行 这有效
  • 让标签参与控制选项卡

    我有继承自的自定义控件Label并且有ControlStyle Selectable set to true 当用户单击该控件时 该控件将获得焦点 但如果用户从另一个控件进行选项卡 则不会获得焦点 即使当我有一个仅由该类型的控件填充的表单时
  • Reactjs 光滑的幻灯片

    我正在使用reactjs制作一个非常简单的滑块reactstrap 引导程序 工作示例 https codesandbox io s compassionate brook fz5mm https codesandbox io s comp
  • 尝试找出从 Firestore 字典中删除元素的更好方法

    我在应用程序中使用 Firestore 并且有一个名为 投票 的地图字段 用于显示用户的赞成票或反对票 它看起来像这样 我想添加一个选项来从那里删除元素 这就是我现在得到的 getting the user s votes dictiona
  • 将光标后的文本移动到新行

    我是 Vim 新手 我在 OSX Snow Leopard 上使用 MacVim 我必须采取的最常见操作之一是将光标移动到新行 并将光标后面的文本移动到新行 我知道在正常或可视模式下按 o 会将光标移动到新行并切换模式以进行插入 我想做的是
  • 注入和资源以及自动装配注释

    有什么区别 Inject and Resource and Autowired注释 我们什么时候应该使用它们 Inject Autowire Resource 之间的区别 自动连线 spring propriety 注解 与 Inject
  • 清除 Coldfusion 生产服务器中的缓存

    我正在使用 CFMX 并且存在一个问题 变量 yy 在 yyfiling 中未定义 这是生产中的一个问题 我正在推动对其进行更正 但它们似乎没有出现在服务器上 我想清除服务器缓存 以便我升级的代码可以生效 CFAdmin 生产模板已被缓存
  • 如何使用 protobuf-net 序列化/反序列化大型项目列表

    我有大约 5 亿个项目的清单 如果我序列化单个项目而不是列表 我可以将其序列化为带有 protobuf net 文件的文件 我无法将项目收集到价格列表中然后序列化 因为我耗尽了内存 因此 我必须一次序列化一条记录 using var inp
  • 为什么 Finalize() 仅在创建新对象后执行,而不是在调用 gc() 后执行?

    调用 gc 时 finalize 不应该立即执行吗 输出结果的顺序有点不太令人信服 class Test int x 100 int y 115 protected void finalize System out println Reso
  • 我可以在Asp.Net中访问另一个页面中一个页面的ViewState吗?

    有没有办法在另一个页面中访问一个页面的视图状态 请详细说明答案以消除我的疑虑 因为我认为 ViewState 的范围仅限于页面 无法在页面外部访问 您无法直接从一个页面访问另一个页面的 ViewState 如果要访问特定的 ViewStat
  • 如何在 HttpWebRequest 中混合压缩和缓存?

    我有一个 C 客户端与 Cherrypy http rest Web 服务通信 问题是我无法同时打开压缩和缓存 request AutomaticDecompression DecompressionMethods GZip Decompr
  • 如何在 HAML 中执行 if/else 而不重复缩进代码

    根据用户是否登录 我想打印不同类型的 body标签 这就是我目前的做法 if defined user body data account user account h1 Welcome all my content else body h
  • 在 Docker 容器中运行时,Flask_oidc 给出“Errno 99 无法分配请求的地址”

    Goal 从 Docker 容器中运行的 Flask 应用程序使用 OIDC 背景 我正在使用 Flask 构建一个 Web 应用程序 并希望使用 Keycloak 来提供访问权限 为此 我使用 Python 库flask oidc 所有服