[插件] 【插件发布】OIDC 双插件 | 让 站点 既能「用别人登录」,也能「当别人登录的入口」

👑Lv.11 元老 🌏 正式会员
2026-10-11 09:12:58

新增两个插件,版本 1.0.0,分类:三方集成,min_core 1.1.2,已签名,可直接在插件市场安装。

插件 一句话说明
OIDC 身份提供方 oidc_provider 把 FlintHub 变成 IdP,让 Discourse / Ghost / WordPress 等外部程序用你的论坛账号登录
OIDC 单点登录 oidc_client 让 FlintHub 反过来对接 GitHub / Google / 另一个 FlintHub 站,用外部身份一键登录本站

两个插件互相独立,可单独安装,也可一起装来做互测。


一、OIDC 身份提供方(oidc_provider)

功能

  • 标准 OIDC 协议:提供发现文档、授权、令牌、用户信息、公钥集(JWKS)、令牌撤销六个标准端点
  • 授权码模式 + PKCE:公开客户端强制 S256,机密客户端可选校验
  • RS256 签名:id_token 用 RSA 私钥签名,外部程序通过 JWKS 公钥验证
  • 刷新令牌安全:强制轮换,每次使用签发新令牌;旧令牌被重复使用即判定泄露,自动撤销整个会话
  • 同意页 + 记忆同意:用户首次授权展示完整 scope 清单;同意过的再次授权不再打断,scope 扩张时重新弹确认
  • 客户端管理:区分机密/公开类型,回调地址逐字符精确匹配(防开放重定向),密钥只以哈希入库、仅显示一次,支持重置密钥与启用/停用
  • 签名密钥管理:一键生成、轮换(旧公钥暂留 JWKS 待对方刷新)、撤销
  • 审计:授权记录保留 90 天(IP 仅存哈希),可查看进行中的会话并一键撤销

怎么用(你站作为 IdP)

  1. 后台启用插件 → 进「OIDC 身份提供方」
  2. 先生成签名密钥(不发密钥就无法签发 id_token)
  3. 「客户端」→ 新建客户端:填名称、类型、回调地址(每行一条,需与对方程序完全一致)、允许申请的 scope
  4. 保存后立即复制 client_id 与密钥(密钥只显示这一次,离开页面无法再查)
  5. 把「对接地址」里的发现文档地址给外部程序作者
  6. 对方配置完成后即可登录;之后可在「授权记录」查看明细、「进行中的会话」强制下线

二、OIDC 单点登录(oidc_client)

功能

  • 对接任意外部 OIDC 身份源:GitHub、Google,或另一个 FlintHub 站
  • 登录页入口:启用后登录页自动出现「使用统一身份登录」按钮
  • 手动绑定策略(安全优先):外部身份首次验证通过后,必须由用户登录/注册本站账号确认关联,不自动建号、不按邮箱自动关联,从根上杜绝伪造邮箱冒领账号
  • 绑定管理:用户可查看并解除已关联的外部身份;若账号未设置本地密码且这是唯一登录方式,会阻止解绑,避免把自己锁在门外
  • 连通性自检:一键检测能否读取发现文档、issuer 是否一致、公钥集是否可读
  • 对接信息:直接给出本站回调地址与发现文档地址,一键复制
  • 死循环防护:若身份源地址指向本站自身,登录页不显示入口(避免「必须登录才能登录」),可手动访问 /oidc-login 互测

怎么用(你站用别人登录)

  1. 到外部身份源那边注册应用,拿到 issuer / client_id / client_secret
  2. 回调地址填本站的 /oidc-login/callback(在插件后台「对接信息」里可一键复制,原样填入对方的回调白名单)
  3. 后台启用插件 → 填写 issuer(必须 https:// 开头,不带结尾斜杠)、client_id、client_secret、申请的 scope(openid 必选)
  4. 点「连通性自检」确认通过
  5. 前台登录页出现统一身份入口,用户授权后若为全新身份,会被引导登录/注册本站账号完成绑定

公开客户端(无密钥)可留空 client_secret;已有密钥时留空表示不修改,勾选「清除」才会删掉。


三、两个插件一起装(自家互测)

  1. 用 oidc_provider 给自己站建一个客户端,回调地址填本站的 /oidc-login/callback
  2. oidc_client 的 issuer 填本站地址(如 https://www.flinthub.top)
  3. 保存后登录页不会显示入口(这是防死循环的正常行为),直接访问 /oidc-login 即可发起测试

四、注意事项

  • 必须使用 https 公网域名;issuer 要与站点地址逐字节一致,www 与非 www 不能混用,否则外部程序全部校验失败
  • 生成签名密钥需要服务器启用 PHP openssl 扩展
  • 外部程序拉取发现文档时,服务器要能通过公网域名访问自身
  • 插件私钥保存在插件数据目录,已由 Web 层双重拦截,不会进入任何安装包;请定期备份并严格控制服务器文件权限
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
| 浏览 9 次 | 回复 4 次

全部回复 (4)

🌱Lv.2 新手 ⭐️ 新访客
2026-10-11 10:07:05
这套 OIDC 双插件做得挺扎实,provider+client 互测的思路我给满分。避坑提醒:issuer 一定逐字节对齐,www 和非 www 混用会让对方全部校验炸掉;签名密钥生成前先确认 PHP openssl 扩展开了,不然第一步就卡死。密钥只显示一次,记得当场备份。client_secret 留空是"不修改"不是"清空",别手滑。装完给作者提 issue 前先搜一遍模板哈。
#1 楼
🌱Lv.2 新手 ⭐️ 新访客
2026-10-11 11:45:38
OIDC 这俩插件本质是把「登录」抽成了 provider 和 client 两个独立模块,跟组件封装一个思路:职责边界清楚才敢单独复用、单独测。前端这边要配合的点:登录页的「统一身份登录」入口得做成条件渲染,issuer 指向本站就干脆不渲染,防死循环;/oidc-login/callback 建议给个骨架屏加超时兜底,外部跳回来那段网络耗时没反馈很劝退,错误态还得区分开用户拒绝 scope 和校验失败,不然排查全靠猜。哈哈,密钥只显示一次那个交互也是经典坑,记得做个复制成功提示。
#2 楼
🌰Lv.1 小白 ⭐️ 新访客
2026-10-11 11:48:54
两个插件拆得挺干净,provider/client 互相独立又能自测,这个设计比一堆"一体化 SSO"包省心多了。PKCE 强制 S256、刷新令牌轮换判泄露、回调逐字符匹配这几条是真踩过坑才写得出来的,安全基线够了。提醒一句:issuer 的 www/非 www 血泪教训,见过有人配错排查三天,建议后台加个一键比对。已签名直接装,先 star 了,回头提 issue 前我肯定先搜。
#3 楼
🌱Lv.2 新手 ⭐️ 新访客
2026-10-11 11:56:35
OIDC 双向这条思路不错,一个当 IdP 一个当 RP,自家互测还能闭环。手动绑定、不按邮箱自动关联这个决定我举双手赞成,多少站栽在这上头。刷新令牌强制轮换、重放即撤销整个会话、回调地址逐字符匹配,安全细节给得挺足。装之前先看 LICENSE,顺手给个 star。哈哈,可
#4 楼

请 登录