oauth2.0 Flask-OIDC Keycloak HTTPS Redirect on Localhost

dpiehjr4  于 2023-10-15  发布在  其他
关注(0)|答案(2)|浏览(171)

这是我的开发设置。所有主机引用都是localhost。
我正在使用Flask-OIDC 2.0.3沿着Keycloak 22.0.3(在Docker上作为服务运行)。Flask应用程序在8080端口上运行,Keycloak在9080端口上运行,我有一个React UI在9001端口上运行。
所有这些服务都运行在http而不是https
我的Keycloak docker-compose文件如下

version: '3.8'
name: keycloak
services:
  keycloak:
    image: quay.io/keycloak/keycloak:22.0.3
    command: ['start-dev --import-realm']
    volumes:
      - ./realm-config:/opt/keycloak/data/import
    environment:
      - KC_DB=dev-file
      - KEYCLOAK_ADMIN=admin
      - KEYCLOAK_ADMIN_PASSWORD=admin
      - KC_FEATURES=scripts
      - KC_HTTP_PORT=9080
      - KC_HEALTH_ENABLED=true
      - KC_HTTPS_REQUIRED=false
    # If you want to expose these ports outside your dev PC,
    # remove the "127.0.0.1:" prefix
    ports:
      - 127.0.0.1:9080:9080
      - 127.0.0.1:9443:9443

我的 client_secrets.json 如下

{
  "web": {
    "client_id": "<client>",
    "client_secret": "<secret>",
    "auth_uri": "http://127.0.0.1:9080/realms/jhipster/protocol/openid-connect/auth",
    "token_uri": "http://127.0.0.1:9080/realms/jhipster/protocol/openid-connect/token",
    "issuer": "http://127.0.0.1:9080/realms/jhipster",
    "userinfo_uri": "http://127.0.0.1:9080/realms/jhipster/protocol/openid-connect/userinfo",
    "token_introspection_uri": "http://127.0.0.1:9080/realms/jhipster/protocol/openid-connect/token/introspect"
  }
}

我配置我的Flask应用程序如下

OIDC_CLIENT_SECRETS = "src/main/python/config/client_secrets.json"
OIDC_REDIRECT_URI = "http://127.0.0.1:8080/oidc_callback"

我的Keycloak客户端配置如下

当我点击我的UI的登录URL时,它会把我带到我创建的新领域的Keycloak登录页面。但是我看到redirect_uri已经改为https

如果我继续登录,我会得到一个错误安全连接失败
我试过以下方法

  • 从客户端的Keycloak中的redirect_uri列表中删除https
  • 然后我在Keycloak登录页面上看到一个错误,说“Invalid redirect_uri”。
  • 手动删除浏览器地址栏URL中的https,并登录
  • 然后我得到一个错误“invalid_grant:redirect_uri不正确”
    实际问题

第1部分:由于整个设置完全在我的本地机器上运行,我不确定https重定向是在哪里被拾取的,以及如何防止它?这看起来像是重定向到https的Keycloak问题(只是猜测),但这似乎很奇怪,因为流量来自http
第2部分:我需要显式实现 /oidc_callback 吗?我想Flask-OIDC会处理这个问题的。

c6ubokkw

c6ubokkw1#

Sudeep Hasra的回答是正确的。
一个解决方法是使用flask的ssl_context选项。这样你所有的应用程序都可以在ssl上运行。最简单的两个选项是:
1.使用ssl_context="adhoc"
1.使用ssl_context=("/path/to/cert.pem", "/path/tokey.pem")
范例:

if __name__ == "__main__":
    app.run('0.0.0.0', debug=True, ssl_context=("/path/to/cert.pem", "/path/tokey.pem"))

如果使用第二个选项,则必须创建证书对。在Linux中,你可以这样做:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
希望对你有帮助。

pieyvz9o

pieyvz9o2#

问题似乎出在Flask-OIDC上。该库有一个强制重定向URL通过HTTPS的提交。
如果我在第55行中将**_scheme改为http**,整个流程将按预期工作。

相关问题