技术案例:反向连接--钉钉开放平台Stream模式回调原理研究

779 阅读3分钟

钉钉官方Stream模式介绍

以下是钉钉开放平台官网对于Stream模式的介绍说明,其原理主要就是使用了基于WS的反向连接技术来注册回调,对比传统的开放平台公网回调以实现基于内访外NAT下所谓的“五零”即不需要开放公网域名 or IP、不需要开通外访内防火墙策略等,详细参考👇

open.dingtalk.com/document/re…

Stream模式原理(内容来自钉钉开放平台)

在 Stream 模式下,开发者的应用程序通过集成 SDK 的方式与钉钉开放平台建立一条 WebSocket 连接,建立连接过程中开放平台将对连接进行鉴权。当有卡片回调发生时,开放平台将通过 WebSocket 连接将数据通知到开发者的应用程序。开发者的应用程序可以接收到这些数据并进行相应处理,从而实现与钉钉开放平台的实时通信,参考下图所示

Stream模式优势(内容来自钉钉开放平台)

在钉钉开放平台向应用程序发送请求的场景中,大部分都是采用 Webhook (注册公网 HTTPS 服务)的方式,包括卡片回调,使用 Webhook 方式开发过程中会遇到较多的问题,包括

  • 申请公网域名和TLS证书

  • 申请公网IP并部署接入网关

  • 部署应用防火墙并配置白名单

  • 独立处理请求的鉴权,以及加解密处理

  • 搭建内网穿透环境进行本地开发调试

针对以上问题,Stream 模式将为开发者提供"五零"接入体验,将1~2周的接入开发周期降低到5分钟,包括

  • 零公网IP

    不需要依赖公网IP或域名,也不需要暴露公网IP,减少了公网暴露服务的安全风险并降低了开发门槛。

  • 零加解密/签名/TLS证书管理

    使用应用身份对连接进行鉴权,通过反向连接的方式与钉钉开放平台建立TLS加密连接,提供了快速、安全的通信体验。

  • 零防火墙白名单

    Stream 模式下开发者无需向公网开放提供任何服务端口,无需部署防火墙和配置白名单。

  • 零网关部署

    通过反向连接的方式建立通道,开发者只需保证运行环境具备公网访问能力即可,无需部署网关。

  • 零内网穿透

    开发者无需在本地搭建内网穿透工具,通过 Stream 模式在本地开发环境中即可接收卡片回调。

官方demo案例 debug 调试研究

官方 demo 地址:github.com/open-dingta…

下载后配置钉钉开放平台应用凭证(appKey appSecret)后可直接运行

直接从日志看,只能看到建立WS连接的结果日志,尝试 debug 探究底层每一步流程

start websocket connection, uri=wss://wss-open-connection.dingtalk.com:443/connect
connection is established, connectionId=0700f61d-548b-11ef-a6c8-aad0bc984849

详细 debug 跟随

请求打开连接

com.dingtalk.open.app.api.OpenDingTalkStreamClient#start

执行打开连接任务

com.dingtalk.open.app.stream.network.core.DefaultSessionPool.ConnectionTask

image.png

获取WS连接点 Endpoint

com.dingtalk.open.app.api.OpenDingTalkStreamClient#openConnection

image.png

建立WS连接

com.dingtalk.open.app.stream.network.ws.WebsocketTransportConnector#connect

image.png

com.dingtalk.open.app.stream.network.core.DefaultSessionPool.ConnectionTask

建立连接,connectionId=e582087b-0ea4-11ef-89bf-aa5e3c11bd53,标记本次连接

总结

所谓“Stream模式 反向连接” 就是分为2步:👇

  • 1、客户端主动请求钉钉服务端获取 endpoint 和 ticket
  • 2、客户端得到 endpoint 和 ticket 后再去根据 endpoint 和 ticket WS建连

参考资料

配置Stream推送

服务端Stream模式