Keycloak Gitpod Flask OIDC:oauth2client.client.FlowExchangeError:无效响应:301

Posted

技术标签:

【中文标题】Keycloak Gitpod Flask OIDC:oauth2client.client.FlowExchangeError:无效响应:301【英文标题】:Keycloak Gitpod Flask OIDC: oauth2client.client.FlowExchangeError: Invalid response: 301 【发布时间】:2021-06-30 19:13:29 【问题描述】:

我正在尝试在 Gitpod 工作空间内运行的 Flask 应用程序中实现 Flask-OIDCKeycloak

我正在像这样运行应用程序和Keycloak 服务器:

./keycloak-11.0.3/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 &
flask run --host=0.0.0.0 & 

基于this post

我可以从Flask 应用程序中为普通用户重定向到Keycloak 登录页面,但是当我使用现有用户登录时,我得到以下信息:

oauth2client.client.FlowExchangeError:无效响应:301


我的client_secrets.json 目前看起来像这样:


  "web": 
    "auth_uri": "http://keycloak-hostname-gitpod/auth/realms/realm/protocol/openid-connect/auth",
    "issuer": "http://keycloak-hostname-gitpod/auth/realms/realm",
    "userinfo_uri": "http://keycloak-hostname-gitpod/auth/realms/realm/protocol/openid-connect/userinfo",
    "client_id": "client",
    "client_secret": "client_secret",
    "redirect_uris": ["http://flask-app-hostname-gitpod/oidc_callback"],
    "token_uri": "http://keycloak-hostname-gitpod/auth/realms/realm/protocol/openid-connect/token",
    "token_introspection_uri": "http://keycloak-hostname-gitpod/auth/realms/realm/openid-connect/token/introspect"
  

keycloak里面的相关客户端配置:

Root URL:            http://flask-app-hostname-gitpod/*
Valid Redirect URIs: http://flask-app-hostname-gitpod/*
Admin URL:           http://flask-app-hostname-gitpod/*
Web Origins:         http://flask-app-hostname-gitpod

我在所有这些 url 中都使用 http 而不是 https,因为当我使用 https Keycloak 时,redirect_uri 是无效的。这似乎是这里的实际问题,因为 gitpod url 使用https,但我不知道如何处理这个问题。我尝试了一些类似here 的解决方案,但无法让它们发挥作用。

相关部分路由:

@app.route("/")
def hello_world():
    if oidc.user_loggedin:
        return (
            'Hello, %s, <a href="/private">See private</a> '
            '<a href="/logout">Log out</a>'
        ) % oidc.user_getfield("preferred_username")
    else:
        return 'Welcome anonymous, <a href="/private">Log in</a>'


@app.route("/private")
@oidc.require_login
def test():
    return "test"

standalone.xml 中可能相关的部分:

<http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" read-timeout="30000" proxy-address-forwarding="true" />
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" read-timeout="30000" />

更新

在将 http url 更改为 https 为 Jan Garaj suggested 并设置 OVERWRITE_REDIRECT_URI 之后,我不再收到 invalid response: 301 错误:

OVERWRITE_REDIRECT_URI = "https://flask-app-hostname-gitpod/oidc_callback"

现在我可以进入 keycloak 登录表单,但在登录时我现在得到:

oauth2client.client.FlowExchangeError:无效响应:401。

这些是提出的请求:

https://keycloak-hostname-gitpod/auth/realms/realm/login-actions/authenticate?session_code=session_code&execution=execution&client_id=client&tab_id=tab_id
https://flask-app-hostname-gitpod/oidc_callback?state=state&session_state=session_state&code=code

网络检查器内部的请求:

【问题讨论】:

添加/编辑有效重定向 URI 的客户端配置,并在那里添加 https 应用程序 url 以解决 redirect_uri is invalid 问题。顺便说一句:OIDC 协议在实际产品设置中需要 https。您还应该提供更多详细信息。显然有些端点返回 301,但不清楚哪个端点有这个问题。 @JanGaraj 谢谢你的帮助。我现在已将所有内容设置为 https。当我这样做时,redirect_uri 仍然是 http 并且失败了,但我能够通过按照this answer 中的建议设置OVERWRITE_REDIRECT_URI 来解决这个问题。我已经用更多细节更新了我的问题。重定向现在似乎可以工作,但身份验证似乎失败了。 仔细检查令牌 url 配置和 keycloak 日志。应用程序在交换令牌代码时出现问题 - 应用程序可能无法到达令牌端点。 @JanGaraj 非常感谢您的洞察力,您的评论帮助我弄清楚发生了什么。 【参考方案1】:

经过多次试验结束错误,我终于弄清楚了问题所在。

原题中的重定向问题通过设置OVERWRITE_REDIRECT_URI解决:

OVERWRITE_REDIRECT_URI = "https://flask-app-hostname-gitpod/oidc_callback"

oidc_callback 请求仍然无法正常工作,但是我得到了这个:

oauth2client.client.FlowExchangeError:无效响应:401。

Jan Garaj's comment 让我意识到问题是令牌端点请求不起作用。

我已多次检查令牌端点 uri 并从以下位置复制值:

https://flask-app-hostname-gitpod/auth/realms/demo/.well-known/openid-configuration

但还是不行。

它不起作用的原因实际上与我的 Keycloak 配置无关,而是我的 keycloak 服务器在 Gitpod 中运行的方式。

Gitpod 将运行 keycloak 服务器的端口设置为private。因为 keycloak 服务器在私有端口上运行,所以对以下 url 的请求失败:

https://keycloak-hostname-gitpod/auth/realms/demo/protocol/openid-connect/token

在公开端口后它工作了。

如果你已经知道你想要暴露一个特定的端口,你可以在 .gitpod.yml 中配置它:

ports:
  - port: 5000
    onOpen: open-preview
  - port: 8080

https://www.gitpod.io/docs/config-ports

【讨论】:

以上是关于Keycloak Gitpod Flask OIDC:oauth2client.client.FlowExchangeError:无效响应:301的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?

尝试获取“openid_id”和“角色”字段时,带有 Keycloak 的 Flask OIDC 返回 None

一键开启云端 IDE,「Gitpod 」让你随时随地写代码

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

尝试从 gitpod IDE(ubuntu 服务器)连接到 MySql 数据库时出现套接字异常

使用 Keycloak 颁发“API 密钥”