首页 > 解决方案 > 无法将 flask-oidc 与 Keycloak 公共客户端一起用于 API 调用

问题描述

我正在尝试将 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_tokenAPI 端点返回此错误:

{"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 运行它

标签: pythonflaskkeycloakflask-oidc

解决方案


推荐阅读