OAuth2 登录与群 Webhook 开放接入

海狸IM 功能深度解析(下):OAuth2 登录与群 Webhook 开放接入


写在前面:开放能力不是「一个大平台」

很多人第一次看海狸的六个工程,会把 beaver-open 理解成「万能开放平台」——既能第三方登录,又能配 IM 事件回调,还能 @ 机器人问答。

2.0 的实际边界要克制得多。 按当前代码与门户功能,落地的是两条 独立 的线:

能力2.0 状态配置入口
OAuth2 第三方登录beaver-open + beaver-oauth
群通知单向推送(Webhook)PC 群助手
门户配置 IM 事件 Webhook
群内 @ 机器人自动回复2.1 智能机器人

OAuth 管 身份(谁登录了 OA);Webhook 管 通知(CI 往群里推一条消息)。协议不同、入口不同、部署时可 只开其中一个。下面分开讲透。


1. 两条线一张表:先别混

维度OAuth2群推送机器人
解决什么问题第三方 Web/App 用海狸账号登录外部系统 往指定群发消息
谁发起用户点「海狸登录」服务器脚本 / 监控系统 POST
用户是否参与是(授权确认、扫码)否(单向推送)
涉及工程open、oauth、server(open/auth)desktop(配置)、server(bot_public)
协议Authorization Code / TokenHTTP POST + Token
数据方向用户 → 授权 → 第三方拿 Token系统 → 群会话
与 avatar/fileUrl 的关系用户信息接口返回 可直接展示的 avatar URL消息体里媒体字段是 完整 url

部署、排错、写接入文档时,请把这两张表分开维护。45 号文里也有同样的对照,本篇从 功能解析 + 开发反思 角度再展开一层。


2. OAuth2:让 OA、门户、自研 Web 认海狸账号

2.1 三个工程各干什么

工程谁打开干什么
beaver-open开发者 / 运维创建 OAuth2 应用,拿 AppId、AppSecret,配 redirect_uri、Scope,Secret 轮换、Token 吊销
beaver-oauth终端用户授权确认 UI:展示应用名、权限范围;支持扫码、H5
beaver-server(open_api / auth_api)后端签发 Code、换 Token、用户信息、扫码状态流转

门户和授权页 分仓库部署,职责清晰:开发者 never 和用户授权页搅在一起。

beaver-manager 还有一层 OAuth 应用审核——运营通过/拒绝开发者提交的应用,适合内网「先审后接」的场景。manager 管运营,open 管开发者自助,别和 56 号要写的运营专题混为一谈,这里只点一句。

2.2 标准 Authorization Code 流程

从用户点按钮到 OA 建立会话,逻辑顺序如下:

① 用户在 OA 点击「海狸账号登录」
② 浏览器跳转 beaver-oauth 授权页(或展示二维码)
③ 用户在海狸 App 扫码 / 在页面上确认授权
④ 浏览器回调 OA 的 redirect_uri,URL 带 authorization_code
⑤ OA 后端用 code + AppSecret 向 beaver-server 换 access_token
⑥ OA 后端带 token 调用户信息接口,拿到 userId、nickName、avatar…
⑦ OA 建立自己的 session,用户登录完成

和 50 号文的 avatar URL 在这里接上:第 ⑥ 步返回的 avatar 必须是 https 完整地址。OA 前端通常直接:

<img src="{{ user.avatar }}" />

若只返回 fileKey,OA 还要对接 file 预览接口、处理 Beaver 登录态——每家接入方写一遍,文档和维护成本都爆炸。这是我坚持资料层存 URL 的核心原因之一。

2.3 Scope:限制第三方能读什么

创建 OAuth 应用时可配 Scope,限制第三方 Token 能读取的用户信息字段(昵称、头像、邮箱等)。这是私有化 IdP 的基本功:最小权限,避免一个内部小工具拿到过多用户数据。

Secret 轮换、Token 吊销在 open 门户完成;具体字段以 open_api 定义和文档站为准。

2.4 2.0 支持的授权方式

方式典型场景
扫码登录PC / Web 展示二维码,海狸 App 扫
OAuth2 Authorization Code有后端的 Web 应用标准接入
H5 授权码移动浏览器
OAuth Code 登录2.0.1 服务端补充,可与 PC 登录联动

Web 侧还可参考 beaver-sdk(JS SDK),减少自己拼授权 URL 的错误。

2.5 常见接入场景

  • 内网 OA、CRM、工单 统一「海狸账号登录」
  • 自研 Web 把海狸 IM 当 身份提供方(IdP)
  • 私有化部署、数据不出域,但希望 账号体系统一

2.0 不做的: open 门户 不能 配置 IM 消息事件订阅;不能 在门户里创建群 Webhook——那是下一节。


3. 群 Webhook:外部系统往群里发消息

3.1 功能定义

2.0 的机器人类型是 通知机器人(群助手 →「自定义机器人」模板):

  • 群主 / 管理员在 PC 端 创建,设置名称、头像、描述
  • 创建成功后得到带 Token 的 Webhook 推送 URL
  • 外部系统 POST 该地址 → 群内出现一条 Bot 用户 发出的消息
  • PC / Flutter 群成员 收消息路径与普通人无异(WS + sync)

群聊详情与群助手

配置入口只在 beaver-desktop 群助手,不在 beaver-open。Flutter 2.0 能收 Bot 消息,不能在 App 里创建 Webhook。

3.2 PC 端配置步骤(操作向)

  1. beaver-desktop 2.0 进入目标群
  2. 群详情 → 群助手 → 添加群助手
  3. 类型选「通知机器人」,模板选「自定义机器人」
  4. 填写展示名称、头像(可以是任意 https 图片 URL)
  5. 保存后 复制 Webhook URL(含 token 参数)
  6. 用 curl 或 Jenkins 发测试 POST,确认群内可见

启用 / 禁用、密钥重置、从群内移除,都在群助手界面完成。

3.3 服务端接口与消息类型

公开接口定义在 app/open/open_api/api/bot_public.api

POST /api/open/bot_public/v1/send

Query 带 token(Webhook Token);可选 timestamp + sign 做 HMAC 签名校验。Body 里 msgtype 决定消息形态,2.0 支持例如:

msgtype用途媒体字段特点
text纯文本可带 @ 信息
markdown标题 + 正文image 字段为 配图 URL
image图片消息url图片完整 URL
video视频urlthumbnailUrl
file文件url
voice / audioFile语音 / 音频url
link链接卡片urlimageUrl
见 api 定义均为 URL 或文本

响应示例字段:messageIdsendTime——方便调用方做对账。

注意看表: 几乎每种富媒体都是 url,不是 fileKey。这和 50 号里消息体 fileUrl、UserModel avatar 的设计 是同一条线——Webhook 集成方手里只有外链,不会先 upload。

3.4 一条 Webhook 消息进群后的链路

外部系统 POST bot_public/v1/send
    → Gateway 放行 bot_public 路由
    → logic 校验 Token(+ 可选签名校验)
    → 写入群会话(Bot 作为 sender)
    → 与普通群消息相同:落库 → MQ → WS 推在线成员
    → 离线成员:datasync + chatSync 补消息

Bot 在 user 表里 userType=2(推送机器人),和 OAuth 无配置依赖。只想要 CI 通知、不要 OAuth 的场景,部署 server + desktop 即可。

技术细节(MQ、tableUpdates)见 46 / 47 号文;本篇只强调:Webhook 消息和用户消息走同一套聊天管道,所以群里看起来就是「多了一个机器人账号在说话」。

3.5 适用场景示例

场景说明
运维告警Prometheus / Zabbix 触发后 POST,值班群收到告警
发布通知Jenkins / GitLab CI 推送构建结果、版本号
定时报告Cron 脚本推日报、周报摘要
流程通知审批系统结束后推结果到业务群

不适合: 用户在群里 @ 机器人提问、机器人读群消息自动回复、在 open 门户订阅「任意群消息回调」——这些 2.0 没有,2.1 规划智能机器人。

3.6 2.0 与 2.1 边界

能力2.02.1 规划
单向 Webhook 通知
群内 @ Robot 对话智能机器人
open 门户统一配 Webhook可能收敛入口
IM 事件订阅回调业务服

2.0 的 Bot 是 通知型,不是 ChatGPT 式问答;别在 2.0 里找交互式 Robot。


4. 开发反思:开放接入如何反过来塑造数据模型

做 IM 核心时,我默认观众是 自研 PC + Flutter 客户端——upload 接口、preview 路由、本地缓存,闭环在自己手里。

一旦 2.0 承诺 OAuthWebhook,观众变成了 未知的第三方

  1. OAuth 集成方 只会标准 OAuth2,不会为你单独写 fileKey 解析器。
  2. Webhook 集成方 只有 Jenkins 插件、Shell curl、监控 Webhook 表单,字段里填 URL 最自然。
  3. Bot 头像 创建时就可能是外部 CDN 地址,不会走 upload。

所以「库里存 fileKey、展示再换 URL」在 纯客户端时代 说得通;开放时代 会在三个入口同时撞墙。最终选择:

  • 协议层(用户 avatar、消息 fileUrl、Webhook body)统一 完整 URL,互操作优先
  • 存储层 file 服务仍保留 fileKey,自有上传走 upload → 拿 fileUrl 填入消息
  • 安全层 若要加强,在 preview 网关做签名 / 时效,而不是改协议逼 Jenkins 改代码

这不是偷懒,是 IM 从「封闭客户端」走向「可集成」时的常见代价。以后 2.1 上 @ Robot、流式 AI,还会再碰「Bot 消息从哪来、媒体怎么存」——那是新一篇的故事。


5. 部署与验证清单

5.1 OAuth2 最小验证

  • beaver-server 已部署,open、auth 相关服务可用
  • beaver-open、beaver-oauth 前端可访问
  • 门户创建测试应用,redirect_uri 与测试 OA 一致
  • 走通扫码或 Code 流程,Token 能换用户信息
  • 确认返回的 avatar 为可访问 URL

5.2 群 Webhook 最小验证

  • beaver-desktop 2.0,操作账号为群主或管理员
  • 目标群创建通知机器人,复制 Webhook URL
  • curl POST text 类型测试消息
  • PC / Flutter 群成员均能看到
  • 无需 在 beaver-open 额外配置

5.3 常见问题

Q:门户里找不到 IM 事件 Webhook?
2.0 没有。群通知只通过 PC 群助手创建的 URL。

Q:OAuth 和 Webhook 必须一起部署吗?
否。只做登录 → open + oauth;只做群通知 → server + desktop 配机器人。

Q:beaver-open 和 beaver-manager 区别?
open 给 接入 OAuth 的开发者;manager 给 运营管理员(用户、审核、监控)。角色不同。

Q:移动端能创建机器人吗?
2.0 创建入口主要在 PC 群助手。


6. 「只私有化」意味着什么

海狸 不做官方公共 SaaS。开放能力全部连 你自己部署的 server

  • open / oauth 跟你的域名
  • Webhook Token 只对你的群有效
  • 用户数据、消息、文件在你自己的 MinIO / 磁盘

适合 内网 OA 统一登录、自建 DevOps 通知;不适合「接官方开放平台、用公共 AppId 就行」的模式——这是产品定位,接入前心里要有数。


7. 本篇小结与系列后续

本篇讲了什么:

  • OAuth2 三工程分工、Code 流程、Scope、与 avatar URL 的关系
  • 群 Webhook 配置步骤、bot_public 接口与 msgtype、消息进群链路
  • 开放接入如何逼回完整 URL 的开发反思
  • 部署验证清单与常见 FAQ

后续功能解析(尚未撰写):

计划篇主题
52好友与私聊
53群聊(禁言、入群审批、@)
54表情与动态
55音视频 LiveKit、通知中心
56beaver-manager 运营与审核
57datasync 与离线(可对接 46/47)

功能清单仍以 48 号文 为准。45 号文偏 接入操作,46 / 47 偏 源码链路;50 / 51 是 产品功能 + 设计取舍,三份对照读最完整。


相关链接

项目源码:

  • 后端源码:https://github.com/wsrh8888/beaver-server
  • 移动端Flutter源码:https://github.com/wsrh8888/beaver-flutter
  • PC端源码:https://github.com/wsrh8888/beaver-desktop.git
  • 后台管理系统源码:https://github.com/wsrh8888/beaver-manager
  • 开放平台门户源码:https://github.com/wsrh8888/beaver-open
  • OAuth 授权登录页源码:https://github.com/wsrh8888/beaver-oauth
  • Web SDK:https://github.com/wsrh8888/beaver-sdk

学习资源:

  • 在线文档:https://wsrh8888.github.io/beaver-docs/

核心教学视频:

  • 本地搭建教程合集:https://space.bilibili.com/269553626/lists/6075764?type=season
  • 服务器部署教程合集:https://space.bilibili.com/269553626/lists/6075828?type=season
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「、皓子~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值