0

我正在尝试实现Flask-OIDCKeycloakGitpod工作区中运行的 Flask 应用程序中。

我正在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 & 

基于这篇文章

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

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

http在所有这些 url 中使用而不是https,因为当我使用时https Keycloakredirect_uri是无效的。这似乎是这里的实际问题,因为 gitpod url 使用https,但我不知道如何处理这个问题。我已经尝试了一些像这里描述的解决方案,但无法让它们工作。

相关部分路由:

@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" />

更新

按照Jan Garaj 的建议将 http url 更改为 https并设置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

网络检查器内部的请求: 请求网络

4

1 回答 1

1

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

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

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

但是该oidc_callback请求仍然无效,我得到了这个:

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

Jan Garaj 的评论让我意识到问题是令牌端点请求不起作用。

我多次检查了令牌端点 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

于 2021-04-07T07:31:22.403 回答