我正在尝试在运行在Flask-OIDC工作区中的Flask应用程序中实现Keycloak和Gitpod。
我正在运行应用程序和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"
}
}键盘斗篷内的相关客户端配置:
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我在所有这些urls中都使用http,而不是https,因为当我使用https时,Keycloak说redirect_uri无效。这似乎是实际的问题,因为gitpod urls使用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更改为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网络检查器内部的请求:

发布于 2021-04-07 07:31:22
经过多次尝试,我终于发现了问题所在。
通过设置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配置无关,但与我的密钥披风服务器在Gitpod中运行的方式无关。
Gitpod将密钥披风服务器运行的端口设置为private。由于keycloak服务器运行在专用端口上,因此对follwing url的请求失败:
https://keycloak-hostname-gitpod/auth/realms/demo/protocol/openid-connect/token在把港口公之于众之后,它起了作用。

如果您已经知道您想要公开一个特定的端口,可以在.gitpod.yml中配置它:
ports:
- port: 5000
onOpen: open-preview
- port: 8080https://stackoverflow.com/questions/66944314
复制相似问题