3.1 KiB
3.1 KiB
Auth OAuth 插件 — 第三方授权登录示例(身份源插件)
基于 chongming-auth 共享契约实现身份源插件的参考实现:准入判断归插件,
平台凭证签发归 chongming_auth.issue_token(claims 契约与网关内置登录完全一致)。
第三方身份登录后拿到的 token 与内置登录完全等价——网关 JWT 验签、
user_info 随信封透传、admin API 判超管全部无缝生效。
提供的身份源
| 身份源 | 模式 | 端点 |
|---|---|---|
| GitHub | OAuth2 授权码(SPA JSON 流程) | GET /auth/oauth/github_authorize、POST /auth/oauth/github_callback |
| 手机号 | 一次性验证码(演示模式) | POST /auth/oauth/phone_send_code、POST /auth/oauth/phone_login |
身份源插件的标准形态(写新身份源时照此扩展)
- 准入:校验第三方凭据(OAuth code / OTP / LDAP 密码 / ...);
- 映射:在插件自有绑定表
identity_bindings(provider, provider_uid, user_id)中 find-or-create——老用户换身份源登录仍是同一账号体系; - 建号:无绑定时新建
users账号(密码为随机不可用值)+ 绑定记录, 与网关内置登录共用同一张 users 表(chongming_auth.open_database); - 签发:
chongming_auth.issue_token(user, secret, algorithm)。
扩展新身份源(LDAP / 企业微信 / 飞书 / OIDC ...)只需:加一个 provider 对接模块
- 一组 TOML 路由 + 一个
@rpc_method端点,调store.find_or_create_user即可。
配置
config/workers/auth_oauth/config.toml 的 [workers.config]:
return_otp_in_response = true # 演示模式:验证码随响应返回。生产必须 false 并接短信通道
[workers.config.github]
client_id / client_secret / redirect_uri / scope
安全说明(务必阅读)
- 本插件须以 inline 模式运行(默认):
issue_token需要[security]签名密钥, external 进程持有该密钥即能铸造超管 token。external 化前需平台提供内部签发 API 或按 issuer 分离密钥。 return_otp_in_response仅限本地演示,生产必须关闭并接真实短信通道。- OAuth state 与 OTP 验证码均存共享缓存(
chongming_cache),一次性消费、300s 过期。
踩坑记录(写插件必读)
插件必须提供 models/pydantic.py(gen_models 产物位置,手写等价物亦可)。
网关契约校验按 plugins.<type>.models.pydantic → src.plugins.... → workers....
顺序探测;缺失时 src.plugins. 兜底路径会以第二个模块名重新执行整个插件包
(父包导入链),插件内自定义 SQLModel 表会在全局元数据中重复定义,
网关启动即崩(Table 'xxx' is already defined for this MetaData instance)。
依赖
| 工具包 | 用途 |
|---|---|
chongming-auth |
Users 模型 / 建库 / 登录校验 / issue_token(共享契约) |
chongming-cache |
OAuth state 与 OTP 验证码存储 |
chongming-worker |
@rpc_method 装饰器 + Worker 运行时 |
httpx |
GitHub OAuth API 调用 |