文档目录
微博登录插件

简介

本技术文档面向 DouPHP 的“微博登录插件”开发。当前仓库中 plugin/weibo 目录为空,尚未提供微博 OAuth2.0 的具体实现。为便于后续快速落地,本文基于现有微信登录插件与统一 OAuth 接口契约,给出微博登录的完整设计方案、数据流、安全策略与开发示例路径指引。读者可据此在 plugin/weibo 下创建 Provider/Service,复用系统统一的第三方登录编排能力。

项目结构

  • 统一 OAuth 插件契约:位于 core/infra/plugin/contract/ConnectPluginProviderInterface.php,定义了第三方登录插件的统一入口 start/finish 等。
  • 参考实现(微信):位于 plugin/wxlogin,包含 WxloginProvider.php、WxloginService.php、manifest.php,展示了如何按 UA 选择不同 appid、发起授权、处理回跳、获取用户信息并对接 SnsLoginService。
  • API 端小程序微信登录:位于 api/controller/user/WeixinController.php,展示 code 换 session、绑定 user_sns、生成 token 的流程,可作为 PC 端 OAuth 流程之外的补充参考。
graph TB
A["前端/客户端"] --> B["插件路由 /plugin/{id}/start"]
B --> C["ConnectPluginProviderInterface<br/>start()"]
C --> D["具体 Provider<br/>如 WxloginProvider"]
D --> E["具体 Service<br/>如 WxloginService"]
E --> F["第三方平台OAuth<br/>微信/微博"]
F --> G["回调 /plugin/{id}/finish"]
G --> H["SnsLoginService<br/>统一登录编排"]
H --> I["用户会话/令牌"]

核心组件

  • ConnectPluginProviderInterface:定义第三方登录插件的统一契约,包括插件 ID、元信息、start(发起授权)、finish(处理回跳)。
  • WxloginProvider:微信登录插件的 Provider,负责将 start/finish 委托给服务层。
  • WxloginService:微信登录业务逻辑,包括按 UA 选择 appid、构造授权 URL、校验 state、换取 access_token/openid、拉取用户信息、组装 sns 数据并调用 SnsLoginService 完成登录编排。
  • manifest.php:声明插件归属 connect 分组及 Provider 类名。
  • WeixinController:API 端小程序微信登录控制器,用于对比理解 code 换 session、绑定 user_sns、发放 token 的流程。

架构总览

下图展示从前端触发到后端完成登录的端到端流程,以及微博登录应遵循的接入点。

sequenceDiagram
participant U as "用户"
participant FE as "前端页面"
participant PL as "插件路由"
participant PR as "微博Provider(待实现)"
participant PS as "微博Service(待实现)"
participant WB as "微博开放平台"
participant SL as "SnsLoginService"
participant US as "用户会话/令牌"
U->>FE : 点击“微博登录”
FE->>PL : 访问 /plugin/weibo/start
PL->>PR : 调用 start()
PR->>PS : 构建授权URL(state, scope, redirect_uri)
PS-->>FE : 返回跳转URL
FE->>WB : 打开微博授权页
WB-->>PL : 回调 /plugin/weibo/finish?code&state
PL->>PR : 调用 finish(payload)
PR->>PS : 校验state、换取access_token/openid、拉取用户信息
PS->>SL : resolve(sns, profile, loginIdMode, nobind)
SL-->>US : 建立会话/发放令牌
US-->>FE : 登录成功跳转

详细组件分析

统一 OAuth 插件契约(ConnectPluginProviderInterface)

  • 职责:定义所有第三方登录插件必须实现的接口,确保系统对 start/finish 的统一调度。
  • 关键点:
    • pluginId:插件唯一标识,用于路由与配置隔离。
    • meta:插件名称、描述、版本、分组、允许客户端类型、配置字段 schema。
    • start:返回授权页跳转 URL,需携带 state、scope、redirect_uri。
    • finish:接收第三方回调参数,完成鉴权与用户信息获取,最终交由 SnsLoginService 完成登录编排。

微信登录插件参考(WxloginProvider 与 WxloginService)

  • Provider:仅做委托,保持轻量;实际逻辑集中在 Service。
  • Service:
    • 按 UA 判断公众号或开放平台,选择对应 appid/appsecret。
    • 生成 state 并存入 Session,防止 CSRF。
    • 构造授权 URL(PC 扫码或公众号内授权),scope 使用平台标准范围。
    • 回调时校验 state,换取 access_token 与 openid,再拉取用户信息。
    • 根据配置决定以 openid 或 unionid 作为登录主键。
    • 清洗昵称等敏感字段,组装 sns 数据后调用 SnsLoginService.resolve。
flowchart TD
Start(["开始"]) --> UA["识别UA选择AppID/Secret"]
UA --> State["生成state并写入Session"]
State --> BuildUrl["拼接授权URL<br/>含state/scope/redirect_uri"]
BuildUrl --> Redirect["重定向至第三方授权页"]
Redirect --> Callback{"收到回调"}
Callback --> |校验state| Token["换取access_token/openid"]
Token --> UserInfo["拉取用户信息"]
UserInfo --> MapSNS["映射为sns数据结构"]
MapSNS --> Resolve["调用SnsLoginService.resolve"]
Resolve --> End(["结束"])

API 端小程序微信登录(WeixinController)

  • 作用:小程序侧通过 jscode2session 获取 openid/session_key,结合手机号解密等能力完成登录与绑定。
  • 要点:
    • 频率限制与错误审计。
    • 支持 unionid 模式与手机号绑定。
    • 自动建号与 user_sns 绑定,发放 API Token。

依赖关系分析

  • 微博插件(待实现)将依赖:
    • ConnectPluginProviderInterface:统一入口。
    • SnsLoginService:统一登录编排(账号匹配、新建、绑定、发放令牌)。
    • 配置中心:读取 plugin/weibo 的配置项(appkey、appsecret、回调地址、scope 等)。
    • HTTP 客户端:请求微博开放平台 API(access_token、用户信息等)。
graph LR
IF["ConnectPluginProviderInterface"] --> P["微博Provider(待实现)"]
P --> S["微博Service(待实现)"]
S --> SL["SnsLoginService"]
S --> CFG["插件配置"]
S --> HTTP["HTTP客户端"]
HTTP --> WB["微博开放平台API"]

性能考虑

  • 网络请求:
    • 对第三方 API 调用增加超时与重试上限,避免阻塞请求线程。
    • 缓存 access_token 与用户信息(注意过期时间),减少重复请求。
  • 并发与限流:
    • 对回调接口进行 IP 级速率限制,防止滥用。
  • 资源占用:
    • 头像等大图片建议异步下载与本地缓存,避免同步阻塞。
  • 数据库:
    • 批量写入 user_sns 与用户资料时尽量事务化,减少锁竞争。

故障排查指南

  • 常见错误定位:
    • state 校验失败:检查 Session 是否被清理或跨域丢失。
    • code 无效或过期:确认回调地址与授权页一致,且 code 一次性有效。
    • 无法获取 unionid:检查登录主键模式配置与平台返回。
    • 用户信息为空:检查权限范围 scope 是否包含必要字段。
  • 日志与审计:
    • 记录关键步骤(授权跳转、回调、token 交换、用户信息拉取)的成功/失败。
    • 对异常分支输出可读的错误码与提示,便于前端展示。

结论

当前仓库未提供微博登录插件的具体实现,但已具备完善的统一 OAuth 插件契约与微信登录参考实现。按照本文方案,可在 plugin/weibo 下快速创建 Provider/Service,复用 SnsLoginService 完成账号匹配、新建、绑定与令牌发放。实施时需重点关注 state 防重放、access_token 管理、权限范围控制、头像与隐私数据处理,以及合规性要求。

附录

微博开放平台接入清单(规划)

  • 应用创建:
    • 在“微博开放平台”创建网站应用,获取 App Key 与 App Secret。
    • 设置回调地址(Redirect URI),需与插件配置一致。
  • 权限范围(scope):
    • 基础:users/show(用户基本信息)、statuses/share(分享,可选)。
    • 扩展:依据业务需要申请粉丝数、关注列表等权限。
  • 前端集成:
    • 引入微博 JS SDK,初始化 client_id 与 redirect_uri。
    • 调用登录方法,跳转到微博授权页。
  • 后端处理:
    • 在 finish 回调中校验 state,用 code 换取 access_token。
    • 调用 users/show 获取用户基本信息(昵称、头像、UID)。
    • 根据配置以 uid 或 unionid 模式匹配/新建用户,写入 user_sns。
    • 通过 SnsLoginService 完成登录与会话/令牌发放。
  • 数据安全与合规:
    • 最小化采集原则:仅请求必要 scope。
    • 敏感信息脱敏:头像存储本地或 CDN,避免直链泄露。
    • 隐私设置:尊重用户公开范围,不可见字段默认隐藏。
    • 合规性:遵守微博平台协议与个人信息保护法规。
添加日期:2026-10-05