svix - webhooks

news2024/11/15 23:26:41

在这里插入图片描述


文章目录

    • 一、关于 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(五)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【探索数据之美】“从基础到精通——深入解析数据结构与二叉树的秘密“

gitee代码获取链接&#xff1a;https://gitee.com/flying-wolf-loves-learning/data-structure.git 一、树的概念 1.1 概念简述 数据结构中的树是一种层次结构&#xff0c;它由节点&#xff08;node&#xff09;和边&#xff08;edge&#xff09;组成。每个节点都有零个或多…

微服务-Nacos-安装-集成SpringBoot

微服务-SpringCloud-ALibaba-Nacos Nacos 是阿里巴巴推出的 SpringCloud的组件 官网:什么是 Nacos 主要是为了解决微服务的架构中 服务治理的问题服务治理就是进行服务的自动化管理&#xff0c;其核心是服务的注册与发现。 服务注册&#xff1a;服务实例将自身服务信息注册…

用友GRP-U8 sqcxIndex.jsp SQL注入漏洞(XVE-2024-12560)

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 用友GRP-U8是用友公司专注于国家电子政务事业&#…

使用 Spring HATEOAS 开发 REST 服务-浅显的理解

随笔&#xff0c;简单理解 一、restful是什么 1、第一层次&#xff08;Level 0&#xff09;的 Web 服务只是使用 HTTP 作为传输方式&#xff0c;实际上只是远程方法调用&#xff08;RPC&#xff09;的一种具体形式。 SOAP 和 XML-RPC 都属于此类 2、第二层次&#xff08;Lev…

三坐标测量机在汽车零部件质量控制中的应用

高质量的零部件能够确保汽车的性能达到设计标准&#xff0c;包括动力性能、燃油效率、操控稳定性等&#xff0c;从而提供更好的驾驶体验&#xff0c;建立消费者对汽车品牌的信任&#xff1b;也推动了汽车行业的技术创新&#xff0c;制造商不断研发新材料、新工艺&#xff0c;以…

汽车制造业安全有效的设计图纸文件外发系统是什么样的?

在汽车制造的世界里&#xff0c;那些设计图不仅仅是公司智慧的闪光点&#xff0c;更是它们竞争的秘密武器。但问题来了&#xff0c;当公司需要和供应商、合作伙伴频繁交换数据时&#xff0c;怎样安全又高效地发送这些设计图&#xff0c;就成了一个头疼的问题。这篇文章会深挖一…

图解 BERT 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

go使用letteravatar生成圆形透明头像图标

官网地址&#xff1a;GitHub - disintegration/letteravatar: Letter avatar generation for Go 我对其中函数改了一下&#xff0c;支持多个字符&#xff0c;效果如下&#xff1a; func TestCreateAvatar(t *testing.T) {GenerateAvatar("Bird Fish", 0, "Bird…

【包邮送书】你好!C语言

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

56. UE5 RPG 给敌人添加AI实现跟随玩家

在这一篇里&#xff0c;我们要实现一下敌人的AI&#xff0c;敌人也需要一系列的行为&#xff0c;比如朝向英雄攻击&#xff0c;移动&#xff0c;在满足条件时施放技能。这些敌人的行为可以通过使用UE的内置的AI系统去实现。 在UE里&#xff0c;只要是基于Character类创建的蓝图…

【从零开始学习RabbitMQ | 第一篇】如何确保生产者的可靠性

目录 前言&#xff1a; 生产者重连机制&#xff1a; 生产者确认机制&#xff1a; Publisher Confirm&#xff08;生产者者确认&#xff09; Publish Return&#xff08;发布返回&#xff09; 总结&#xff1a; 前言&#xff1a; 在现代的分布式系统中&#xff0c;消息队…

5个将文本转语音的工具,高考复习的绝佳助手

高考倒计时10天&#xff01; 在这最后的冲刺阶段&#xff0c;同学们都在拼命刷题&#xff0c;但面对已经整理好的知识点&#xff0c;时间紧迫&#xff0c;如何高效复习呢&#xff1f; 别急&#xff0c;今天我要和大家分享一个绝佳的复习方法——文字转语音。这个方法可以让你…

鸿蒙4.2小版本推出,鸿蒙5.0已经不远了

上个月&#xff0c;市场上迎来了华为鸿蒙系统4字开头的小升级&#xff0c;版本来到了4.2版本。 我们先来看看4.2版本都给用户带来哪些特色&#xff1a; 界面切换更流畅&#xff1a;无论是响应速度还是操作手感&#xff0c;用户都将感受到更加迅速和顺滑的体验 搜星速度的显著…

人类和小鼠转录组上游分析

基础软件 conda install cutadapt, trimmomatic, samtools, hisat2, subread, deeptools -y人类转录组上游分析 # 样本名称 sample_namesample# 线程 threads4# 双端测序原始fastq1和fastq2路径 fastq1_path/path/${sample_name}_1.fq.gz fastq2_path/path/${sample_name}_2.…

【LeetCode】【9】回文数(1047字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给一个整数x&#xff0c;如果x是一个回文整数&#xff0c;返回true&#xff1b;否…

CATIA二次开发VBA入门(2)——认识CATIA内置的VBA开发界面

目录 引出VBA界面介绍工具条介绍view下拉菜单insert下拉format下拉debug下拉tool下拉help下拉【重要】补充窗口窗体的模态【重要】 总结认识CATIA二次开发刘瑞欣 vb程序设计教程Excel中的vba开发catia中的vba开发 宏的录制、回放和编辑宏代码精简画圆柱阵列宏Macro文件的3种类型…

mysql内存和磁盘的关系

mysql内存和磁盘的关系 1.MySQL的内存和磁盘之间的关系是密切的。MySQL的数据存储在磁盘上&#xff0c;但为了高效地执行查询操作&#xff0c;它也会将数据页&#xff08;每个页通常为16KB&#xff09;读入内存。MySQL的缓冲池&#xff08;buffer pool&#xff09;是在内存中的…

数据通信基本概念汇总

1. 数据通信基础 网关: 提供协议转换&#xff0c;路由选择&#xff0c;数据交换的网络设备 报文: 网络中所传递的一个数据单元。 数据载荷: 最终要传递的信息 封装: 给数据载荷添加头部和尾部的过程(形成新的报文) 解封装: 给数据载荷去掉头部和尾部的过程(获取数据载荷) 终端设…

JAVA语言开发的一套云HIS医院管理系统源码 HIS源码 医院管理系统源码 HIS系统是否可以与LIS和RIS进行集成

系统概述 云HIS系统是一种基于云计算的医疗卫生信息系统&#xff0c;它运用云计算、大数据、物联网等新兴信息技术&#xff0c;按照现代医疗卫生管理要求&#xff0c;在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、处理的业务和技术平台。云HIS的主要功…

最简单的方式解决android studio 模拟器无法联网的问题

最简单的方式解决android studio 模拟器无法联网的问题 看了网上很多解决android studio内置模拟器无法联网的问题&#xff0c;基本上都是在模拟器手机上配置dns&#xff0c;个人试了多种办法也连不上网&#xff0c;现在给出一种&#xff0c;仅需要在命令行操作的解决安卓模拟…