ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ToolJet Slack 数据源接入指南:OAuth 授权、三种操作与源码级原理解析

ToolJet Slack 数据源接入指南:OAuth 授权、三种操作与源码级原理解析 ToolJet Slack 数据源接入指南OAuth 授权、三种操作与源码级原理解析【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 项目地址: https://gitcode.com/GitHub_Trending/to/ToolJetToolJet 允许你通过内置的 Slack 插件将工作区连接到 Slack从而在应用内发送消息、列出成员、读取频道历史消息并可将这些能力编排进按钮事件、定时任务与工作流。本文以 docs/versioned_docs/version-3.0.0-LTS/data-sources/slack.md 为主线结合仓库中的插件实现plugins/packages/slack与前端授权组件frontend/src/_components/Slack.jsx完整讲解从连接、授权到执行查询的每一步并剖析底层 OAuth 流程与三个操作背后的 Slack Web API 调用让你既能照做也能看懂原理。前提在 Slack 侧准备一个可用的 App在 ToolJet 中建立连接之前你需要在 Slack 侧有一个已创建并安装到目标工作区的 App。仓库文档明确给出了一个关键约束提供凭据的 App 必须已经安装在工作区中并且需要被添加到你想发送消息的频道里。这意味着App 需要完成 OAuth 授权并安装install到目标工作区对于Send Message操作App 还必须被加入目标频道在 Slack 频道中执行/invite your-app-name或在 App 管理页配置 Bot 并邀请进频道否则chat.postMessage会返回not_in_channel之类的错误用于授权回传的Redirect URI / OAuth callback URL必须与 ToolJet 展示的值一致详见下文“获取 Redirect URI”小节。一、建立连接添加数据源与 OAuth 授权连接 Slack 数据源有两种入口任选其一在查询面板query panel点击 Add new Data source按钮通过 ToolJet 仪表盘进入Data Sources页面后添加。进入 Slack 连接界面后你会看到授权说明、默认权限范围、chat:write权限开关、Slack App 选择以及Connect to Slack按钮。权限范围Scopes与chat:write开关前端组件 frontend/src/_components/Slack.jsx 定义了默认权限范围共 9 个users:read, channels:read, groups:read, im:read, mpim:read, channels:history, groups:history, im:history, mpim:history这些范围分别支撑三种操作users:read→ 支撑List Memberschannels:history/groups:history/im:history/mpim:history→ 支撑List Messages可读公共频道、私密群组、单聊 IM、多人私聊 MPIM 的历史若要发送消息需要额外勾选chat:write开关见 Slack.jsx勾选后会在 scope 字符串末尾追加chat:write。获取 Redirect URI回调地址连接界面底部会展示一个Redirect URI由前端根据当前部署地址动态生成Slack.jsxconst redirectUri ${getHostURL()}/oauth2/authorize;在 Slack App 管理后台配置 OAuth 回调时必须填写该地址否则授权回调将无法命中 ToolJet。对应地插件服务端在拼接授权链接时同样使用TOOLJET_HOST及可选SUB_PATH构造redirect_uriplugins/packages/slack/lib/index.ts。两种凭据来源环境变量 vs 自定义 Slack App连接界面中Slack app下拉框决定凭据来源Slack.jsx选项ToolJet Cloud选项自托管含义ToolJet slack appUse environment variables使用部署环境中的SLACK_CLIENT_ID/SLACK_CLIENT_SECRET即“from_env”Custom slack appCustom slack app手动填写 Client ID 与 Client Secret即“from_datasource_configuration”选择Custom slack app后界面会额外出现Client ID与Client Secret两个输入框Slack.jsx。这两个值最终会落入数据源配置的client_id、client_secret字段在 manifest.json 中client_secret被标记为encrypted: true即以加密形式存储。从源码结构看自托管部署若不配置环境变量使用“Use environment variables”选项时插件会读取不到凭据因此自托管用户通常选择自定义 App 方式填写凭据。授权流程OAuth 2.0点击Connect to Slack后前端通过datasourceService.fetchOauth2BaseUrl(slack, ...)请求后端生成授权 URL并附加scope、access_typeoffline、promptselect_account参数后弹出新窗口Slack.jsx。服务端插件负责拼接 Slack 的授权端点plugins/packages/slack/lib/index.tshttps://slack.com/oauth/v2/authorize?response_typecodeclient_idCLIENT_IDredirect_uriTOOLJET_HOSTSUB_PATH/oauth2/authorize在 Slack 弹出的授权页面上见下图确认 ToolJet 将能读取频道/对话内容与工作区信息点击允许后Slack 会携带授权码code回调到 ToolJet。随后插件调用 Slack 的令牌端点换取访问令牌index.tsPOST https://slack.com/api/oauth.v2.access body: codeAUTH_CODEclient_idCLIENT_IDclient_secretCLIENT_SECRETredirect_uriREDIRECT_URI响应中的access_token以及可能的refresh_token会被保存为数据源的安全字段此后所有查询都通过Authorization: Bearer access_token调用 Slack APIindex.ts。二、查询 Slack创建查询的通用步骤连接建立后即可在查询管理器中编写查询点击编辑器底部查询管理器的 Add按钮选择上一步添加的Slack数据源在Operation下拉框中选择目标操作List members / Send message / List messages from a channel点击Preview预览输出或点击Run创建并触发查询。操作下拉框由插件的操作描述文件 operations.json 定义其内部值与显示名称的对应关系如下显示名称内部值operation底层 Slack APIList memberslist_usersusers.listSend messagesend_messagechat.postMessageList messages from a channellist_messagesconversations.history从 index.ts 的run()方法可以看到插件根据queryOptions.operation走switch分支执行对应请求成功后统一返回{ status: ok, data: result }若网络/接口调用抛出异常则包装为QueryErrorQuery could not be completed。查询结果会暴露为查询变量的data与rawData字段见 manifest.json 中的exposedVariables可在前端表达式中引用。三、支持的三种操作详解1. List Members列出工作区成员功能返回当前 Slack 工作区所有成员的数据。参数无。底层实现插件以 GET 方式调用https://slack.com/api/users.listindex.ts响应中的members数组即成员列表含id、name、real_name、profile等字段。从源码实现看该操作未透传分页参数会一次性拉取接口返回的全部成员成员较多的工作区注意响应体大小。2. Send Message发送消息功能向指定频道或私信DM / IM发送消息。必填参数Channel频道 ID 或用户 ID占位提示为Enter channel id or user id。注意 Slack 要求传ID 而非名称——可在 Slack 中通过右键频道“Copy link”获取C...开头的频道 ID或直接使用users.list查询返回的用户 ID 来发私信Message要发送的消息正文。权限前提执行该操作前必须勾选连接界面中的chat:write开关Slack.jsx授权时才会在 scope 中追加chat:write。这一点与插件运行逻辑强耦合——插件在run()中会检查sourceOptions.access_type chat:write不满足则直接返回index.ts{ ok: false, error: You do not have the required permissions to perform this operation }底层实现通过chat.postMessage发送index.ts请求体如下{ channel: queryOptions.channel, text: queryOptions.message, as_user: queryOptions.sendAsUser // 可选是否以应用bot身份发送 }其中as_user由查询参数sendAsUser透传类型定义见 types.ts。消息正文支持 Slack 的 mrkdwn 富文本语法如*加粗*、\代码。常见报错not_in_channel表示 App 未被邀请进目标频道missing_scope表示授权时未勾选chat:write。3. List Messages列出频道消息功能获取指定频道的消息历史。必填参数Channel频道 ID占位提示为Enter channel idLimit本次返回的最大消息条数Next Cursor分页游标用于获取下一页数据。底层实现插件以 POST 表单方式调用https://slack.com/api/conversations.historyindex.ts{ channel: queryOptions.channel, limit: queryOptions.limit || 100, // 默认 100 条 cursor: queryOptions.cursor || // 空串表示第一页 }关于 Limit 与 Next Cursor 的说明limit不填时插件默认取 100Slack API 的返回条数上限Slack 的分页采用游标cursor机制——第一页响应中的response_metadata.next_cursor即为下一页的游标值将其填入Next Cursor即可继续拉取后续消息循环该过程即可遍历整个频道历史。limit与cursor均声明为codehinter类型operations.json意味着它们支持 JS 表达式可动态传入例如从上一查询结果中取next_cursor。四、参数表达式与查询联动三个操作的参数Channel、Message、Limit、Next Cursor在 operations.json 中均被定义为codehinter类型支持在输入框中编写 JavaScript 表达式引用其他查询的返回值。典型的联动场景发消息给最近列出的成员用 List Members 查询的data.members[0].id作为 Send Message 的 Channel 参数分页读取历史消息第一次执行 List Messages 后将返回结果中的data.response_metadata.next_cursor填入第二次查询的 Next Cursor逐页滚动抓取用消息内容触发后续逻辑在 List Messages 结果上继续编写{{queries.slack1.data.messages}}之类的表达式完成过滤、统计或写入数据库。五、从源码看整体链路把上文串起来一次 Slack 查询的完整调用链如下前端查询管理器选择操作与参数 → 插件 run() 方法switch 分发见 plugins/packages/slack/lib/index.ts → Slack Web APIusers.list / chat.postMessage / conversations.history → 返回 { status: ok, data: result } 给查询面板 → 结果可被其他组件、查询或 JS 表达式引用授权链路则分两段前端组件 Slack.jsx 负责展示界面、收集 scope 与凭据来源插件服务端 index.ts 负责构造授权 URL、用授权码换 token并将 token 作为数据源安全字段持久化。credential_source的from_env/from_datasource_configuration两种取值对应读取SLACK_CLIENT_ID/SLACK_CLIENT_SECRET环境变量或界面填写的 Client ID/Secretindex.ts。整个插件以tooljet-plugins/common的QueryService接口为契约实现index.ts与 ToolJet 的其他数据源插件保持一致的接入模式数据源的属性结构由 manifest.json 声明操作参数结构由 operations.json 声明两者是驱动动态表单渲染的元数据来源。常见问题速查现象排查方向授权页未出现或回调失败检查 Redirect URI 是否与 ToolJet 界面展示的完全一致检查 Client ID/Secret 是否正确发送消息返回not_in_channel将 AppBot邀请进目标频道后再试发送消息返回missing_scope/ 权限错误授权时勾选chat:write开关或重新授权以补充 scopeList Messages 只拿到部分消息使用响应中的response_metadata.next_cursor配合 Next Cursor 参数分页拉取查询报 “Query could not be completed”检查 token 是否有效、网络是否可达slack.com参见 index.ts 的异常包装逻辑【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表