Keycloak Gitpod Flask OIDC: oauth2client.client.FlowExchangeError: Invalid response: 301
Keycloak Gitpod Flask OIDC: oauth2client.client.FlowExchangeError: Invalid response: 301
我正在尝试实施 Flask-OIDC
and Keycloak
in a Flask app run inside a 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 &
基于
我可以从 Flask
应用程序中重定向到普通用户的 Keycloak
登录页面,但是当我使用现有用户登录时,我得到以下信息:
oauth2client.client.FlowExchangeError: Invalid response: 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
而不是 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 并设置 OVERWRITE_REDIRECT_URI
后,我不再收到 invalid response: 301
错误:
OVERWRITE_REDIRECT_URI = "https://flask-app-hostname-gitpod/oidc_callback"
现在我可以进入 keycloak 登录表单,但在登录时我现在得到:
oauth2client.client.FlowExchangeError: Invalid response: 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
网络检查员内部要求:
经过多次试验结束错误后,我终于弄清楚了问题所在。
原题中的重定向问题通过设置OVERWRITE_REDIRECT_URI
:
解决
OVERWRITE_REDIRECT_URI = "https://flask-app-hostname-gitpod/oidc_callback"
oidc_callback
请求仍然无法正常工作,但我得到了这个:
oauth2client.client.FlowExchangeError: Invalid response: 401.
让我意识到问题是令牌端点请求不起作用。
我已多次检查令牌端点 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
创建端口 public 后,它工作了。
if you already know that you want a particular port exposed, you can configure it in .gitpod.yml:
ports:
- port: 5000
onOpen: open-preview
- port: 8080
我正在尝试实施 Flask-OIDC
and Keycloak
in a Flask app run inside a 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 &
基于
我可以从 Flask
应用程序中重定向到普通用户的 Keycloak
登录页面,但是当我使用现有用户登录时,我得到以下信息:
oauth2client.client.FlowExchangeError: Invalid response: 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
而不是 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 OVERWRITE_REDIRECT_URI
后,我不再收到 invalid response: 301
错误:
OVERWRITE_REDIRECT_URI = "https://flask-app-hostname-gitpod/oidc_callback"
现在我可以进入 keycloak 登录表单,但在登录时我现在得到:
oauth2client.client.FlowExchangeError: Invalid response: 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
网络检查员内部要求:
经过多次试验结束错误后,我终于弄清楚了问题所在。
原题中的重定向问题通过设置OVERWRITE_REDIRECT_URI
:
OVERWRITE_REDIRECT_URI = "https://flask-app-hostname-gitpod/oidc_callback"
oidc_callback
请求仍然无法正常工作,但我得到了这个:
oauth2client.client.FlowExchangeError: Invalid response: 401.
我已多次检查令牌端点 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
创建端口 public 后,它工作了。
if you already know that you want a particular port exposed, you can configure it in .gitpod.yml:
ports:
- port: 5000
onOpen: open-preview
- port: 8080