Files
chongming-plugins/auth_oauth/__init__.py
T

66 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""auth_oauth 身份源插件 — 第三方授权登录示例(基于 chongming-auth 共享契约)。
演示 auth 域拆分后的身份源插件标准形态:
- 准入判断归插件(GitHub OAuth 授权码模式 / 手机验证码模式)
- 平台凭证签发归 chongming_auth.issue_token(claims 契约与内置登录完全一致)
- 账号落地到共享 users 表,第三方身份与账号的映射存插件自有绑定表
(identity_bindings,建在同一 auth 库,不改动 chongming-auth 拥有的 users schema)
演示模式说明:
- 手机验证码默认直接随响应返回 dev_code(无短信通道的本地演示用),
生产必须接真实短信通道并关闭 return_otp_in_response
- GitHub OAuth 需在 [workers.config.github] 配置 client_id/secret/redirect_uri
"""
import logging
from chongming_worker.plugin import Plugin
from .router import * # noqa: F401,F403 触发 @rpc_method 注册
# 模块加载时即注册 SQLModel 元数据(identity_bindings 表与 users 同库,
# 由 chongming_auth.open_database 的 create_all 一并创建)
from .models import IdentityBinding # noqa: F401
logger = logging.getLogger(__name__)
class AuthOAuthPlugin(Plugin):
"""AuthOAuth 插件 — 身份源示例,统一生命周期。"""
type = "auth_oauth"
# 不用基类建库:与网关内置登录共用同一 auth 库(chongming_auth.open_database
# 按 [workers.config] 的 data_dir / database 解析,指向 users + identity_bindings)
db_name = None
auto_bind = False # 请求/响应模型由端点函数的类型注解直接提供,无需 gen_models
async def on_init(self):
"""首次 create_workers 时调用一次:打开共享 auth 库 + 缓存。"""
from chongming_auth import open_database
from chongming_cache import Cache
from chongming_config import get_config
db = await open_database(self.config)
cache = Cache.from_config(get_config()["cache"])
# 写入全局变量供 router 使用(cleanup 时统一释放)
self.set_var("db", db)
self.set_var("cache", cache)
self.set_var("plugin_config", dict(self.config or {}))
logger.info("[auth_oauth] 初始化完成(共享 auth 库 + 缓存就绪)")
async def on_cleanup(self):
"""cleanup 时调用:释放自有资源(基类不再托管本插件的数据库)。"""
db = self.get_var("db")
cache = self.get_var("cache")
if db is not None:
await db.dispose()
if cache is not None:
cache.close()
logger.info("[auth_oauth] 清理完成")
# 暴露给 app lifespan 的模块级入口(bound method,签名与旧写法完全一致)
plugin = AuthOAuthPlugin()
create_workers = plugin.create_workers
cleanup = plugin.cleanup