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