flask-pluginkit-oidc
基于 Authlib 的 OIDC Client,作为 Flask-PluginKit 插件使用,对接 staugur/passportd OIDC Provider。
依赖
- Python >= 3.9
- flask-pluginkit >= 3.8.0
- authlib >= 1.7.0
快速开始
1. 安装
pip install .
# 或从 Git 安装
pip install git+https://github.com/saintic/flask-pluginkit-oidc@master
2. 配置
通过环境变量或 app.config 设置以下配置:
| 配置项 | 环境变量 | 必填 | 说明 |
|---|---|---|---|
PASSPORTD_OIDC_CLIENT_ID |
PASSPORTD_OIDC_CLIENT_ID |
是 | OIDC Provider 分配的 client_id |
PASSPORTD_OIDC_CLIENT_SECRET |
PASSPORTD_OIDC_CLIENT_SECRET |
是 | OIDC Provider 分配的 client_secret |
PASSPORTD_OIDC_SERVER_METADATA_URL |
PASSPORTD_OIDC_SERVER_METADATA_URL |
否 | OIDC Discovery 端点,默认 https://passport.saintic.com/.well-known/openid-configuration |
PASSPORTD_OIDC_CLIENT_KWARGS |
— | 否 | 传递给 OAuth client 的额外参数,默认 {"scope": "openid profile"} |
PASSPORTD_OIDC_STATE |
PASSPORTD_OIDC_STATE |
否 | 插件启用状态,默认是enabled,禁用是disabled |
Authlib 约定:
oauth.register(name="passportd_oidc")会自动从app.config查找PASSPORTD_OIDC_CLIENT_ID和PASSPORTD_OIDC_CLIENT_SECRET,无需手动传入。
3. 使用
from os import getenv
from flask import Flask, session, g, make_response, redirect
from flask_pluginkit import PluginManager
app = Flask(__name__)
app.secret_key = getenv("SECRET_KEY", "change-me")
app.config.update(
PASSPORTD_OIDC_CLIENT_ID=getenv("PASSPORTD_OIDC_CLIENT_ID", ""),
PASSPORTD_OIDC_CLIENT_SECRET=getenv("PASSPORTD_OIDC_CLIENT_SECRET", ""),
)
plugin = PluginManager(app, plugin_packages=["flask_pluginkit_oidc"])
def set_login_state(userinfo:dict):
# 假设用session管理会话
session["user"] = userinfo
return make_response(redirect("/"))
@app.before_request
def before_request():
# 强烈建议, 设置登录状态,如果返回 Flask.Response 对象, 插件会直接 return 对象。
g.set_login_state = set_login_state
# 可选,登录后跳转地址
g.login_redirect_url = "/"
if __name__ == "__main__":
app.run(debug=True)
4. 测试
export PASSPORTD_OIDC_CLIENT_ID=your_client_id
export PASSPORTD_OIDC_CLIENT_SECRET=your_client_secret
python test_client.py
访问 http://localhost:5000/oauth2/passportd/login 发起 OIDC 登录。
5. userinfo
{
"bio": "签名",
"gender": 1,
"location": "地点",
"nickname": "昵称",
"picture": "头像地址",
"status": 1,
"sub": "用户唯一标识"
}
路由
| 路由 | 说明 |
|---|---|
/oauth2/passportd/login |
发起 OIDC 授权,重定向至 Provider 登录页 |
/oauth2/passportd/authorized |
OIDC 回调地址,Provider 需配置为此 URL |
工作原理
- 插件通过 Flask-PluginKit 的
register()入口加载,注册 Blueprint 和before_first_request钩子 before_first_request钩子在首次请求时延迟初始化 Authlib OAuth(延迟初始化是因为register()不在 Flask 应用上下文中)- 用户访问
/login→ 重定向到 OIDC Provider 授权页 - Provider 认证后回调
/authorized→ Authlib 完成 token 交换 + userinfo 获取 - userinfo 默认写入
session["user"] = userinfo或通过g.set_login_state(userinfo)设置登录状态 - 重定向到
g.login_redirect_url或/
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flask_pluginkit_oidc-0.2.1.tar.gz.
File metadata
- Download URL: flask_pluginkit_oidc-0.2.1.tar.gz
- Upload date:
- Size: 5.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c29077ac6f387e6f205ad02266649f6f4b4a73767306c7a5eae1458d32a1ff5
|
|
| MD5 |
d9e85e4b26a568aa4d4ccb7e1e27a2ef
|
|
| BLAKE2b-256 |
8b224325ddde5b6af150aeb68608dcccdedba7a20fd6f3663c617569c240d67d
|
File details
Details for the file flask_pluginkit_oidc-0.2.1-py3-none-any.whl.
File metadata
- Download URL: flask_pluginkit_oidc-0.2.1-py3-none-any.whl
- Upload date:
- Size: 6.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
868e197900d2ec0b651c5570e27a2f891388297d41308e6f25df4d5fe24a46af
|
|
| MD5 |
a3e24413bbad754e8003b0066b745b5b
|
|
| BLAKE2b-256 |
9e865d76662656b19be56af43adaf54f9cfda918f17121f138533b89d22d1b1d
|