我正在尝试实现Flask-OIDC
并Keycloak
在Gitpod
工作区中运行的 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
Keycloak
说redirect_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