svix - webhooks

在这里插入图片描述


文章目录

    • 一、关于 Svix
      • Client Library Overview
      • 与 Svix 托管服务的区别
    • 二、运行服务器
      • 1、部署
          • 1.1 Docker
            • 1) 使用 Docker Compose
            • 2) 独立容器
        • 1.2 预编译的二进制文件
        • 1.3 从源代码构建
      • 2、运行时依赖项
      • 3、Redis/Valkey 注意事项
        • 持久性
      • Eviction 政策
      • 4、服务器配置
        • 4.1 配置文件
        • 4.2 环境(变量或`.env`)
        • 4.3 OpenTelemetry
        • 4.4 连接池大小
        • 4.5 SSRF 攻击和内部 IP 地址
        • 4.6 Webhook 签名方案(对称与非对称)
      • 5、验证
        • 使用不同的签名算法
      • 6、操作(传入)webhook
      • 7、非对称签名
        • 配置按键
        • 签名方案
      • 8、关闭服务器


一、关于 Svix

  • github : https://github.com/svix/svix-webhooks/
  • 官网:https://svix.com/
  • 文档 : https://docs.svix.com/
  • API : https://api.svix.com
  • 社区 Slack : https://svix.com/slack | 论坛:https://github.com/svix/svix-webhooks/discussions

Svix 让开发人员可以轻松发送 webhook。开发人员只需进行一次 API 调用,Svix 便会负责交付能力、重试、安全性等。有关更多信息,请参阅Svix 主页。

要及时了解新功能和改进,请务必关注 repo : https://github.com/svix/svix-webhooks/

观看并关注我们的 repo



Client Library Overview

⚡️ Feature Breakdown ⚡️
LanguageOfficially SupportedAPI SupportWebhook VerificationOther Notes
Go
Python
Typescript/Javascript
JavaAsync support planned. (If you use kotlin, checkout our kotlin library for coroutine support.)
Kotlin
Ruby
C# (dotnet)
Rust
PHP🔜


与 Svix 托管服务的区别

我们开源 Svix 调度程序的主要目标之一是易于使用。然而,由于我们的规模和所需的基础设施,托管的 Svix 服务相当复杂。这种复杂性对绝大多数人来说没有用处,会使这个项目更难使用,限制也更多。这就是为什么在发布之前调整了此代码,并且托管调度程序支持的一些功能、优化和行为尚未在此存储库中提供。话虽如此,除了一些已知的不兼容性之外,内部 Svix 测试套件已通过。这意味着它们已经基本兼容,我们正在努力使它们达到完全功能对等。


二、运行服务器

有多种方法可以启动 Svix 服务器。Docker 可能是最常见的方法,但你可以选择最适合你的方法。

Svix 服务器是用 Rust 🦀 编写的,这意味着您可以将其编译为各种目标的静态库。有关更多信息,请参阅下面的从源代码构建部分。

有关可用设置的更多信息,请参阅下面的服务器配置部分。


1、部署


1.1 Docker

您可以使用Docker Hub中的官方 Svix Docker 镜像:https://hub.docker.com/r/svix/svix-server

您也可以使用 latest 标签,或者使用 the versioned tags 之一。

您可以使用 docker compose 示例docker-compose.yml文件(最简单)、docker swarm(高级),或者独立运行容器。


1) 使用 Docker Compose

这个替代方案是最简单的,因为它也将启动和redis配置postgresql

假设您已经安装了 Docker Compose v2。

cd server
docker compose up

2) 独立容器

运行独立容器稍微高级一些,因为它需要您设置一些环境变量并让它们指向您的redispostgres实例。

您可以使用标志将各个环境变量传递给 docker -e,或者只需创建一个文件(如development.env) 并像以下示例一样使用 --env-file 标志:

docker run \
  --name svix-server \
  -p 8071:8071 \
  --env-file development.env \
  svix/svix-server

1.2 预编译的二进制文件

已发布版本的预编译二进制文件可在发布部分中找到。

https://github.com/svix/svix-webhooks/releases


1.3 从源代码构建

Svix 服务器用 Rust 🦀 编写,需要 Rust 构建环境。

如果您已经有一个,那么您只需要运行cargo build,否则,请参阅Svix 服务器 README以获取有关从源代码构建服务器的更多信息。


2、运行时依赖项

服务器需要以下运行时依赖项才能正常工作:

  • PostgreSQL 服务器 - 用于存储事件。
  • 可选的 Redis 服务器 6.2.0 版本 或更高 - 用于任务队列和缓存。

3、Redis/Valkey 注意事项


持久性

请注意,建议在 Redis 中启用持久性,以便在 Redis 服务器重启和升级后保留任务。


Eviction 政策

请确保您的 Redis 实例配置为 不逐出 未明确设置 expire 策略的密钥。这意味着maxmemory-policy应设置为noeviction或任何可用volatile-策略。有关更多信息,请参阅 Redis/Valkey 文档。


4、服务器配置

有三种配置方式svix-server:环境变量,.env文件和配置文件。


4.1 配置文件

您可以将一个名为的文件config.toml放在当前工作目录中,svix-server它会自动选择该文件。您可以查看示例文件以获取更多信息和受支持设置的完整列表:config.toml。

以下是最重要的配置的简单示例:

# The JWT secret for authentication - should be secret and securely generated
jwt_secret = "8KjzRXrKkd9YFcNyqLSIY8JwiaCeRc6WK4UkMnSW"

# The DSN for the database. Only postgres is currently supported.
db_dsn = "postgresql://postgres:postgres@pgbouncer/postgres"

# The DSN for redis (can be left empty if not using redis)
redis_dsn = "redis://redis:6379"

# What kind of message queue to use.
queue_type = "redis"

4.2 环境(变量或.env

或者,您可以svix-server通过为每个支持的设置设置等效的环境变量来进行配置。环境变量可以直接传递,也可以通过在文件中设置它们来传递.env

环境变量的名称 name 与配置名称相同,但都是大写,并以 为前缀SVIX_

例如,如果在环境中传递上述示例配置,它将如下所示:

# The JWT secret for authentication - should be secret and securely generated
SVIX_JWT_SECRET = "8KjzRXrKkd9YFcNyqLSIY8JwiaCeRc6WK4UkMnSW"

# The DSN for the database. Only postgres is currently supported.
SVIX_DB_DSN = "postgresql://postgres:postgres@pgbouncer/postgres"

# The DSN for redis (can be left empty if not using redis)
SVIX_REDIS_DSN = "redis://redis:6379"

# What kind of message queue to use.
SVIX_QUEUE_TYPE = "redis"

4.3 OpenTelemetry

您可以将跟踪信息发送到 OpenTelemetry Collector,它允许将跟踪事件转发到许多外部应用程序/服务,例如 DataDog、Jaeger、NewRelic、Prometheus、Sentry、Signoz 和 Zipkin。

您可以在这些说明中看到更多内容。


4.4 连接池大小

有两个配置变量db_pool_max_sizeredis_pool_max_size分别控制 PostgreSQL 和 Redis 的连接池允许的最大大小。

它们默认的最大大小为 20,但如果您的数据库可以处理,则更高的值可以显著提高性能。


4.5 SSRF 攻击和内部 IP 地址

为了防止 SSRF 攻击,默认情况下会阻止向内部 IP 地址发送消息。

但是,我们知道这不能满足每个用户的需求,例如,服务只能在内部访问。要绕过这些限制,请参阅配置选项whitelist_subnets,它接受 CIDR 符号子网数组以允许向其发送消息。


4.6 Webhook 签名方案(对称与非对称)

为了确保消息的安全性和完整性,Svix 在发送之前会对所有 webhook 消息进行签名。Svix 支持两种类型的签名方案:对称(预共享密钥)和非对称(公钥)。

对称签名的速度明显更快(签名速度快约 50 倍,验证速度快约 160 倍),而且更简单(这让您的客户更容易验证),但它们需要每个端点使用预共享密钥(端点机密)才能工作。另一方面,非对称签名只需要与您的客户共享公钥(不是机密)。

鉴于上述情况,建议使用对称密钥,这也是 Svix 的默认设置。它们的使用已记录在文档的验证签名部分中。

但是,在某些情况下,使用非对称签名可能会有所帮助,这就是为什么它们也受到支持的原因。有关更多信息,请参阅下面的非对称签名部分。


5、验证

使用正确的机密生成的有效 JWT 作为Bearer

例如:

Authorization: Bearer <JWT_TOKEN_HERE>

使用以下方式生成一个

svix-server jwt generate

或者如果您正在生成自己的,请确保用作org_23rb8YdGqMT0qIzpgGwdXfHirMu字段subH256用作算法。

机密的有效 JWT 示例x(以便您可以看到结构):

// JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2NTUxNDA2MzksImV4cCI6MTk3MDUwMDYzOSwibmJmIjoxNjU1MTQwNjM5LCJpc3MiOiJzdml4LXNlcnZlciIsInN1YiI6Im9yZ18yM3JiOFlkR3FNVDBxSXpwZ0d3ZFhmSGlyTXUifQ.USMuIPrqsZTSj3kyWupCzJO9eyQioBzh5alGlvRbrbA
// Structure (when decoded):
{
  "iat": 1655140639,
  "exp": 1970500639,
  "nbf": 1655140639,
  "iss": "svix-server",
  "sub": "org_23rb8YdGqMT0qIzpgGwdXfHirMu"
}

使用不同的签名算法

如上所述,签署 JWT 的默认算法是。您可以通过将配置设置为以下支持的值之一来HS256选择其他算法: 、、、、或。jwt_algorithm``HS384``HS512``RS256``RS384``RS512``EdDSA


6、操作(传入)webhook

操作性 webhook 是您可以订阅的 webhook,以便收到 svix-server 上发生的重要事件的通知。支持的事件列表可在API 参考的 webhook 部分中找到。

操作 webhook 使用 Svix,并由具有以下 ID 的特殊帐户服务帐户控制:org_00000000000SvixManagement00

第一步是通过设置配置operational_webhook_address以指向您的 Svix 服务器来启用它。此设置的最常见值是http://127.0.0.1:8071,但根据您的具体设置,它可能有所不同。

上述步骤在此实例上启用了操作 webhook,下一步是为您的特定组织启用它。如上所述,操作 webhook 在后台使用普通的 Svix 帐户,因此我们首先需要获取此帐户的身份验证令牌。为此,您应该运行:

svix-server jwt generate org_00000000000SvixManagement00

这将为您提供一个特殊的 JWT 来访问操作 webhook 帐户,这与您与 Svix 交互时使用的普通 JWT 不同。例如,我们假设它返回的 JWT 是op_webhook_token_123

要为特定帐户启用操作 webhook,我们需要首先在服务帐户中为其创建一个应用程序(请记住:操作 webhook 只是在后台使用 Svix)。我们将使用默认的 Svix 帐户作为示例:org_23rb8YdGqMT0qIzpgGwdXfHirMu

curl -X 'POST' \
  'http://localhost:8071/api/v1/app/' \
  -H 'Authorization: Bearer op_webhook_token_123' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
        "name": "Operational webhook for default org",
        "uid": "org_23rb8YdGqMT0qIzpgGwdXfHirMu"
    }'

就是这样,我们现在已为默认帐户启用了操作 webhook。剩下唯一要做的就是添加将操作 webhook 发送到的端点。例如:

curl -X 'POST' \
  'https://api.eu.svix.com/api/v1/app/org_23rb8YdGqMT0qIzpgGwdXfHirMu/endpoint/' \
  -H 'Authorization: Bearer AUTH_TOKEN' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
        "url": "https://operational-webhook-destination.com/webhook/",
        "filterTypes": [
          “endpoint.updated”,
          “endpoint.deleted”
        ],
    }'

请注意,在创建端点时,我们如何使用默认帐户的组织 ID 作为app_id(或者更确切地说,在这种情况下)。uid

就是这样。您现在应该有可用的操作 webhook。如果您想创建新端点或修改现有端点,只需为服务帐户生成 JWT,然后像使用任何其他 Svix 帐户一样使用该 JWT。


7、非对称签名

如上所述,建议使用对称签名。但是,如果您确定需要非对称签名,请阅读以下有关设置非对称签名的说明。


配置按键

默认情况下,Svix 服务器会为端点生成对称密钥,这意味着消息将使用对称密钥进行签名。要更改此默认设置,请将配置设置default_signature_typeed25519如下:

default_signature_type = "ed25519"

此外,无论默认值设置为多少,您仍然可以通过在端点上明确设置密钥来覆盖它。

要设置对称密钥,请将端点密钥设置为以 为前缀的密钥whsec_,例如whsec_51TKyHBy5KFY1Ab98GQ8V60BkWnejkWy

要设置非对称密钥,请将端点密钥设置为以 为前缀的有效ed25519 base64 编码私钥,whsk_例如 : whsk_6Xb/dCcHpPea21PS1N9VY/NZW723CEc77N4rJCubMbfVKIDij2HKpMKkioLlX0dRqSKJp4AJ6p9lMicMFs6Kvg==

请注意,预期的私钥结构是:whsk_${base64(private_key + public_key)}


为了测试目的,可以使用以下命令生成新的非对称密钥对:

$ svix-server asymmetric-key generate

Secret key: whsk_6Xb/dCcHpPea21PS1N9VY/NZW723CEc77N4rJCubMbfVKIDij2HKpMKkioLlX0dRqSKJp4AJ6p9lMicMFs6Kvg==
Public key: whpk_1SiA4o9hyqTCpIqC5V9HUakiiaeACeqfZTInDBbOir4=

签名方案

Svix 用于ed25519(m)签署 webhook 消息,其构造m方式与对称签名相同。

当验证消息时,您还应确保时间戳足够新,以限制重放攻击的可能性,如对称验证文档中所述。


8、关闭服务器

为了支持服务器的正常关机,所有正在运行的任务都会在 SIGINT/SIGTERM 信号关闭之前完成。这通常需要不到十秒钟的时间。


2024-05-24(五)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

红队技巧:仿冒Windows登录

Metasploit框架&#xff1a;phish_windows_credentials Metasploit带有内置的后期漏洞利用功能&#xff0c;可帮助我们完成任务。由于它是后渗透的模块&#xff0c;因此只需要输入会话即可&#xff1a; use post/windows/gather/phish_windows_credentials set session 1 …

WebGL学习(一)渲染关系

学习webgl 开发理解渲染关系是必须的&#xff0c;也非常重要&#xff0c;很多人忽视了这个过程。 我这里先简单写一下&#xff0c;后面尽量用通俗易懂的方式&#xff0c;举例讲解。 WebGL&#xff0c;全称Web Graphics Library&#xff0c;是一种在网页上渲染3D图形的技术。它…

【链表】Leetcode 61. 旋转链表【中等】

旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 解题思路 要将链表每个节点向右移动 k 个位置&#xff1a; 计算链表…

Leetcode3161. 物块放置查询(Go语言的红黑树 + 线段树)

题目截图 题目分析 每次1操作将会分裂成两块区间长度&#xff0c;以最近右端点记录左侧区间的长度即可 因此涉及到单点更新和区间查询 然后左右侧最近端点则使用redBlackTree&#xff0c;也就是python中的sortedlist ac code type seg []int// 把 i 处的值改成 val func (t …

Spark-RDD-常用算子(方法)详解

Spark概述 Spark-RDD概述 Spark RDD 提供了丰富的方法来对数据进行转换和操作。 对 RDD&#xff08;Resilient Distributed Dataset&#xff09;的操作可以分为两大类&#xff1a;转换算子&#xff08;Transformations&#xff09;和行动算子&#xff08;Actions&#xff09;…

无线领夹麦克风哪个品牌好?本期文章揭秘无线麦克风哪个品牌好用

​在当下这个全民皆为媒体的时代大潮中&#xff0c;视频分享已然成为了引领风尚的指向标。在自媒体领域竞争愈发激烈的态势下&#xff0c;若要在这片广阔海洋中扬帆远航&#xff0c;优秀的作品毫无疑问是吸引观众的关键所在。而想要塑造出这样的卓越之作&#xff0c;除了需要创…

java —— 异常处理

一、认识异常 java 中的异常大致分为三类&#xff1a;编译错误、逻辑错误、运行异常。其中编译错误和逻辑错误通常手动更改即可&#xff0c;运行异常是异常处理的主要内容。 java 中的异常全部继承自 Exception 类&#xff0c;其常见的子类如下&#xff1a; 查看异常&#xf…

vscode常用操作

1 vscode跳转node_modules下文件&#xff0c;没有切换定位到左侧菜单目录的问题 2&#xff0c;搜索node-modules 3&#xff0c;设置选中字体颜色 {"workbench.colorTheme": "Default Light Modern","editor.mouseWheelZoom": true,"termin…

clocking wizard IP核通过AXI4-Lite接口实现动态重新配置应用实例

在最近的FPGA应用中&#xff0c;应用到了基于Zynq 7000的Uart串口设计&#xff0c;为了让串口的时钟更精确&#xff0c;采用了外部时钟模式&#xff0c;如下图所示。外部时钟连接到了Clocking Wizard IP核的输出端。 在串口通信时&#xff0c;发现串口有错码出现。例如&#xf…

Secure Operation

文章目录 Secure Summation OperationSecure Set Union Operation Secure Summation Operation 让我们通过一个具体的例子来说明这个算法。 假设有三个数据拥有者 S1, S2 和 S3&#xff0c;他们分别持有以下值&#xff1a; S1 持有 value1 10S2 持有 value2 20S3 持有 val…

React 微信扫码登陆网页

微信扫码登陆网页 第一步&#xff1a;微信开放平台申请应用第二步&#xff1a;前端生成二维码第三步&#xff1a;微信扫码授权 微信官方开发说明文档 第一步&#xff1a;微信开放平台申请应用 微信开放平台注册开发者账号&#xff0c;并拥有一个已审核通过的网站应用&#xff…

用了那么久的可道云teamOS,居然才发现这个隐藏的功能:一键存图,无需下载

在日常的工作或学习中&#xff0c;我们在遇到喜欢的图片时&#xff0c;总会想要保存下来以备后用。 然而&#xff0c;传统的图片保存方式通常需要我们右键另存为&#xff0c;或者复制链接、打开下载工具&#xff0c;甚至可能需要跳转到其他应用或网页才能完成下载。 存在电脑本…

jmeter之MD5加密接口请求教程

前言&#xff1a; 有时候在项目中&#xff0c;需要使用MD5加密的方法才可以登录&#xff0c;或者在某一个接口中遇到 登录获取token后才可以进行关联&#xff0c;下面介绍下遇到的常见使用 一、第一种方法&#xff1a;使用jmeter自带的函数助手digest 选择工具&#xff0c;选…

IC开发——verdi基本用法

1. 基础知识 1.1. verdi VCS和Verdi这两个工具&#xff0c;这两个工具目前都属于synopsys公司。VCS主要负责编译运行Testbench和RTL&#xff0c;并负责生成相应的波形文件。而verdi主要负责加载波形文件&#xff0c;查看信号的波形及其对应的代码来进行调试验证。Verdi最开始…

Spring Boot集成六大常用中间件,附集成源码,亲测有效

目录 万字论文&#xff0c;从0到1&#xff0c;只需1小时获取途径1、Spring Boot如何集成Spring Data JPA&#xff1f;2、Spring Boot如何集成Spring Security&#xff1f;3、Spring Boot如何集成Redis&#xff1f;4、Spring Boot如何集成RabbitMQ&#xff1f;5、Spring Boot如何…

PGP软件安装文件加密解密签名实践记录

文章目录 环境说明PGP软件安装PGP软件汉化AB电脑新建密钥并互换密钥对称密钥并互换密钥 文件加密和解密A电脑加密B电脑解密 文件签名A电脑签名文件B电脑校验文件修改文件内容校验失败修改文件名称正常校验 环境说明 使用VM虚拟两个win11,进行操作演示 PGP软件安装 PGP软件下…

ML307R OpenCPU 网络初始化流程介绍

一、网络初始化流程 二、函数介绍 三、示例代码 四、代码下载地址 一、网络初始化流程 模组的IMEI/SN获取接口可在include\cmiot\cm_sys.h中查看,SIM卡IMSI/ICCID获取接口可以在include\cmiot\cm_sim.h中查看,PDP激活状态查询可以在include\cmiot\cm_modem.h中查看 二、函…

Java面试八股之多线程编程中什么是上下文切换

多线程编程中什么是上下文切换 上下文切换&#xff08;Context Switch&#xff09;是操作系统为了实现多线程或进程并发执行而采取的一种机制。在Java多线程环境中&#xff0c;上下文切换具体指的是CPU控制权从一个正在运行的线程转移到另一个就绪并等待CPU执行权的线程的过程…

Python轴承故障诊断 (21)基于VMD-CNN-BiTCN的创新诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…

职业探索--运维体系-SRE岗位/CRE岗位/运维岗位-服务心态-运维职业发展方向-运维对象和运维场景

参考来源&#xff1a; 极客时间专栏&#xff1a;赵成的运维体系管理课 极客时间专栏&#xff1a;全栈工程师修炼指南 赵成大佬在鹏讯云社区的文章&#xff08;77篇&#xff09; 有了CMDB&#xff0c;为什么还要应用配置管理 故障没有根因&#xff0c;别再找了 如何理解CMDB的套…