我正在尝试将 Flask 应用程序与使用两种端点装饰器的 Keycloak 公共连接:@oidc.require_login 和@oidc.accept_token
. 但是我遇到了以下问题。
对于 Keycloak 机密客户端,我可以访问 Flask 应用程序中的所有端点。这是我的应用程序配置:
flask_app.config.update({
'SECRET_KEY': 'no-body-knows',
'TESTING': True,
'DEBUG': True,
'OIDC_CLIENT_SECRETS': 'client_secrets.json',
'OIDC_OPENID_REALM': 'testrealm',
'OIDC_INTROSPECTION_AUTH_METHOD': 'client_secret_post',
'OIDC_SCOPES': ['openid', 'email', 'profile'],
'OIDC_COOKIE_SECURE':True,
'OIDC_CALLBACK_ROUTE':'/oidc_callback',
'OIDC_TOKEN_TYPE_HINT': 'access_token',
'OIDC_RESOURCE_SERVER_ONLY':False
})
以及我的(经过清理的)clients_secrets.json 的内容
{
"web": {
"client_id": "confidential-client",
"client_secret": "axxxxxxx-1xxx-5xxx-exxxx-2xxxxxxx",
"auth_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/auth",
"token_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/token",
"issuer": "https://my-keycloak-url.com/auth/realms/testrealm",
"userinfo_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/userinfo",
"token_introspection_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/token/introspect",
"redirect_uris": [
"http://localhost:5000/oidc_callback"
],
"bearer_only
": "true"
}
}
对于公共Keycloak 客户端,我将 client_secrets.json 修改如下(只需将 client_secret 设置为空字符串:
{
"web": {
"client_id": "public-client",
**"client_secret": "",**
"auth_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/auth",
"token_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/token",
"issuer": "https://my-keycloak-url.com/auth/realms/testrealm",
"userinfo_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/userinfo",
"token_introspection_uri": "https://my-keycloak-url.com/auth/realms/testrealm/protocol/openid-connect/token/introspect",
"redirect_uris": [
"http://localhost:5000/oidc_callback"
],
"bearer_only": "true"
}
}
但是,当我在公共 Keycloak 客户端下部署此 Flask 时,我仍然可以访问 @oidc.require_login 端点,但@oidc.accept_token
API 端点返回此错误:
{"error": "invalid_token", "error_description": "Token required but invalid"}.
使用 Keycloak 公共客户端是此 Flask 应用程序所在的微服务环境的要求。我不控制这个要求,其他微服务(用 Java、Angular 等编写)对这个 Keycloak 配置没有任何问题。
有没有办法使用装饰器使用带有flask-oidc端点的Keycloak公共客户端@oidc.accept_token
?在我看来,这是一个常见的 OIDC 场景。
我在 Python 3.8.6 上使用 Flask 1.0.2 flask-oidc 1.4.0 运行它