Skip to main content

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_IDPASSPORTD_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

工作原理

  1. 插件通过 Flask-PluginKit 的 register() 入口加载,注册 Blueprint 和 before_first_request 钩子
  2. before_first_request 钩子在首次请求时延迟初始化 Authlib OAuth(延迟初始化是因为 register() 不在 Flask 应用上下文中)
  3. 用户访问 /login → 重定向到 OIDC Provider 授权页
  4. Provider 认证后回调 /authorized → Authlib 完成 token 交换 + userinfo 获取
  5. userinfo 默认写入 session["user"] = userinfo 或通过 g.set_login_state(userinfo) 设置登录状态
  6. 重定向到 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

flask_pluginkit_oidc-0.2.1.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flask_pluginkit_oidc-0.2.1-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

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

Hashes for flask_pluginkit_oidc-0.2.1.tar.gz
Algorithm Hash digest
SHA256 8c29077ac6f387e6f205ad02266649f6f4b4a73767306c7a5eae1458d32a1ff5
MD5 d9e85e4b26a568aa4d4ccb7e1e27a2ef
BLAKE2b-256 8b224325ddde5b6af150aeb68608dcccdedba7a20fd6f3663c617569c240d67d

See more details on using hashes here.

File details

Details for the file flask_pluginkit_oidc-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for flask_pluginkit_oidc-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 868e197900d2ec0b651c5570e27a2f891388297d41308e6f25df4d5fe24a46af
MD5 a3e24413bbad754e8003b0066b745b5b
BLAKE2b-256 9e865d76662656b19be56af43adaf54f9cfda918f17121f138533b89d22d1b1d

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

0.2.2

2 files

This release

0.2.1 This release

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page