什么是 WebHooks
WebHooks 是一种 Web 技术,它允许应用程序在某个事件发生时发送 HTTP 通知给另一个应用程序。通常,接收此通知的应用程序将执行某些操作。例如,一个 WebHooks 可用于在代码仓库上合并分支时触发构建过程。
WebHooks 由一个发送方和一个接收方组成。发送方通常是一个应用程序或服务,它维护它想要通知的事件类型列表。接收方即 WebHooks 接收器,它允许发送方向其发送 POST 请求,包含有关事件的详细信息。
使用 Fastify 构建 WebHooks 接收器
为什么选择 Fastify
Fastify 是一个快速和低开销的 Web 框架,它可以帮助我们轻松地构建 WebHooks 接收器。Fastify 提供了许多功能,例如支持异步处理、请求日志记录、可配置的路由处理和连接管理等,这些功能使 Fastify 成为构建高效 WebHooks 接收器的有力工具。
开始构建
首先,我们需要创建一个新的 Fastify 项目,并安装 fastify
包。
mkdir webhook-receiver cd webhook-receiver npm init npm install fastify
Fastify 支持使用对象、函数和插件构建路由。我们将使用对象路由来构建我们的 WebHooks 接收器。
在项目根文件夹中创建一个名为 index.js
的文件,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - -------------------- ----------------- ----- --------- ------ -- - ------------------------- ---------------- -- -------------------- ----- -------- -- - -- ----- - ------------------ --------------- - ------------------- --------- -- ------------ --
这将创建一个 Fastify 实例并注册一个处理 HTTP POST 请求的路由。我们在控制台上记录请求正文并发送一个响应。
解析请求正文
因为 WebHooks 请求通常具有 JSON 格式的负载,我们需要解析请求正文来访问事件对象。Fastify 内置了插件来帮助我们解析请求正文。我们可以使用以下命令安装 fastify-formbody
包:
npm install fastify-formbody
在 index.js
文件顶部添加以下代码来启用插件:
fastify.register(require('fastify-formbody'))
现在,在 post
路由处理程序中,我们可以通过 request.body
访问请求的 JSON 负载。接下来,我们将使用 GitHub WebHooks 做一个示例。
示例:在 GitHub 上使用 WebHooks
我们将创建一个在 repo 的 push 事件上触发构建过程的 WebHooks。让我们先在我们的构建服务器上设置一个简单的 bash 脚本来执行构建过程:
#!/bin/bash echo "Building app..." # Install dependencies and build the app here exit 0
接下来,在我们的 GitHub 代码仓库的 Settings
-> Webhooks
选项卡中创建一个新 WebHooks。
- Payload URL: 我们部署的服务器地址。在本例中为
http://localhost:3000
- Content type:
application/json
- Secret: 数据传输的加密签名密码。可以随意选择一个密码。(本示例中选择了
supersecret
) - Which events would you like to trigger this webhook?: 选择
Just the push event.
现在,我们需要将加密的密钥添加到我们的请求处理程序中,以保护我们的 WebHooks 免受恶意请求攻击。我们可以使用 crypto
模块和 Verify-Signature
headers 完成此操作。
-- -------------------- ---- ------- ----- ------ - ------------------ ----- ---------- - -------- -------- -- - ------ ------------------------- ------------------------------------------------------ -- ----------------- ----- --------- ------ -- - ----- ------ - -------------- ----- --------- - ----------------------------------- ----- ------- - ------------- ----- ---- - ------------------ --------- -- ------------------------- ----------------------- --------------------------- -- - ------ ----------------------- - -- ------------ --- -------------------- - ----- - ---- - - ------------------------- ------------------------- ----- ------- ------- -- - -- ----- - ------------------- ------ ----------------------- - -------------------- ---------------------- ------ ----------------- --- - ---------------- --
在我们的 post
路由处理程序中,我们首先使用 createHmac
函数创建一个加密的密钥,并使用 timingSafeEqual
函数比较请求中的密钥和加密的密钥。如果相等,接下来我们检查 payload.ref
是否等于 refs/heads/master
,如果是,则运行我们的构建脚本,并在控制台中记录输出。
现在,我们已经成功地构建了一个用于接收 WebHooks 通知的 Web 服务器。
总结
在本文中,我们介绍了 WebHooks 的概念,并展示了如何使用 Fastify 框架来构建 WebHooks 接收器。我们使用 fastify-formbody
插件来解析请求正文,使用 crypto
模块和 Verify-Signature
headers 来保护我们的 WebHooks 免受恶意请求攻击,并给出了一个基本的示例:使用 GitHub WebHooks 来触发构建过程。
当我们使用 WebHooks 时,我们需要牢记的一点是安全性和可靠性。如果我们的 WebHooks 配置不正确,可能会导致安全漏洞和其他不良后果。注意事项包括:仅允许来自受信任的源的请求,使用加密签名运输敏感数据等。
我希望本文有助于您了解如何构建安全、高效的 WebHooks 接收器,并有助于您在将来的工作中解决类似的问题。如果您对 Fastify 有更多的兴趣,您可以浏览 Fastify 文档,了解更多内容。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae46a148841e9894a44c11