使用 Keycloak OIDC 编写简单的 Flask 页面

问题描述 投票:0回答:1

我很难找到我需要的简洁示例。

我在 https://auth.mycompany.com 有一个可用的 Keycloak 服务器。 (当然不是真实的公司名称) 我在 http://testapp.mycompany.com.

有一个 Flask 服务器

我需要做的就是有一个简单的页面,其中包含连接到我的 Keycloak 服务器的登录流程。事实证明,所有的 Keycloak 扩展都被放弃并且记录很少。有flask_oidc、pyoidc等。但是,我在网上能找到的文档确实不太好。我浏览了很多 github 存储库,并努力浏览了很多重口音的 YouTube 视频,但还没有找到一个简单而简洁地实现 OIDC 登录流程的 Flask(Django 也可以接受)应用程序的示例。我什至尝试过 ChatGPT,它给了我几个例子,但没有一个起作用。我了解 OAuth2.0 和 OIDC 标准,并阅读了它们的源文档,但我完全没能找到这些东西的样板实现来开始我的键盘实践工作。

有人可以向我展示一个非常基本的 Flask 或 Django 应用程序的最小示例吗?它可以连接到我的 Keycloak 服务器。我很乐意继续自己研究以建立它,但我似乎无法开始。

我尝试用谷歌搜索,直到达到疯狂的边缘。我已经尝试了许多存储库,但实际上不起作用。 ChatGPT 告诉我虚构的事情。

flask keycloak openid-connect
1个回答
0
投票

结构文件夹位于此处。在您的 keycloak 服务器中,您必须创建一个客户端连接才能拥有

client_id
client_secret_key

在服务器/常量/KeyCloakConstants.py中

KEYCLOAK_SERVER_URL = os.getenv(
    "KEYCLOAK_SERVER_URL", "http://keycloak/auth/"
)
KEYCLOAK_REALM_NAME = os.getenv("KEYCLOAK_REALM_NAME", "user-dev")
# client
KEYCLOAK_CLIENT_ID = os.getenv("KEYCLOAK_CLIENT_ID", "client-service")
KEYCLOAK_CLIENT_SECRET_KEY = os.getenv(
    "KEYCLOAK_CLIENT_SECRET_KEY", "jGlenvHtelkBtSS6zsi72prZQeoAmPxy"
)

在服务器/扩展.py中

from server.constants import KeyCloakConstants as kcl
from keycloak import KeycloakOpenID

keycloak_client = KeycloakOpenID(
    server_url=kcl.KEYCLOAK_SERVER_URL,
    realm_name=kcl.KEYCLOAK_REALM_NAME,
    client_id=kcl.KEYCLOAK_CLIENT_ID,
    client_secret_key=kcl.KEYCLOAK_CLIENT_SECRET_KEY,
)

在服务器/服务/KeycloakService.py中

from server.extensions import keycloak_client

class KeycloakClientService:
    @classmethod
    def login_user(cls, data):
        token = keycloak_client.token(
            username=data.get("username"),
            password=data.get("password"),
        )
        return token

在服务器/控制器/AuthController.py中

from flask import jsonify
from server.services.KeycloakService import KeycloakClientService

auth_api = Blueprint("auth_api", __name__)

@auth_api.route("/login", methods=["POST"])
def login_user():
    """
    `param`
        :body:
            username: String
            password: String
    `return`
        :body: access_token, expires_in, token_type
    """
    data = request.json
    token = KeycloakClientService.login_user(credentials)
    return jsonify(output)

这里只是在烧瓶中使用keycloak的示例。在您的服务器中,您需要更多来处理所有情况,例如来自 keycloak 的错误请求、不正确的用户

© www.soinside.com 2019 - 2024. All rights reserved.