在 EC2 上部署的 docker 中使用 flask_oidc 和 nginx 反向代理的烧瓶应用程序在使用 keycloak 进行身份验证后给出未授权错误

Posted

技术标签:

【中文标题】在 EC2 上部署的 docker 中使用 flask_oidc 和 nginx 反向代理的烧瓶应用程序在使用 keycloak 进行身份验证后给出未授权错误【英文标题】:flask application using flask_oidc with nginx reverse proxy in docker deployed on EC2 giving Not authorized error after authentication with keycloak 【发布时间】:2021-08-25 16:30:13 【问题描述】:

我有以下设置:

1:在 EC2 实例上运行的 Keycloak docker 容器。 (我已将其临时配置为接受 http 连接)

2:我的 Flask 应用程序与 nginx 反向代理一起在另一个 EC2 实例上的 docker 中运行。

我已经在 keycloak 上创建了领域和客户端,并配置了重定向 uri。

我能够让我的烧瓶应用程序访问 Keycloak 实例进行身份验证。

我添加了from werkzeug.middleware.proxy_fix import ProxyFixapp.wsgi_app = ProxyFix(app.wsgi_app) 以使redirect_uri 正常工作。

但是,当重定向发生时,我收到“未授权”错误(我也可以在 nginx 日志中看到 401)。

我已将OVERWRITE_REDIRECT_URI 设置为OVERWRITE_REDIRECT_URI = 'https://authenticationdemo.mydomain/oidc_callback' 我将 nginx 配置为将带有端点 oidc_callback 的 https 请求转发到我的烧瓶应用程序路由 /oidc_callback(我没有实现自己的回调)。

    location /oidc_callback
        proxy_pass http:/<flask_app_name_in_docker>:<port>/oidc_callback;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_redirect off;
    

我无法解决这个问题,因为我无法确定回调出错的地方。我可以通过 GET /oidc_callback?state=<...somevalue..>&session_state=<...somevalue>&code=<..somevalue...> 查看来自 nginx 的日志 但是重定向后这不起作用。

我都试过了

    在重定向 uri 中使用 ip 地址 域名与我的证书相同,并使用 keycloak 在 EC2 实例上配置 hosts 文件,以使用烧瓶应用程序指向 EC2 实例的正确 IP 地址

两者都不工作。

我无法确定在传回身份验证信息时是否出现问题,或者是否存在一些基本配置错误。

有人可以指出正确的方法吗?

我已经在其他相关问题中查找并尝试了信息:

Flask_oidc gives Errno 99 Cannot assign requested address when run in Docker container

flask-oidc-redirect-uri-value-being-overwritten-somewhere

flask-oidc-with-keycloak-oidc-callback-default-callback-not-working

(并阅读许多其他类似的)

我不是在寻找自定义回调。我只需要默认的回调行为,因为它没有反向代理。

【问题讨论】:

【参考方案1】:

更新: 我发现问题是由于在flask_oidc中的函数_is_id_token_valid(self,id_token)中匹配'OIDC_VALID_ISSUER'的检查失败。将端口号放在 client_secrets 中颁发者的 url 中会导致问题。删除它解决了这个问题。

【讨论】:

以上是关于在 EC2 上部署的 docker 中使用 flask_oidc 和 nginx 反向代理的烧瓶应用程序在使用 keycloak 进行身份验证后给出未授权错误的主要内容,如果未能解决你的问题,请参考以下文章

Docker和AMI之间的区别

用于在 AWS EC2 中构建和部署 docker 映像的 CI/CD 脚本

单个服务器上的多个子域。码头工人 + NGINX @ EC2

AWS opsworks docker 服务发现

具有 Auto Scaling 与弹性容器服务 (ECS) 的 AWS EC2 - Docker

Nacos Server Docker部署集群踩坑