本文将详细解释如何在 Python Flask 网站中对接身份认证服务,仅通过 Keycloak 举这个例子,但同样的方法可以应用于任何身份认证服务,比如 authing.cn 等。

长话短说

在 Flask 网站里,增加 Flask-OIDC 引用,新增几行配置即可。目前通过实际测试,需要使用 python 3.10。我测试了 Windows 11 上的 python 3.8,以及 python 3.12.2,还有 mac osx 上的 python 3.9.12,启动时都会报如下错误: shell from .errors import raise_http_exception File C:Python38libsite-packagesauthlibintegrationsflask_oauth2errors.py, line 6, in _version = importlib.metadata.version(werkzeug).split(.)[0] AttributeError: module importlib has no attribute metadata

在线演示

可以通过 https://face-swap-itor.onrender.com/form 这个链接查看效果。
直接打开 https://face-swap-itor.onrender.com 的话会看到一个 Hello World,这是一个公开页面。
点击https://face-swap-itor.onrender.com/form链接后会跳转到我部署的 Keycloak 实例,要求登录。
image.png
登录完成后,就会跳转回原始链接,并展示一个表单让用户输入信息:
image.png
这就表明成功地使用 Keycloak 对 Python Flask 的指定页面进行了登录保护。下面是实现的详细步骤。

短话长说

免费架构去哪儿了?

很多年前,我部署了一个 Python Flask 网站,曾经部署到了 Okteto,但是后来 Okteto 不免费了,我于是将它部署到了 render,就是上面的链接。由于该应用已经容器化,所以迁移过程相当丝滑,直接将 docker image 地址填入 render 控制面板即可:
image.png

代码改动

全部代码改动并不多,详细代码见: https://github.com/JeffTrain/face-swap/blob/master/hello.py
主要增加的是:

python from flask_oidc import OpenIDConnect

app = Flask(name) app.config.update({ SECRET_KEY: TODOYouCanSetItInEnv, OIDC_CLIENT_SECRETS: client_secrets.json, })

oidc = OpenIDConnect(app)

其中需要一个 client_secrets.json 文件,内容如下:
image.png
可见我们需要在 Keycloak 里创建一个 id 为 flask-app 的客户端,后面会专门讲解该客户端的创建步骤。
对于需要保护的路由,需要增加一个注解,如下所示:

python @app.route(/form, methods=[GET, POST]) @oidc.require_login def form(): if request.method == POST: return Hello, + request.form[name] else: return

Keycloak 中配置客户端

第一个步骤就是为客户端起个名字,如下图所示:
image.png
最重要的配置是有效的重定向 URL,这里可以配置多个,方便实际调用和本地调试:
image.png
客户端的能力配置上,启用标准流程即可:
image.png
配置完成后,记得拷贝客户端秘钥,并放在前面提到的 client_screts.json 文件之中:
image.png
这样就完成了在 Python Flask 应用中对接 Keycloak,实现了对具体页面的登录保护。