OAuth2.0

OAuth2.0

标准 OAuth2.0 授权码流程,支持 QQ / GitHub / Google 等第三方登录

插件 v1.1.0 贰先生 登录 社交 免费

xnx_oauth OAuth2.0 统一登录

功能

  • 标准 OAuth2.0 授权码流程,支持 QQ / GitHub / Google 等第三方登录(内置模板,可自定义 provider)

  • 多 provider 注册机制:后台 kv 配置 + 其他插件静态注册(OAuthService::registerProvider()

  • 完整授权流程:state 校验防 CSRF、PKCE(S256)支持、SSL 证书校验、原子写入头像

  • 登录或绑定四分支:已绑定直接登录、已登录则绑定、邮箱匹配自动合并、其他拒绝并引导注册

  • 个人中心绑定管理页 + 后台绑定记录列表(含筛选、分页、强制解绑)

  • 字段映射支持嵌套字段(如 a.b),适配各平台差异的 userinfo 响应

  • 头像下载到本地 upload/avatar/{dir}/{uid}.png(仅当用户无自定义头像时)

  • 多语言(zh-cn / zh-tw / en-us)

文件结构

plugin/xnx_oauth/
├── conf.json
├── install.php / uninstall.php
├── setting.php                      # 后台配置 + 绑定记录管理
├── icon.png
├── model/
│   └── OAuthService.php              # 核心服务(provider 注册、授权、绑定、头像下载)
├── route/
│   └── oauth.php                     # 前台路由:login / callback / bind-manage / unbind
├── admin/
│   └── view/htm/
│       ├── oauth_setting.htm         # 后台 provider 配置页
│       └── oauth_bindlist.htm         # 后台绑定记录列表
├── view/htm/
│   └── my_oauth.htm                  # 个人中心绑定管理页
└── hook/
    ├── model_inc_file.php            # 自动加载 OAuthService
    ├── model_route_table_end.php     # 注册 oauth 路由
    ├── index_route_case_end.php
    ├── admin_sidebar_end.htm         # 后台侧栏入口
    ├── my_sidebar_nav_security_before.htm  # 个人中心侧栏入口
    ├── user_login_submit_after.htm
    ├── user_create_submit_after.htm
    ├── lang_zh_cn_bbs.php
    ├── lang_zh_tw_bbs.php
    └── lang_en_us_bbs.php

配置流程

  1. 后台「插件管理」启用 xnx_oauth

  2. 进入「插件设置」→「配置」→ 开启「启用 OAuth 登录」

  3. 选择要接入的平台(QQ / GitHub / Google 或自定义),填写 AppID / AppSecret、授权 / Token / UserInfo 三个 URL、scope、字段映射

  4. 如需 PKCE(如 Google),勾选 enable_pkce

  5. 如需邮箱自动合并已有账号,开启 auto_merge_by_email

  6. 测试:退出登录 → 访问登录页 → 点击第三方登录 → 完成授权回调跳转个人中心;或在个人中心「安全设置」点击「OAuth 绑定管理」进行绑定 / 解绑

扩展说明

OAuthService 通过 hook/model_inc_file.php 自动加载,可被其他插件调用以注册自定义 provider。

Service 类与方法签名

// 静态注册 provider(推荐在其他插件的 model_inc_file.php 或 hook 中调用)
OAuthService::registerProvider(array $config): void
// $config 关键字段:name, display_name, icon, color,
//   authorize_url, token_url, userinfo_url, pre_userinfo_url(可选),
//   appid, appkey, scope, enable, enable_pkce, field_mapping, extra_params

// 读取 provider
OAuthService::getProviders(): array
OAuthService::getProvider(string $name): ?array
OAuthService::init(): void   // 合并 kv 配置与静态注册(同名后者覆盖并记录 xn_log 警告)

// 实例方法(通过 getInstance() 获取)
$svc = OAuthService::getInstance();
$svc->getAuthUrl(string $provider): array        // ['ok'=>bool, 'url'=>string, 'message'=>string]
$svc->handleCallback($provider, $code, $state): array  // 含 state 校验 + token 换取 + 用户信息映射 + 登录或绑定
$svc->loginOrBind($provider, $userInfo): array
$svc->bindAccount(int $uid, $provider, $userInfo): array
$svc->unbindAccount(int $uid, $provider): array  // 解绑前会校验是否有其他登录方式
$svc->getUserBinds(int $uid): array
$svc->hasOtherLoginMethod(int $uid, string $excludeProvider = ''): bool

触发时机与参数

  • registerProvider() 通常在其他插件的 model_inc_file.php hook 中调用,确保 OAuthService::init() 之前完成注册

  • 同名 provider 后注册覆盖先注册,会写 xn_log('...', 'oauth_error') 警告

  • handleCallback() 内部依次执行:state 校验 → PKCE 校验 → exchangeTokengetUserInfo(QQ 等会先调 pre_userinfo_url 取 openid)→ mapUserInfo(按 field_mapping 映射 openid/unionid/nickname/avatar/email/gender)→ loginOrBind

  • 数据表 xnx_oauth_bind 字段含 provider+openid 唯一索引、provider+unionid 普通索引,方便其他插件按 unionid 查询跨平台身份


截图 2
v1.1.0 2026-07-25
作者信息
贰先生
贰先生 贰先生
XIUNOX开发者
21
应用
289
安装
2026-06
加入
应用详情
应用分类 插件
版本 v1.1.0
适用版本 1.1
开发者 贰先生
下载量 9
浏览 53
更新时间 2026-07-28
发布时间 2026-07-25
最新回复 6
查看全部
  • 贰先生 管理 作者
    不想花时间在管理上,最好通过github提issue或者push代码
    2天前
    yaoys Lv2 回复@贰先生
    这样的话希望可以把签到等获取金币的方式放出来,另外,希望插件下载不要仅限于开发者和站长,,,,
    1天前
    贰先生 管理 作者 回复@yaoys
    我都想只限开发者,避免一些不懂技术的在还没有完全稳定的时候用了,然后到处喷你有问题就这么早放出来
    1天前
    yaoys Lv2 回复@贰先生
    😂好吧,我去搭个网站申请下站长
    1天前
  • yaoys Lv2
    论坛现在打不开了吗?好像没有首页了,全部是landing页面
    2天前
  • leostudio Lv3
    支持一下支持一下
    2天前
  • 参考下设计思路
    2天前
  • 欧琳 Lv2
    今天大放送啊,可是金币都没了😭
    3天前
  • AI Lv1

    贰先生您好,感谢分享 xnx_oauth 插件!从架构设计来看,OAuthService 的静态注册机制与后台 KV 配置的合并策略非常清晰(同名覆盖+日志警告),无论是插件开发者还是普通用户都能灵活扩展。尤其值得称赞的是:

    • PKCE(S256)支持state 校验,增强了 OAuth 流程的安全性;
    • 字段映射支持嵌套(如 a.b),适配不同平台的 userinfo 差异,这点很实用;
    • 邮箱自动合并多分支绑定逻辑,避免了用户账号冲突的常见痛点;
    • 头像原子写入SSL 证书校验,细节处理到位。

    一个小建议:后台绑定记录列表可考虑增加“是否已邮箱合并”标识,方便管理员排查绑定来源。另外,若其他插件通过 registerProvider() 注册时,建议文档注明 init() 的调用时机(如在 model_inc_file.php 末尾统一调用),避免顺序问题。

    期待更多优秀作品!【以上由 AI 自动回复,仅供参考】

    3天前
查看全部评论 / 发表评论
完整评论功能在讨论帖中,点击前往