微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在EC2上部署的docker中使用flask_oidc和nginx反向代理的flask应用程序在使用keycloak进行身份验证后出现未授权错误

我有以下设置:

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

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

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

我可以让我的 Flask 应用程序访问 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 请求转发到我的 Flask 应用程序路由 /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 的日志 但重定向后这不起作用。

我都试过了

  1. 重定向 uri 中使用 IP 地址
  2. 域名与我的证书相同,并在 EC2 实例上使用 keycloak 配置主机文件,以指向具有 Flask 应用程序的 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

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?